[DEFNAME battlesystem_defs] bts_weapon_parry_chance 10 //% bts_weapon_absorb_chance 5 //% [TYPEDEF t_status] on=@DCLICK Link= timerd 2 return 1 on=@Timer if (!=) tag0.hits= say @1001,0,1 endif timerd 2 return 1 [EVENTS e_battlesystem] on=@PersonalSpace ARGN1=*5)/(+((*3)/2)))+1> IF (>) return 1 ENDIF on=@Death FORCONTTYPE T_SPELL 0 remove ENDFOR IF () flags=|statf_onhorse //Фикс для прилипающей хорсы ENDIF FORCHARMEMORYTYPE MEMORY_FIGHT //Фикс для @kill COLOR |= ENDFOR forchars 12 if () trigger @SeeDeath endif endfor on=@Kill if () trysrc uid..findlayer.1.trigger @KillEnemy elif () trysrc uid..findlayer.2.trigger @KillEnemy endif return 0 on=@DeathCorpse try uid..tag.resources= //Lootable AI if (!) newitem im_corpse_looting_timer new.link = new.p = new.timer = 1 endif local.corpse= if () forcont 1 cont = endfor endif on=@DCLICK IF ((==) && ()) flags=|statf_onhorse ENDIF on=@UserWarmode IF () FORCHARMEMORYTYPE MEMORY_WAR_TARG REMOVE ENDFOR ENDIF on=@HitTry src.allperks_disable //if () // tag0.weap_perk=> // tag0.e_weap_perk=> //else // tag0.weap_perk= // tag0.e_weap_perk= //endif ACTDIFF=0 serv.log **** Swing Start **** serv.log Weapon Speed = if () //Для оружия tag.hit_skill= //** TEMPORARY! if (==-1) add_error_log Invalid SKILL: : : tag.hit_skill=Tactics endif //**// tag.hit_dam= argn1=/2) + (( (10000*)/2) / (*((<>/20)+500))))> //+++ else //Для кулаков tag.hit_skill=wrestling tag.hit_dam = if () argn1=/2) + (( (10000*)/2) / (*((<>/20)+500)) ))> //+++ else argn1=/2) + (( (10000*)/2) / (*((<>/20)+500)) ))> //+++ endif endif argn2=0 argn3=0 serv.log Final Speed = tag.hit_started=1 //argn1 = *2)/3> //HIT_DISTANCE_RESET on=@Hit serv.log **** Hit start **** //Checking region flags IF (( & (REGION_FLAG_SAFE|REGION_FLAG_NO_PVP)) || ( & STATF_INVUL)) SRC.EFFECT 3, i_fx_glow, 3, 20, 1 return 1 ENDIF //Deleting Arrows IF () consume 1 ENDIF //*** Подсчет шансов отразить и поглотить удар оружием и броней if (==t_shield) //Shield serv.log has a shield local.parry_percent= local.absorb_percent= local.parry_object = elif () //У врага нету щита, а у нас лук. serv.log has no shield, but we have some arrows! local.parry_percent=0 local.absorb_percent=0 local.parry_object=0 elif ((==) || (==)) //Same weapons serv.log has no shield, but same weapon. local.parry_percent= local.absorb_percent= local.parry_object= elif (==0) && (==0) //No weapon + No shield = no parry serv.log has nothing to parry with. local.parry_percent=0 local.absorb_percent=0 local.parry_object=0 else //different weapons serv.log has different weapon with you. local.parry_percent=/2> local.absorb_percent=/2> local.parry_object= endif if () //Ranged weapon cant be reflected. local.parry_percent=0 endif //*** local.weapon_speed_factor=*100)/> if (>100) serv.log Weapon is Slower than avarage local.parry_percent = *100)/> else serv.log Weapon is Faster than avarage local.absorb_percent = *)/100> endif serv.log PARRY PERCENT = serv.log ABSORB PERCENT = //Шанс попадения local.hit_chance = /5) + <>)*())*4>/1000> local.dodge_chance = )*(>/10))*>/100000> local.parry_chance = +)*)*4>/1000> local.sum=+(+)> local.throw=)> serv.log attack: serv.log Dodge Chance: *100)/>% serv.log Parry Chance: *100)/>% serv.log Hit Chance: *100)/>% IF (>) // Dodge // serv.log Dodge src.skill_gain Tactics,80 skill_gain Tactics,50 skill_gain ,60 src.sound > src.sysmessage @0,3,0 Вы увернулись от удара противника. sysmessage @0,3,0 Промах! return 1 ELIF ( + >>) // Parrying // serv.log Parry src.sysmessage @0,3,0 Вы паррировали удар. sysmessage @0,3,0 Ваш удар был паррирован. bark 2 src.skill_gain Parrying,100 src.skill_gain Tactics,40 skill_gain ,40 skill_gain Tactics,40 if (+)>>) //Absorb IF (/1000)))>==1) //Шанс повредить оборонительный обьект = 10 + 10 * (АрмсЛор/100.0). try uid..damage 1000 ENDIF else //Parry IF (/1000)))>==1) //Шанс повредить оборонительный обьект при паррировании = 20 + 20 * (АрмсЛор/100.0). try uid..damage 1000 ENDIF endif IF (/1000)))>==1) //Шанс повредить атакующий обьект = 15 + 15 * (АрмсЛор/100.0). try uid..damage 1000 ENDIF return 1 ENDIF // Hit // tag.FinalDam = )> serv.log Random Dam = tag.FinalDam = /2) + (((/2) * * <> * 100)/10000000)> serv.log Final Dam = // Тест на крит // local.critical_throw=/10))*)/> IF ((>)) // Крит - не учитываем броню // serv.log Critical! src.f_generate_blood trysrc src.uid..trigger @Critical IF () trysrc src.uid.>.trigger @Critical //Для стрел ENDIF obj= //Passing Armor if () //We have a weapon call calc_armor_damage else call calc_armor_damage_wrestling endif Else // Крита нет - считаем по броне // // Куда попали // tag.hit_layer=> if ((==0) || (.isarmor>==0)) && () //Naked NPC (Monster) tag.hit_layer= endif obj= if () //We have a weapon call calc_armor_damage else call calc_armor_damage_wrestling endif endif serv.log Final Dam = if () src.skill_gain Parrying,40 endif skill_gain ,100 skill_gain Tactics,100 trysrc src.uid..trigger @HitEnemy //Триггер подсчета урона для оружия IF () trysrc src.uid.>.trigger @HitEnemy //Для стрел ENDIF IF (/1000)))>==1) //Повреждаем оружие try uid..damage 1000 ENDIF IF (/1000)))>==1) && (.ischar>==0) //Повреждаем броню врага try uid..damage 1000 ENDIF //tag.FinalDam += //tag.FinalDam -=2 src.damage ,2, bark 2 tag.hit_started=0 HIT_RESET return 1 on=@GetHit IF ( && !( & REGION_FLAG_GUARDED) && ( & REGION_FLAG_GUARDED)) SRC.EFFECT 3, i_fx_glow, 3, 20, 1 return 1 ENDIF IF (&STATF_DEAD) return 1 ENDIF IF ((&DAM_FIRE) && (&MT_FIRE_IMMUNE)) ARGN1=0 return 0 ENDIF local.PreviousDam= //Сохраняем урон вызванный для этой функции src.tag.FinalDam= //Записываем текущий урон в переменную для последующей обработки if () try uid..trigger @OwnerGetHit //Вызываем триггер на арме endif if (==t_shield) try uid..trigger @OwnerGetHit //Вызываем триггер на арме endif IF (>0) //ЗАЩИЩАЕМ РЕДАКШНОМ sysmessage @900,3,0 Вы защитились от > едениц урона. src.tag.FinalDam -= ENDIF IF (==-255) src.tag.FinalDam=0 ELIF (<=0) //ВЫРАВНИВАЕМ УРОН src.tag.FinalDam=)> ENDIF ARGN1= //Устанавливаем в урон новые значения src.tag.FinalDam= //Восстанавливаем утраченное значение оригинального урона для родительской функции IF (!=) IF (&DAM_POISON) message @68,3,0 -> ELIF (&DAM_MAGIC) message @5,3,0 -> ELSE message @72,3,0 -> ENDIF ENDIF IF ((&DAM_POISON)==0) f_check_paralyze f_check_reactive f_generate_blood 1 ELIF (>15) ARGN1=> //Fix for poison ENDIF f_check_war_flags IF (==0) trysrc src.message @33,3,0 -> ENDIF bark 3 ARGN2=dam_god IF (() && (!=T_WEAPON_BOW) && (!=T_WEAPON_XBOW)) IF (>0) && (<) IF (<4) RUN +4)> ELSE RUN -4)> ENDIF ENDIF ENDIF return 0 [FUNCTION calc_armor_damage] //inline //obj - итем по которому мы попали //argo - оружие которым попали //uid - чар который аттакует //src - чар по которому бьют //tag.FinalDam - урон // Weapon // TAG.DAM_SLASH // TAG.DAM_FENCE // TAG.DAM_BLUNT // Armor // TAG.RES_SLASH // TAG.RES_FENCE // TAG.RES_BLUNT local.armor_class=*)+(*)+(*))*>)/10000> assert 364,<200 assert 365,>0 tag.FinalDam=*2)/3))*)/100> [FUNCTION calc_armor_damage_wrestling] local.armor_class=*)+(*)+(*))*>)/10000> assert 366,<200 assert 367,>0 tag.FinalDam=*2)/3))*)/100> [FUNCTION damtype_parent] if () TAG.DAM_SLASH=.tag.dam_slash> TAG.DAM_FENCE=.tag.dam_fence> TAG.DAM_BLUNT=.tag.dam_blunt> else TAG.DAM_SLASH=.tag.dam_slash> TAG.DAM_FENCE=.tag.dam_fence> TAG.DAM_BLUNT=.tag.dam_blunt> endif [FUNCTION armortype_parent] if () TAG.RES_SLASH=.tag.RES_slash> TAG.RES_FENCE=.tag.RES_fence> TAG.RES_BLUNT=.tag.RES_blunt> else TAG.RES_SLASH=.tag.RES_slash> TAG.RES_FENCE=.tag.RES_fence> TAG.RES_BLUNT=.tag.RES_blunt> endif [FUNCTION shieldtype_parent] TAG.CHANCE_PARRY=.tag.CHANCE_PARRY> TAG.CHANCE_ABSORB=.tag.CHANCE_ABSORB> [FUNCTION HIT_RESET] SERV.NEWITEM=i_hit_reset NEW.P=

NEW.LINK= NEW.TIMERD=2 [ITEMDEF i_hit_reset] ID=i_memory TYPE=t_script ON=@TIMER if (==0) TRY LINK.TIMER=0 endif REMOVE RETURN 1 [FUNCTION HIT_DISTANCE_RESET] consume 1 i_hit_distance_reset serv.newitem i_hit_distance_reset new.cont new.link= new.timer=/20 if (<1) new.remove endif [ITEMDEF i_hit_distance_reset] ID=i_memory TYPE=t_eq_script on=@Timer if (==0) remove return 1 endif if (>>2) cont.action -1 endif remove return 1 [FUNCTION random_armor_part] DORAND 15 local.hit_layer=layer_chest local.hit_layer=layer_chest local.hit_layer=layer_chest local.hit_layer=layer_chest local.hit_layer=layer_chest local.hit_layer=layer_legs local.hit_layer=layer_legs local.hit_layer=layer_legs local.hit_layer=layer_arms local.hit_layer=layer_arms local.hit_layer=layer_arms local.hit_layer=layer_helm local.hit_layer=layer_helm local.hit_layer=layer_gloves local.hit_layer=layer_collar ENDDO serv.log LAYER= if (==layer_legs) && (==0) local.hit_layer=layer_pants endif if (==layer_chest) && (==0) local.hit_layer=layer_shirt endif return [FUNCTION find_weapon] if () return elif () return else return 0 endif [FUNCTION f_check_war_flags] FORCHARMEMORYTYPE MEMORY_SAWCRIME IF (== ) TIMER=120 ENDIF ENDFOR FORCHARMEMORYTYPE MEMORY_HARMEDBY IF (== ) TIMER=120 ENDIF ENDFOR [FUNCTION f_check_paralyze] IF (&STATF_FREEZE) flags &= ~statf_freeze findid.i_rune_paralyze.remove ENDIF [FUNCTION f_check_reactive] IF (& STATF_REACTIVE) src.effect 3, i_fx_curse, 3, 10 IF () local.react = ELSE local.react = ENDIF local.react = * )/5000)+1)> src.hits = - )> src.update ENDIF [FUNCTION f_generate_blood] IF (==0FFFF) return 0 ENDIF FOR IF (RAND(2)==1) SERV.NEWITEM=i_blood NEW.DispID={0122a 1 0122b 1 0122c 1 0122d 1 0122e 1 0122f 1} NEW.ATTR=attr_decay|attr_move_never new.color= NEW.P=

NEW.P=+-1)> +-1)> NEW.TIMER={100 300} if () new.remove endif ENDIF ENDFOR [FUNCTION f_test_blood_under] local.timer= local.this= foritems 0 if (==i_blood) && (!=) timer += if (>1000) timer=1000 endif return 1 endif endfor return 0 [function f_damage_weapon] try uid..damage=1000,2, [function f_damage_armor] IF ((==T_SHIELD) && (RAND(13)==0)) findlayer.2.damage=1000,2, ELSE DORAND 12 findlayer(layer_tunic).damage=1000,2, findlayer(layer_robe).damage=1000,2, findlayer(layer_skirt).damage=1000,2, findlayer(layer_cape).damage=1000,2, findlayer(layer_tunic).damage=1000,2, findlayer(layer_chest).damage=1000,2, findlayer(layer_arms).damage=1000,2, findlayer(layer_helm).damage=1000,2, findlayer(layer_pants).damage=1000,2, findlayer(layer_legs).damage=1000,2, findlayer(layer_collar).damage=1000,2, findlayer(layer_gloves).damage=1000,2, ENDDO ENDIF [EOF]