Closed FakelsHub closed 5 years ago
А что за ошибка, есть ссылка?
Долго и нудно писать. https://github.com/phobos2077/sfall/issues/67 У тебя ведь просто в прошке молотова меняется тип дамага на fire, при этом же пропадает эффект врыва - те молотов получается как метательный предмет который можно потом подобрать :-) В общем скрипт нужен, для того чтобы все это исправить. зайди на nuclear-city я тебе там написал где взять скрипт.
Потестировал. Да, плохо получается. Sfall неохота апдейтить, но видимо ничего не поделаешь. Скоро займусь.
Какие там нужны инклюды? Что-то у меня не компилируется с "Undefined symbol hit_hook in factor"
А Готовый .int что нельзя использовать?) Компилятор какой?
int не вижу. Можно использовать, но хотелось бы скомпилировать. Это compile.exe из modderspack 3.8.3
Я что забыл его туда положить) Нужны инклюды сфалла и ну стандартные define.h command.h у меня сфаловские инклюды в стандартном define.h прописаны
А все разобрался, procedure start нужно было вниз убрать, после объявления хуков. Выпустил v7, спасибо за помощь.
А для каких целей ты убрал из скрипта проверку на dude, и захардкодил указатель на dude_obj?. что-то не могу понять этот скрипт рассчитан, что и криттеры метнувшие молов при промахе, молотов будет наносить урон огнем.
hslot:=active_hand;
if hslot == 0 then hslot:=2;
item:=obj_pid(critter_inven_obj(dude_obj, hslot));
active_hand - возвращает активный слот только для dude (0 - left slot / 1 - right slot) для криттеров активный слот всегда равен INVEN_TYPE_RIGHT_HAND (1)
было так если что
if CritterAttack == dude_obj then begin
hand_slot := active_hand;
if hand_slot == 0 then hand_slot := 2; // INVEN_TYPE_LEFT_HAND
item := critter_inven_obj(CritterAttack, hand_slot);
end
else item := critter_inven_obj(CritterAttack, INVEN_TYPE_RIGHT_HAND);
_Кстати если включить мод на управления напарниками то вообще не понятная ситуация получиться, какой указатель будет у CritterAttack == dudeobj ? нужно тестировать, и допиливать если что-то будет не так. Но это у же проблема тех кто использует этот мод, так как я не признаю этот мод), и тестировать это не хочу.
item:=obj_pid(critter_inven_obj(dude_obj, hslot));
temp:=obj_pid(weapon_obj_used);
А перед такими вещами нужно делать проверку на if weapon_obj_used > 0
иначе некритической ошибкой будет спамиться в логе отладки. (тоже зачем то эти проверки убрал)
да так-то ничего не убирал, скрипт точно такой как в https://github.com/phobos2077/sfall/issues/67 запощен.
А так ты тестовый скрипт взял, то-то я исмотрю какой то он не такой) Ладно позже нормальный тебе вышлю.
В общем вот скопировал скрипт. Скомпилировать желательно с опцией -s компилятора!!!
/* Include Files */
#include "..\headers\define.h"
#include "..\headers\command.h"
/* Standard Script Procedures */
procedure start;
procedure Hit_Hook;
procedure Damage_Hook;
procedure Set_AttackFire;
procedure start begin
if game_loaded then begin
register_hook_proc(HOOK_AFTERHITROLL, Hit_Hook);
register_hook_proc(HOOK_ITEMDAMAGE, Damage_Hook);
end
end
procedure Hit_Hook begin
/*
Runs after fallout has decided if an attack will hit or miss
int arg1 - If the attack will hit. (0 - critical miss, 1 - miss, 2 - hit, 3 - critical hit)
critter arg2 - The attacker
critter arg3 - The target of the attack
*/
variable TypeHit, CritterAttack, CritterTarget;
variable hand_slot, item;
TypeHit := get_sfall_arg;
CritterAttack := get_sfall_arg;
CritterTarget := get_sfall_arg;
if (CritterTarget and CritterAttack) then begin
if ((obj_type(CritterTarget) == 1) and (TypeHit <= 1))
or ((obj_type(CritterTarget) == 2) and TypeHit) then begin // miss hit
if CritterAttack == dude_obj then begin
hand_slot := active_hand;
if hand_slot == 0 then hand_slot := INVEN_TYPE_LEFT_HAND;
item := critter_inven_obj(CritterAttack, hand_slot);
end
else item := critter_inven_obj(CritterAttack, INVEN_TYPE_RIGHT_HAND);
if item > 0 and obj_pid(item) == PID_MOLOTOV_COCKTAIL then begin
call Set_AttackFire;
end
end
end
end
procedure Damage_Hook begin
/*
Runs when retriving the damage rating of the players used weapon. (Which may be their fists.)
int arg1 - The default min damage
int arg2 - The default max damage
Item arg3 - The weapin used. (0 if unarmed)
*/
variable weapon_obj_used;
global_temp := get_sfall_arg;
global_temp := get_sfall_arg;
weapon_obj_used := get_sfall_arg;
if weapon_obj_used > 0 and (obj_pid(weapon_obj_used) == PID_MOLOTOV_COCKTAIL)
and obj_item_subtype(weapon_obj_used) == item_type_weapon then begin
call Set_AttackFire;
end
end
procedure Set_AttackFire begin
if (get_proto_data(PID_MOLOTOV_COCKTAIL, PROTO_WP_DMG_TYPE) == DMG_fire) then begin
set_attack_explosion_pattern(1, 0);
set_attack_is_explosion_fire;
debug_msg("Molotov: Set attack is explosion fire.");
end
end
Спасибо. Попробую и в следующую версию включу.
@FakelsHub а зачем ты тут сделал 2 хука? Разве одного недостаточно? И зачем TypeHit проверять?
думаешь я помню зачем нужно было проверять TypeHit, если поставил значит для чего-то нужно))
А все понял Hit_Hook нужен если будет промах, то это также сделает set_attack_is_explosion_fire; иначе при промахе будет обычный дамаг.
Тогда почему не использовать только его? Или он тоже не всегда применяется? Судя по документам, вроде всегда.
Я уже как-то задавался вопросом зачем я тут сделал два хука, попробовал отключить Damage_Hook и при тестах не помню, что конкретно но что-то не работало, что-то связанное с AI. Попробуй отключить и подправить условие в Hit_Hook и проверь что измениться, если не в лом.
ага
У тебя к моду молотову не хватает еще доп. скрипта, без которого по сути молотов не будет правильно работать.