Модификации игры

Делаем чтобы можно было хранить лут в контейнерах

Для начала надо определиться с тем какие обьекты являются контейнерами - и в них можно(логично) что-то спрятать - всевозможные ящики, шкафы, камоды.

Я сделал тестовую карту для этого - чтобы просто показать эти предметы, в которые можно сложить свой лут:

Скриншот контейнеров

 Если добавлять в них случайный предмет, то ковыряться в мусоре станет куда интереснее. Пока эксперементирую с шансами и предметами.

Буду рад выслушать коструктивные предложения.

Вот их список и функция по назначению скриптовыми:

 

picklocks = [ "SET_BASIC_PICKLOCK", "SET_VAMPED_PICKLOCK_SET", "SET_SET_OF_PICKLOCKS", "SET_SPECIAL_PICKLOCK" ]
Loot_crates=['RES3D_HOLZKISTE', 'RES3D_TRES_OBJECTS_BUILDING_HOLZKISTE', 
                                'RES3D_TRES_OBJECTS_BUILDING_KISTE', 'RES3D_TRES_OBJECTS_BUILDING_KISTEHAUFEN',
                                'RES3D_TRES_OBJECTS_BUILDING_METALLKISTE', 'RES3D_TRES_OBJECTS_BUILDING_AMMOBOX_1',
                                'RES3D_TRES_OBJECTS_BUILDING_AMMOBOX_2', 'RES3D_TRES_OBJECTS_BUILDING_AMMOBOX_3',
                                'RES3D_TRES_OBJECTS_BUILDING_AMMOBOX_4', 'RES3D_HOLZKISTENSTAPEL',
                                'RES3D_TRES_OBJECTS_BUILDING_HOLZKISTENSTAPEL', 'RES3D_TRES_OBJECTS_BUILDING_METALLKISTENSTAPEL',
                                'RES3D_MUELLTONNE', 'RES3D_FASS', 'RES3D_TRES_OBJECTS_BUILDING_FASS_1',
                                'RES3D_TRES_OBJECTS_BUILDING_WOODBARREL_1', 'RES3D_TRES_OBJECTS_BUILDING_FASS_2',
                                'RES3D_TRES_OBJECTS_BUILDING_WOODBARREL_2', 'RES3D_FASS_LIEGEND',
                                'RES3D_TRES_OBJECTS_BUILDING_FASS_4','RES3D_TRES_OBJECTS_BUILDING_TRUHEMITSCHLOSS_ANIMATE',
                                'RES3D_TRES_OBJECTS_BUILDING_STABILEHOLZKISTEMITSCHLOSS_ANIMATE',
                                'RES3D_TRES_OBJECTS_BUILDING_GROSSEMETALLKISTEMITSCHLOSS_ANIMATE',
                                'RES3D_TRES_OBJECTS_BUILDING_FELDKISTEMITSCHLOSS_ANIMATE',
                                'RES3D_TRES_OBJECTS_BUILDING_BUNKER_KISTE_01', 'RES3D_TRES_OBJECTS_BUILDING_HOLZKOMMODE2BUCHE',
                                'RES3D_TRES_OBJECTS_BUILDING_HOLZKOMMODE3EICHE', 'RES3D_TRES_OBJECTS_BUILDING_HOLZKOMMODE1AHORN',
                                'RES3D_TRESOR_01', 'RES3D_TRESOR_02', 'RES3D_TRESOR_03', 'RES3D_TRESOR_04', 'RES3D_TRES_OBJECTS_BUILDING_ANBAUWAND1TEIL2',
                                'RES3D_TRES_OBJECTS_BUILDING_ANBAUWAND1TEIL4', 'RES3D_TRES_OBJECTS_BUILDING_ANBAUWAND1TEIL1',
                                'RES3D_TRES_OBJECTS_BUILDING_REFRIGERATOR', 'RES3D_TRES_OBJECTS_BUILDING_BUNKER_SPINT',
                                'RES3D_TRES_OBJECTS_BUILDING_WERKBANK', 'RES3D_TRES_OBJECTS_BUILDING_SPUELE',
                                'RES3D_TRES_OBJECTS_BUILDING_STAHLREGAL01', 'RES3D_TRES_OBJECTS_BUILDING_STAHLREGAL02',
                                'RES3D_TRES_OBJECTS_BUILDING_STAHLREGAL03', 'RES3D_TRES_OBJECTS_BUILDING_STAHLREGAL',
                                'RES3D_TRES_OBJECTS_BUILDING_SPIND', 'RES3D_TRES_OBJECTS_BUILDING_SPINDE_GEKIPPT',
                                'RES3D_TRES_OBJECTS_BUILDING_AKTENSCHRANK', 'RES3D_TRES_OBJECTS_BUILDING_ANBAUWAND2TEIL2',
                                'RES3D_TRES_OBJECTS_BUILDING_ANBAUWAND2TEIL3', 'RES3D_TRES_OBJECTS_BUILDING_ANBAUWAND2TEIL4',
                                'RES3D_TRES_OBJECTS_BUILDING_ANBAUWAND2TEIL5', 'RES3D_TRES_OBJECTS_BUILDING_ANBAUWAND2TEIL1',
                                'RES3D_TRES_OBJECTS_BUILDING_ANBAUWAND3TEIL2', 'RES3D_TRES_OBJECTS_BUILDING_ANBAUWAND3TEIL3',
                                'RES3D_TRES_OBJECTS_BUILDING_ANBAUWAND3TEIL4', 'RES3D_TRES_OBJECTS_BUILDING_ANBAUWAND3TEIL5',
                                'RES3D_TRES_OBJECTS_BUILDING_ANBAUWAND3TEIL1', 'RES3D_TRES_OBJECTS_BUILDING_REFRIGERATOR2',
                                'RES3D_MUELLCONTAINER', 'RES3D_MUELLCONTAINER_2', 'RES3D_ELEKTROKASTEN', 'RES3D_TRES_OBJECTS_BUILDING_BUNKER_KISTE_02',
                                'RES3D_TRES_OBJECTS_BUILDING_BUNKER_KISTE_03', 'RES3D_TRES_OBJECTS_BUILDING_BUNKER_KISTE_04',
                                'RES3D_TRES_OBJECTS_BUILDING_ANBAUWAND1TEIL4U5_GEKIPPT', 'RES3D_TRES_OBJECTS_BUILDING_ANBAUWAND1TEIL1_GEKIPPT',
                                'RES3D_TRES_OBJECTS_BUILDING_ANBAUWAND1TEIL2_GEKIPPT', 'RES3D_TRES_OBJECTS_BUILDING_ANBAUWAND1TEIL3_GEKIPPT',
                                'RES3D_TRES_OBJECTS_BUILDING_KISTE_OFFEN', 'RES3D_TRES_OBJECTS_BUILDING_KISTE_KAPUTT', 'RES3D_FASS_KAPUTT',
                                'RES3D_TRES_OBJECTS_BUILDING_WOODBARREL_3', 'RES3D_TRES_OBJECTS_BUILDING_FASS_3']
refill_interval = timerepr.time( "24:00:00" )
refill_chance  = 60

def fill_loot_crate(object_id):
        inventorylist = objects.get_inventory_list(object_id)
        typeID = objects.get_attribute(object_id,"typeid")
        if (not inventorylist or inventorylist == []) and refill_chance > random.randint(1,100):
                objects.create_item_in_inventory(object_id, get_random_item_2())
                objects.set_attribute( object_id, "is_examined", False )
                if 'AMMOBOX' in typeID:
                        objects.create_item_in_inventory(object_id, [get_random_ammo() for x in range(5)])
                if 'TRESOR' in typeID or 'ANIMATE' in typeID:
                        objects.create_item_in_inventory(object_id, [get_random_ammo() for x in range(10)]+[random.choice(picklocks)])
                        objects.add_closed_lock(object_id, "lock1", closure_type=random.choice(['normal','lock-trap','booby-trap','poison-trap']))

def set_loot_crates():
        if not hasattr (data(), "fill_time"):
                data().fill_time = system.get_mission_time()
        for object_id in system.get_objects():
                if objects.has_attribute(object_id,"typeid") and objects.get_attribute(object_id,"typeid") in Loot_crates:
                        system.mark_for_script_use(object_id)
                        objects.set_attribute(object_id, "lootcrate", True)
                        fill_loot_crate(object_id)

def refill_loot_crates():
        if hasattr (data(), "fill_time") and system.get_mission_time()-data().fill_time > refill_interval:
                for object_id in system.get_objects():
                        if objects.has_attribute(object_id,"typeid") and objects.get_attribute(object_id,"typeid") in Loot_crates:
                                fill_loot_crate(object_id)
                data().fill_time = system.get_mission_time()

Чтобы это работало вызов функции set_loot_crates должен быть сделан из функции on_map_loaded - иначе обьекты не назначаются скриптовыми и в них ничего нельзя положить. refill_loot_crates - вызывается в фонкции on_map_reentry - или в каждой зоне или в system_events.py

предметы берутся из того списка что и для краж, в rt_mod есть расширенный список, но скорее всего я сделаю свой список, но позже.

шанс добавления какого либо предмета - сделал 60%, если больше - будет слишком жирно. Предметы добавятся случайно при входе в локацию если там ничего нет, повторное добавление через перезаход после 24ч.

В сейфы и оружейные ящики - добавляем патронов, и сейфы с ящиками снова на замок.

 

Также надо чтобы был обработчик перетаскиваний предметов:

он почти не зависит от кода выше, просто предметы кладутся только в те ящики где уже что-то лежало.

 где-то в теле фунции def on_use( character_id, object_id, item_id, item_type ): 

        if (object_id != None) and ( item_id != None ) and not is_locked_object(object_id) and(objects.has_attribute(object_id, "lootcrate") or objects.can_transfer_item(object_id, item_id)):
                objects.transfer_item(character_id,item_id,object_id)
                objects.set_attribute( object_id, "is_examined", True )
                return True
        

 У себя сделал вызов set_loot_crates из всех zone_X.py потому что из system_events.py работать не стало, хотя там тоже on_map_loaded и глобальный.

Купля продажа игровых машин у торговцев

В продолжение модинга - посетила идея чтобы тачки продавались у торговцев. Для теста у себя сделал дополнительный предмет - ключ от машины, аналог красного ключа "SET_RED_KEY". Каждому торговцу при очередном обновлении товаров - появляется машина, а в продаже ключ. Купил ключ - можно залезть в машину и ехать. Возможно сделать у каждого торговца парковочное место для машины - обновлять машину при следующем перезаходе на карту. Для тех машин что по сюжету возможно тоже сделать ключи - и положить их в саму машину или спрятать где нибудь.

Пока продумываю как лучше проще и удобнее это реализовать - сделать чтобы старые машины удалялись у торговцев, а в замен них спавнились новые.

 

NeiroN 16.09.2018 | Комментарии (3)













Разработка Sergey A.Zhukov 2007-2012