Taka mała rada daj cały module system żeby ludzie mieli łatwiej z instalacją.A co gdyby ktoś chciał wykorzystać to do moda? W końcu taka jest istota OSP. To nie mod, tylko zrobione przez nas rzeczy, udostępniane z myślą o modderach. Co do samego skryptu: jeśli doda się inne "prace" (ale ja się tego nie podejmę :P), można stworzyć fajny role-playowy mod, zamiast standardowego, Native'owego przejmowania całego świata.
Taka mała rada daj cały module system żeby ludzie mieli łatwiej z instalacją.
A co gdyby ktoś chciał wykorzystać to do moda? W końcu taka jest istota OSP. To nie mod, tylko zrobione przez nas rzeczy, udostępniane z myślą o modderach. Co do samego skryptu: jeśli doda się inne "prace" (ale ja się tego nie podejmę :P), można stworzyć fajny role-playowy mod, zamiast standardowego, Native'owego przejmowania całego świata.
pilgrim_disguise = [itm_pilgrim_hood,itm_pilgrim_disguise,itm_practice_staff, itm_throwing_daggers]
af_castle_lord = af_override_horse | af_override_weapons| af_require_civilianA czy u Ciebie w tej modyfikacji jest taka opcja że jak w nocy się zauwarzy że okradają kogoś lub się włamują to mogło by dać potencjalną walkę z bandytami i ewentualnie poprawiać twoją opinię w danym mieście?To nie jest mod, tylko skrypt OSP, który może wykorzystać każdy robiący moda. A opcji walki z bandytami nie ma, wystarczy spojrzeć na kod. Przelatuje ci po prostu ten czas. No ale tak naprawdę to jest pomysł bardzo mało rozwinięty (chociaż jak widzisz "wydarzenia losowe" są przewidziane do dodania).
Wiem że długo nikt tu nie pisał, bo nie widzę sensu tworzenia nowego wątku w którym mam pytanie do tych skryptów. Czy jest możliwość bezpiecznej modyfikacji skryptu dodający rekrutanta w tawernach? Chodzi mi o to by zrobić tak ze jeden rekrutant zapewnia jeden lub kilka jednostek, a następny miałby coś innego do z rekrutowania.
Garedyr, kilka uwag:
1. Niepotrzebnie sprawdzasz atakującego. Wystarczy bowiem, aby atakujący zginął zaraz po strzale i już pocisku nie będzie się dało zablokować. Atakujący nie jest tu do niczego potrzebny, więc śmiało można go wywalić.
2. Zamiast z niepewnego reg0 lepiej po prostu skorzystać z parametru 4 (broń) lub 6 (pocisk) i tutaj sprawdzać typ przedmiotu.
3. Używanie połączenia "this_or_next" z "agent_set_animation" jest zupełnie bezcelowe, bo "agent_set_animation" to nie jest operacja warunkowa. W Twoim wypadku uruchomi się więc zawsze pierwsza linijka. Jeśli chcesz aby losowo odtwarzała się któraś z wybranych animacji (a podejrzewam, że taki był zamiar), to musisz to zrobić nieco inaczej. ;)
4. Dla bezpieczeństwa nie używałbym też (set_trigger_result, ":damage"), o ile nie modyfikujesz obrażeń poprzez skrypt. Używa się tej operacji tylko po to, by nadpisać domyślną wartość, a tutaj zostaje ona taka sama. Zatem zmienna ":damage" jest w tym skrypcie zupełnie niepotrzebna i śmiało obie linijki z nią możesz wywalić.
5. Do skryptu dodałbym jeszcze sprawdzanie pozycji, bo pewnie trochę to głupio wygląda, gdy ktoś dostaje w plecy, a mimo to odbija pocisk mieczem. ;)
[...]lepiej po prostu skorzystać z parametru 4 (broń) lub 6 (pocisk) i tutaj sprawdzać typ przedmiotu.[...]
ti_on_agent_hit = -28.0 #can only be used in module_mission_templates triggers
# Trigger Param 1: damage inflicted agent_id
# Trigger Param 2: damage dealer agent_id
# Trigger Param 3: inflicted damage
# Register 0: damage dealer item_id
# Position Register 0: position of the blow
# rotation gives the direction of the blow
# Trigger result: if returned result is greater than or equal to zero, inflicted damage is set to the value specified by the module.
ti_on_agent_hit = -28.0 #can only be used in module_mission_templates triggers
# Trigger Param 1: damage inflicted agent_id
# Trigger Param 2: damage dealer agent_id
# Trigger Param 3: inflicted damage
# Trigger Param 4: hit bone
# Trigger Param 5: missile item kind no
# Register 0: damage dealer item_id
# Position Register 0: position of the blow
# rotation gives the direction of the blow
# Trigger result: if returned result is greater than or equal to zero, inflicted damage is set to the value specified by the module.
Wraz z wydaniem VC doszło trochę zmian i trochę nowych operacji. Nie śledziłem angielskiego forum zbyt intensywnie przez ostatni rok, ale byłem pewien, że poinformowali ludzi o tych zmianach i nowych rzeczach. Widocznie to olali. :D
Jak będę miał chwilkę to zerknę do starego MS i porównam co dam doszło. Na razie łap ten trigger (jednak pomyliłem się z tym reg0 i parametrami 4 i 6, patrzyłem na trigger "ti_on_scene_prop_hit"):Kod: [Zaznacz]ti_on_agent_hit = -28.0 #can only be used in module_mission_templates triggers
# Trigger Param 1: damage inflicted agent_id
# Trigger Param 2: damage dealer agent_id
# Trigger Param 3: inflicted damage
# Trigger Param 4: hit bone
# Trigger Param 5: missile item kind no
# Register 0: damage dealer item_id
# Position Register 0: position of the blow
# rotation gives the direction of the blow
# Trigger result: if returned result is greater than or equal to zero, inflicted damage is set to the value specified by the module.
#Human bones
hb_abdomen = 0
hb_thigh_l = 1
hb_calf_l = 2
hb_foot_l = 3
hb_thigh_r = 4
hb_calf_r = 5
hb_foot_r = 6
hb_spine = 7
hb_thorax = 8
hb_head = 9
hb_shoulder_l = 10
hb_upperarm_l = 11
hb_forearm_l = 12
hb_hand_l = 13
hb_item_l = 14
hb_shoulder_r = 15
hb_upperarm_r = 16
hb_forearm_r = 17
hb_hand_r = 18
hb_item_r = 19
#Horse bones
hrsb_pelvis = 0
hrsb_spine_1 = 1
hrsb_spine_2 = 2
hrsb_spine_3 = 3
hrsb_neck_1 = 4
hrsb_neck_2 = 5
hrsb_neck_3 = 6
hrsb_head = 7
hrsb_l_clavicle = 8
hrsb_l_upper_arm = 9
hrsb_l_forearm = 10
hrsb_l_hand = 11
hrsb_l_front_hoof = 12
hrsb_r_clavicle = 13
hrsb_r_upper_arm = 14
hrsb_r_forearm = 15
hrsb_r_hand = 16
hrsb_r_front_hoof = 17
hrsb_l_thigh = 18
hrsb_l_calf = 19
hrsb_l_foot = 20
hrsb_l_back_hoof = 21
hrsb_r_thigh = 22
hrsb_r_calf = 23
hrsb_r_foot = 24
hrsb_r_back_hoof = 25
hrsb_tail_1 = 26
hrsb_tail_2 = 27
Nagrody za dołączenie do frakcji (jak w Nowej Ojczyźnie) napisany przeze mnie
(troop_add_item, "trp_player", "itm_sword_viking_1", 0),
["hunting_crossbow", "Hunting Crossbow", [("crossbow_a",0)], itp_type_crossbow |itp_merchandise|itp_primary|itp_two_handed ,itcf_shoot_crossbow|itcf_carry_crossbow_back,22 , weight(2.25)|difficulty(0)|spd_rtng(47) | shoot_speed(50) | thrust_damage(37 , pierce)|max_ammo(1),imodbits_crossbow ],
["special_crossbow", "Special Crossbow", [("crossbow_a",0)], itp_type_crossbow |itp_merchandise|itp_primary|itp_two_handed ,itcf_shoot_crossbow|itcf_carry_crossbow_back,22 , weight(2.25)|difficulty(0)|spd_rtng(47) | shoot_speed(50) | thrust_damage(37 , pierce)|max_ammo(1),imodbits_crossbow ],
(eq, ":fac", "fac_kingdom_2"),
(troop_add_item, "trp_player", "special_crossbow", 0),
(try_end),
ERROR: unrecognized tag:specialin object: special_crossbow
ERROR: illegal identifier:special crossbow
[(assign, "$temp", "itm_ludzkie_mieso"),
(try_begin),
(troop_remove_item,"trp_player","itm_ludzkie_mieso"),
(troop_add_item,"trp_player","itm_pieczone_ludzkie_mieso"),
(display_message,"@You roasted some human flesh on fire.", 0x00FF00),
(rest_for_hours, 3, 5, 1),
[(assign, "$temp", "itm_ludzkie_mieso"),
(try_begin),
(call_script, "script_change_troop_renown", "trp_player", 2),
(add_xp_to_troop, 250, "trp_player"),
(assign, reg7, "$player_honor"),
(val_add, reg7, -1),
(display_message, "@Player honor is decreased by 1 and it is now {reg7}."),
(val_add, "$player_honor", 1),
(troop_remove_item,"trp_player","itm_ludzkie_mieso"),
(troop_add_item,"trp_player","itm_pieczone_ludzkie_mieso"),
(display_message,"@You roasted some human flesh on fire. This horrific action decreased your honour by 1 point, increased renown by 2 and made you more experienced (+250 exp).", 0x00FF00),
(rest_for_hours, 3, 5, 1),
(store_random_in_range,reg1,0,5),
(store_random_in_range,reg2,0,5),
(store_random_in_range,reg3,0,5),
(store_random_in_range,reg4,0,5),
(store_random_in_range,reg5,0,5),
(store_random_in_range,reg6,0,5),
(store_random_in_range,reg7,0,5),
(store_random_in_range,reg8,0,5),
(store_random_in_range,reg9,0,5),
(store_random_in_range,reg10,0,5),
(store_random_in_range,reg11,0,5),
(store_random_in_range,reg12,0,5),
(display_message,"@ {reg1} {reg2} {reg3} {reg4} {reg5} {reg6} {reg7} {reg8} {reg9} {reg10} {reg11} {reg12}"),
(store_random_in_range,reg1,10,50),
[anyone|plyr,"prisoner_chat_6", [], "Hey, team, we have a lot of good meet here. Go get me a knife for filleting!", "close_window",[(troop_add_item, "trp_player", "itm_ludzkie_mieso", 0),(store_conversation_troop,reg(1)), (remove_troops_from_prisoners,reg(1),1),]],
[anyone,"prisoner_chat_7", [], "Thank you! This is all I have, please take it and let the gods be with you!", "close_window",[(store_random_in_range,din1,10,50),(call_script, "script_troop_add_gold", "trp_player", {din1}),(store_conversation_troop,reg(1)), (remove_troops_from_prisoners,reg(1),1),]],
[anyone|plyr,"prisoner_chat_8", [], "You have to die", "close_window",[(add_xp_to_troop, 250, "trp_player"),(store_conversation_troop,reg(1)), (remove_troops_from_prisoners,reg(1),1),]],
Także moją wersję zapisałem pod zmienną din1 i moja linijka wygląda tak:
[anyone,"prisoner_chat_7", [], "Thank you! This is all I have, please take it and let the gods be with you!", "close_window",[(store_random_in_range,din1,10,50),(call_script, "script_troop_add_gold", "trp_player", {din1}),(store_conversation_troop,reg(1)), (remove_troops_from_prisoners,reg(1),1),]],
":zmienna""$zmienna"reg1":din1"czyli została w niej wykorzystana zmienna(?) reg(1) - nie wiem, czy ta sama, czy nie co w losowaniu.
[anyone,"prisoner_chat_7", [], "Thank you! This is all I have, please take it and let the gods be with you!", "close_window",[(store_random_in_range, ":din1", 10, 50),(troop_add_gold, "trp_player", ":din1"),(store_conversation_troop, ":jednostka"), (remove_troops_from_prisoners, ":jednostka", 1)]],
(store_random_in_range,reg1,0,5),
(store_random_in_range,reg2,0,5),
(store_random_in_range,reg3,0,5),
(store_random_in_range,reg4,0,5),
(store_random_in_range,reg5,0,5),
(store_random_in_range,reg6,0,5),
(store_random_in_range,reg7,0,5),
(store_random_in_range,reg8,0,5),
(store_random_in_range,reg9,0,5),
(store_random_in_range,reg10,0,5),
(store_random_in_range,reg11,0,5),
(store_random_in_range,reg12,0,5),
(display_message,"@ {reg1} {reg2} {reg3} {reg4} {reg5} {reg6} {reg7} {reg8} {reg9} {reg10} {reg11} {reg12}"),
[anyone,"prisoner_chat_7", [], "Thank you! This is all I have, please take it and let the gods be with you!", "close_window",[(store_random_in_range, ":din1", 10, 50),(troop_add_gold, "trp_player", ":din1"),(store_conversation_troop, ":jednostka"), (remove_troops_from_prisoners, ":jednostka", 1)]],
(assign, reg4, ":jednostka",),
(display_message, "@{!}Gained freedom: {reg4}"),
Jednak w ich przypadku nie ma alternatywy w postaci nazywanych zmiennych co może powodować wiele bugów.- Chodzi o to, że zamiast rejestru reg mogę używać zmiennych lokalnych, czyli np. ":jednostka", ale w wypadku rejestrów str0, str1 itd nie ma takiej opcji?
(store_conversation_troop, ":jednostka"),
(assign, reg4, ":jednostka",),
(display_message, "@{!}Gained freedom: {reg4}"),W zmiennej ":jednostka" przechowana zostaje zmienna liczbowa. Ta sama zmienna zostaje przekazana potem do rejestru nr 4 i podstawiona pod napis. Otrzymałeś całkowicie poprawną informacje o wypuszczeniu więźnia o jednostce 113. Każda jednostka, przedmiot, scene_prop itd ma swój własny numer indeksu. Zaczynają się one od zera i zwiększają się o jeden. W warbandzie pierwszą jednostką jest trp_player(jednostka gracza) i ma numer 0, następnie znajduje się tam trp_multiplayer_profile_troop_male o numerze indeksu 1 itd. Aż do 113 który jest przyporządkowany do trp_looter. Wszystkie przypisania możesz sprawdzić w ID_troops.py, plik ten generuje się automatycznie przy buildowaniu moda.(str_store_troop_name, <string_register>, <troop_id>),Jako pierwszy argument podajesz rejestr napisów(np s12) a jako drugi zmienną(lub rejestr liczbowy) zawierającą indeks jednostki. Następnie wynik możesz wyświetlić jako:(display_message, "@{!}Gained freedom: {s12}"),Nie wiem, czy dobrze rozumiem Twoje ostatnie zdanie Mat Berseker, - Chodzi o to, że zamiast rejestru reg mogę używać zmiennych lokalnych, czyli np. ":jednostka", ale w wypadku rejestrów str0, str1 itd nie ma takiej opcji?Dokładnie.
(play_sound,"snd_fire_baking", 0),
("fire_baking", sf_2d|sf_priority_9|sf_vol_12, ["Fire_Torch_Loop3.ogg"]),czyli odgłos palącej się pochodni, który udaje płonące ognisko.
Kiedy możemy się spodziewać zaktualizowanego skryptu na bank (przynajmniej na TW, bo tutaj go chyba w ogóle nie ma)?
Ponieważ uważam opcję pożyczki za zbyt łatwą drogę do bogactwa i nie potrafię wymyślić odpowiednich konsekwencji dla gracza po niespłaceniu jej, w obecnej wersji zabrakło tej opcji.
Jeśli jednak masz jakiś dobry pomysł i pragniesz się nim podzielić, to zapraszam. Jestem otwarty na sugestie.
Widzę, że ten temat jest nie tylko do publikacji Twoich materiałów ale również luźnych dywagacji, także piszę tutaj.
Nie wiem jak to jest możliwe do wykonania ze strony praktycznej (możliwości silnika), ale może wykonaj kilka "faz odzyskiwania wierzytelności".
Załóżmy w pierwszej, już po kilku tygodniach "zwłoki z oddaniem długu", podbija do nas smutny Pan (np kilkunastoosobowy oddział, z dużym speedem tak, że nas zawsze dogoni), który żąda takowego zwrotu - każe Ci jechać do miasta X [w którym były pożyczone pieniądze] i oddać należność wraz z odsetkami. Masz do wyboru albo "zgłoszenie chęci udania się do miasta", albo "spuszczenie wpierniczu smutnemu Panu", po czym następuje walka z jego oddziałem [tylko trochę dziwne by było, gdyby to miało charakter normalnej bitwy - no bo co, wszyscy rozeszli by się w pokoju i honorowo ustawili na polu po czym dali znak do gotowości do walki, wtf?], np w zrobionej scence obozu czy innego miejsca postoju Twoich wojsk.
Przy czym w zależności od wyboru w/w drogi [i w sumie wyniku ewentualnej walki], następuje kolejna faza [przy pierwszym wyborze po tygodniu, dwóch - przy drugim po kilku dniach, gdyż jego kumple skapnęli się, że "smutny Pan" nie wrócił do miasta], gdzie przybywa do nas już dużo liczniejszy oddział, i tutaj walka będzie miała miejsce na normalnych warunkach bitwy. Przy czym oczywiście można ustalić zasięg działania takich "Panów do odzyskiwania wierzytelności", tylko w określonej okolicy konkretnego miasta.
Jednocześnie, załóżmy, można ustalić tego Pana bankiera jako NPC i przy spłatach długów rosną z Nim stosunki, które pozwalają na kolejne kredyty na lepszych warunkach, a ujemne nie pozwalają na takie kroki. Ew "połączyć" Pana bankiera (który za pewne ma duże wpływy w mieści) ze szlachcicem władającym miastem, bądź samym miastem [w m&b w osobie mistrza gildii, co za pewne wiesz] i wtedy bylibyśmy "spaleni" w danym mieście, bądź nielubiani po prostu przez tego szlachcica.
No i można tutaj dać trzecią fazę "niespłacania długu", który zmuszałby owego szlachcica władającego miastem do ścigania nas [również w jakimś sensownym obszarze, nie całej Calradii] i wydania nam bitwy.
Szczerze mówiąc, tak bym to widział, by było w miarę zgodne z ówczesnymi realiami :)
Dziękuję za opinię. Z pewnością wezmę ją pod uwagę podczas dodawania nowych opcji do skryptu.
Miej jednak na uwadze pewną rzecz - nie ma 'konkretnego miasta'. Jest to sieć bankowa działająca na terenie całej Calradii. Jeśli jednak tawerniani bywalcy uznają, że każde miasto powinno posiadać skarbiec bankowy oddzielny od pozostałych, to oczywiście sprawię, iż będą usatysfakcjonowani.
Co do bycia spalonym w danym mieście - co konkretnie przez to rozumiesz? Duży spadek relacji z miastem (np -20) nie byłby wystarczającą 'karą'.