Делаем чтобы можно было хранить лут в контейнерах
Для начала надо определиться с тем какие обьекты являются контейнерами - и в них можно(логично) что-то спрятать - всевозможные ящики, шкафы, камоды.
Я сделал тестовую карту для этого - чтобы просто показать эти предметы, в которые можно сложить свой лут:
Если добавлять в них случайный предмет, то ковыряться в мусоре станет куда интереснее. Пока эксперементирую с шансами и предметами.
Буду рад выслушать коструктивные предложения.
Вот их список и функция по назначению скриптовыми:
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". Каждому торговцу при очередном обновлении товаров - появляется машина, а в продаже ключ. Купил ключ - можно залезть в машину и ехать. Возможно сделать у каждого торговца парковочное место для машины - обновлять машину при следующем перезаходе на карту. Для тех машин что по сюжету возможно тоже сделать ключи - и положить их в саму машину или спрятать где нибудь.
Пока продумываю как лучше проще и удобнее это реализовать - сделать чтобы старые машины удалялись у торговцев, а в замен них спавнились новые.