BGforgeNet / FO2tweaks

Fallout 2 tweaks
https://forums.bgforge.net/viewforum.php?f=26
122 stars 11 forks source link

Molotov #1

Closed FakelsHub closed 5 years ago

FakelsHub commented 7 years ago

У тебя к моду молотову не хватает еще доп. скрипта, без которого по сути молотов не будет правильно работать.

burner1024 commented 7 years ago

А что за ошибка, есть ссылка?

FakelsHub commented 7 years ago

Долго и нудно писать. https://github.com/phobos2077/sfall/issues/67 У тебя ведь просто в прошке молотова меняется тип дамага на fire, при этом же пропадает эффект врыва - те молотов получается как метательный предмет который можно потом подобрать :-) В общем скрипт нужен, для того чтобы все это исправить. зайди на nuclear-city я тебе там написал где взять скрипт.

burner1024 commented 7 years ago

Потестировал. Да, плохо получается. Sfall неохота апдейтить, но видимо ничего не поделаешь. Скоро займусь.

burner1024 commented 7 years ago

Какие там нужны инклюды? Что-то у меня не компилируется с "Undefined symbol hit_hook in factor"

FakelsHub commented 7 years ago

А Готовый .int что нельзя использовать?) Компилятор какой?

burner1024 commented 7 years ago

int не вижу. Можно использовать, но хотелось бы скомпилировать. Это compile.exe из modderspack 3.8.3

FakelsHub commented 7 years ago

Я что забыл его туда положить) Нужны инклюды сфалла и ну стандартные define.h command.h у меня сфаловские инклюды в стандартном define.h прописаны

burner1024 commented 7 years ago

А все разобрался, procedure start нужно было вниз убрать, после объявления хуков. Выпустил v7, спасибо за помощь.

FakelsHub commented 7 years ago

А для каких целей ты убрал из скрипта проверку на 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 ? нужно тестировать, и допиливать если что-то будет не так. Но это у же проблема тех кто использует этот мод, так как я не признаю этот мод), и тестировать это не хочу.

FakelsHub commented 7 years ago

item:=obj_pid(critter_inven_obj(dude_obj, hslot)); temp:=obj_pid(weapon_obj_used); А перед такими вещами нужно делать проверку на if weapon_obj_used > 0 иначе некритической ошибкой будет спамиться в логе отладки. (тоже зачем то эти проверки убрал)

FakelsHub commented 7 years ago

И еще нужна доработка условия if ((obj_type(CritterTarget) == 1) and (TypeHit <= 1)) or ((obj_type(CritterTarget) == 2) and TypeHit) then begin // miss hit

burner1024 commented 7 years ago

да так-то ничего не убирал, скрипт точно такой как в https://github.com/phobos2077/sfall/issues/67 запощен.

FakelsHub commented 7 years ago

А так ты тестовый скрипт взял, то-то я исмотрю какой то он не такой) Ладно позже нормальный тебе вышлю.

FakelsHub commented 7 years ago

В общем вот скопировал скрипт. Скомпилировать желательно с опцией -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
burner1024 commented 7 years ago

Спасибо. Попробую и в следующую версию включу.

burner1024 commented 5 years ago

@FakelsHub а зачем ты тут сделал 2 хука? Разве одного недостаточно? И зачем TypeHit проверять?

FakelsHub commented 5 years ago

думаешь я помню зачем нужно было проверять TypeHit, если поставил значит для чего-то нужно))

FakelsHub commented 5 years ago

А все понял Hit_Hook нужен если будет промах, то это также сделает set_attack_is_explosion_fire; иначе при промахе будет обычный дамаг.

burner1024 commented 5 years ago

Тогда почему не использовать только его? Или он тоже не всегда применяется? Судя по документам, вроде всегда.

FakelsHub commented 5 years ago

Я уже как-то задавался вопросом зачем я тут сделал два хука, попробовал отключить Damage_Hook и при тестах не помню, что конкретно но что-то не работало, что-то связанное с AI. Попробуй отключить и подправить условие в Hit_Hook и проверь что измениться, если не в лом.

burner1024 commented 5 years ago

ага