|
Arturius
|
 |
« on: November 05, 2011, 10:39:08 AM » |
|
Стал замечать, что во многих нестандартных расах у меня не работает иммунитет от их скилов и/или ультиматов. Вот например в расе Lucky Strike: public OnW3TakeDmgBulletPre( victim, client, Float:damage ) { if( IS_PLAYER( victim ) && IS_PLAYER( client ) && victim > 0 && client > 0 && victim != client && IsPlayerAlive( victim ) && IsPlayerAlive( client ) ) { new vteam = GetClientTeam( victim ); new ateam = GetClientTeam( client );
new race_victim = War3_GetRace( victim ); new race_attack = War3_GetRace( client );
if( vteam != ateam ) { new skill_steal = War3_GetSkillLevel( client, thisRaceID, SKILL_STEAL ); if( race_attack == thisRaceID && skill_steal > 0 && !Hexed( client, false ) && !W3HasImmunity( client, Immunity_Skills ) ) { if( GetRandomFloat( 0.0, 1.0 ) <= 0.30 ) { new stolen = StealMoney[skill_steal];
new dec_money = GetMoney( victim ) - stolen; new inc_money = GetMoney( client ) + stolen;
if( dec_money < 0 ) dec_money = 0; if( inc_money > 16000 ) inc_money = 16000;
SetMoney( victim, dec_money ); SetMoney( client, inc_money );
W3MsgStoleMoney( victim, client, StealMoney[skill_steal] ); W3FlashScreen( client, RGBA_COLOR_BLUE ); } } new skill_evade = War3_GetSkillLevel( victim, thisRaceID, SKILL_EVADE ); if( race_victim == thisRaceID && skill_evade > 0 && !Hexed( victim, false ) && !W3HasImmunity( client, Immunity_Skills ) ) { if( GetRandomInt( RandMin, RandMax[skill_evade] ) <= 10 ) { W3FlashScreen( victim, RGBA_COLOR_BLUE ); War3_DamageModPercent( 0.0 ); W3MsgEvaded( victim, client ); } } } } }
Как бы понятно, что в этом коде присутствует иммунитет от SKILL_STEAL и SKILL_EVADE. Про второй скилл мне трудно сказать, но от SKILL_STEAL иммунитет не работает. Деньги вычитаются как по расписанию. Так же у расы The Risen (Зомби) не работае иммунитет от заражения. Может что-то поменялось в написании фунций или ещё чего? Или в коде здесь что-то не так? Не могу разобраться.
|
|
|
|
« Last Edit: November 05, 2011, 10:42:36 AM by Arturius »
|
Logged
|
|
|
|
|
Arturius
|
 |
« Reply #1 on: November 07, 2011, 12:49:43 AM » |
|
Хоть бы кто ответил, а то пришлось самому напрягаться и искать причины моего недоразумения.  А недоразумение заключалось в том, что я, по наивности своей, считал, что "ожерелье иммунитета" даёт иммунку от всего, где имеется Immunity_Skills. А на самом деле существует три вида иммунитета: Immunity_Skills, Immunity_Ultimates и Immunity_Wards. А "ожерелье иммунитета" возвращает только Immunity_Ultimates. Следовательно, если я хотел запретить срабатывание скила при помощи "ожерелья иммунитета" то следовало изменить в расе Immunity_Skills на Immunity_Ultimates или просто добавить. Но у меня всё равно остался вопрос, а много ли рас у которых Immunity_Skills=true? Что-то я не припомню...
|
|
|
|
« Last Edit: November 07, 2011, 05:58:55 AM by Arturius »
|
Logged
|
|
|
|
|
Frenzzy
|
 |
« Reply #2 on: November 07, 2011, 07:04:17 AM » |
|
Обычно все расы у которых меньше 10hp, либо имунка от навыков дается на время (например при ульте). Висп? // The types of immunities you can get/set from. ///corresponds to a buff system immunity enum War3Immunity { Immunity_None = 0, //generic zero Immunity_Ultimates, // Immune from ultimates Immunity_PhysicalDamage, // Immune from health taking Immunity_MagicDamage, // Immune from magic based stuff (doesnt not include ultimates) Immunity_Items, // Immune from shop items Immunity_Skills, // Immune from all skills Immunity_Wards, // Immune ward modifiers/damage. skill immunity includes ward immunity Immunity_Ability, // Immune from abilities (not implemented by core) }
|
|
|
|
|
Logged
|
O_o
|
|
|
|
Schmarotzer
|
 |
« Reply #3 on: November 07, 2011, 09:20:25 PM » |
|
У тебя не правильно написано. Ты сам у себя проверяешь иммунитет в первом навыке. Соответственно если у тебя нет иммунитета, то у жертвы ты воруешь. Во втором все нормально. Совет. Используй для проверки иммунитетов: IsSkillImmune(client) IsUltImmune(client)
и для проверки шанса: W3Chance(0.33) W3Chance(SkillChance[skilllevel])
|
|
|
|
|
Logged
|
Welcome to my server
|
|
|
|
Arturius
|
 |
« Reply #4 on: November 08, 2011, 05:09:24 AM » |
|
Спасибо, Schmarotzer! Исправил 
|
|
|
|
|
Logged
|
|
|
|
|
Arturius
|
 |
« Reply #5 on: November 14, 2011, 02:08:10 AM » |
|
Встретил в расе Lich такую строчку: War3_SetBuff(client,fArmorPhysical,thisRaceID,FrostArmorAmount[sklevel]); Что такое fArmorPhysical и на что он влияет?
|
|
|
|
|
Logged
|
|
|
|
|
Frenzzy
|
 |
« Reply #6 on: November 14, 2011, 10:53:00 AM » |
|
Тоже самое что физическая и магическая броня в warcraft 3 ?
|
|
|
|
|
Logged
|
O_o
|
|
|
|
Arturius
|
 |
« Reply #7 on: November 14, 2011, 03:42:56 PM » |
|
Хорошо... Перефразирую свой вопрос. Можно ли считать, что действие fArmorPhysical=4.0 аналогично War3_DamageModPercent(0.4)?
|
|
|
|
|
Logged
|
|
|
|
|
Frenzzy
|
 |
« Reply #8 on: November 14, 2011, 07:49:08 PM » |
|
Нет, это не одно и тоже. ..вроде
|
|
|
|
|
Logged
|
O_o
|
|
|
|
nvn
|
 |
« Reply #9 on: November 15, 2011, 07:09:05 AM » |
|
Хорошо... Перефразирую свой вопрос. Можно ли считать, что действие fArmorPhysical=4.0 аналогично War3_DamageModPercent(0.4)?
Нельзя так считать. Бафф fArmorPhysical устанавливается игроку, т.е весь урон который он будет получать, будет уменьшен на X процентов. War3_DamageModPercent - увеличивает в процентном соотношении наносимый урон (или уменьшает). Процент поглощаемого урона высчитывается след формулой (1.0-(armor*0.06)/(1.0+armor*0.06)), она идентична для fArmorMagic. Т.е fArmorPhhysical = 1.0 поглощает ~6%
|
|
|
|
« Last Edit: November 15, 2011, 09:22:45 AM by nvn »
|
Logged
|
|
|
|
|
Arturius
|
 |
« Reply #10 on: November 15, 2011, 09:16:26 AM » |
|
Нельзя так считать. Бафф fArmorPhysical устанавливается игроку, т.е весь урон который он будет получать, будет уменьшен на X процентов. War3_DamageModPercent - увеличивает в процентном соотношении наносимый урон.
Процент поглощаемого урона высчитывается след формулой (1.0-(armor*0.06)/(1.0+armor*0.06)), она идентична для fArmorMagic. Т.е fArmorPhhysical = 1.0 поглощает ~6%
Спасибо! Я понял.
|
|
|
|
|
Logged
|
|
|
|
|
Arturius
|
 |
« Reply #11 on: November 18, 2011, 03:07:19 PM » |
|
В связи с новыми изменениями в вар3моде, хотелось бы кое что уточнить. fBashChance, //Registers a chance to bash, iBashDamage, //Does a certain amount of damage when you bash an enemy (more similar to warcraft 3's bash, default 0) iBashDuration, //Sets the duration of bash's stun Вот я смотрю у расы Human Alliance такой код: new skill_bash=War3_GetSkillLevel(client,thisRaceID,SKILL_BASH); new Float:bash=BashChance[skill_bash]; War3_SetBuff(client,fBashChance,thisRaceID,bash);
Насколько я понимаю, шанс fBashChance зависит от параметра bash в функции War3_SetBuff. Но, какое время действует этот fBashChance? Я в том смысле, что когда жертва башится, как долго это происходит?
|
|
|
|
« Last Edit: November 18, 2011, 03:12:22 PM by Arturius »
|
Logged
|
|
|
|
|
Frenzzy
|
 |
« Reply #12 on: November 18, 2011, 05:14:24 PM » |
|
Если fBashDuration не указано, значит используется значение по-умолчанию. В данном случае 0.0 секунд. При этом игроки все равно получают сообщение о баше и урон (если указан iBashDamage и больше 0). 
|
|
|
|
|
Logged
|
O_o
|
|
|
|
Arturius
|
 |
« Reply #13 on: November 19, 2011, 01:33:55 AM » |
|
То есть, получается что в данном коде баш Человека срабатывает с частотой шанса bash, задерживая противника на 0.0 секунд, не нанося никакого урона. Получается, что он вообще не имеет никакого эффекта. Как тогда связать эти параметры, чтобы баш был с частотой шанса bash и продолжительностью 1.0 секунд?
|
|
|
|
|
Logged
|
|
|
|
|
Arturius
|
 |
« Reply #14 on: November 26, 2011, 06:00:36 AM » |
|
Объясните мне, пожалуйста значения следующих констант: bHexed, // no skill proc bPerplexed, //cannot use items / proc items Как они работают в игре? Что именно и каким образом не дают делать?
|
|
|
|
|
Logged
|
|
|
|
|
Schmarotzer
|
 |
« Reply #15 on: November 26, 2011, 02:39:42 PM » |
|
Hexed - проклятие, не дает использовать навык (соответственно только те, которым ты прописал проверку в расах) Perplexed - запрет использования артефактов (нахожу только у Когтей Атаки, Змеиного Браслета и Шлема Черного Легиона)
|
|
|
|
|
Logged
|
Welcome to my server
|
|
|
|
Arturius
|
 |
« Reply #16 on: November 26, 2011, 02:59:17 PM » |
|
Спасибо! Чем дальше я пытаюсь разобраться, тем больше запутываюсь. Вот код расы War3Source_001_UndeadScourge.sp: public OnWar3EventDeath(victim,attacker) { new race=W3GetVar(DeathRace); new skill=War3_GetSkillLevel(victim,thisRaceID,SKILL_SUICIDE); if(race==thisRaceID && skill>0 && !Hexed(victim)) { decl Float:location[3]; GetClientAbsOrigin(victim,location); if(War3_GetGame()==Game_TF) { War3_SuicideBomber(victim, location, SuicideBomberDamageTF[SKILL_SUICIDE], SKILL_SUICIDE,SuicideBomberRadius[SKILL_SUICIDE]); } else { War3_SuicideBomber(victim, location, SuicideBomberDamage[SKILL_SUICIDE], SKILL_SUICIDE,SuicideBomberRadius[SKILL_SUICIDE]); } } }
Вроде всё понятно.... Но не понятно, почему если не указано !W3HasImmunity(client,Immunity_Ultimates), то иммунитет противников всё равно работает? Где это обозначено? В каких дебрях прописано?
|
|
|
|
« Last Edit: November 26, 2011, 03:02:10 PM by Arturius »
|
Logged
|
|
|
|
|
Frenzzy
|
 |
« Reply #17 on: November 27, 2011, 12:05:21 AM » |
|
War3_SuicideBomber() - это большая функция в которой еще куча всяких проверок. Но еще и сама функция War3_DealDamage() имеет собственные проверки на иммунитет.
|
|
|
|
|
Logged
|
O_o
|
|
|
|
Arturius
|
 |
« Reply #18 on: November 27, 2011, 01:35:29 AM » |
|
War3_SuicideBomber() - это большая функция в которой еще куча всяких проверок. Но еще и сама функция War3_DealDamage() имеет собственные проверки на иммунитет.
Я повторю свой вопрос. Где это обозначено? В каких дебрях прописано?
|
|
|
|
|
Logged
|
|
|
|
|
alex0310
|
 |
« Reply #19 on: November 27, 2011, 02:23:41 AM » |
|
К сожалению нет последней версии, а SVN не работает.. А вообще раньше, эта функция выглядела так: public SuicideBomber(client,level) { if(suicidedAsTeam[client]!=GetClientTeam(client)){ return; //switched team } new Float:radius=SuicideBomberRadius[level]; if(level<=0) return; // just a safety check new ss_ff=GetConVarInt(FriendlyFireSuicideCvar); new bool:mp_ff=GetConVarBool(MPFFCvar); new our_team=GetClientTeam(client); new Float:client_location[3]; for(new i=0;i<3;i++){ client_location[i]=SuicideLocation[client][i]; } TE_SetupExplosion(client_location,ExplosionModel,10.0,1,0,RoundToFloor(radius),160); TE_SendToAll(); if(War3_GetGame()==Game_TF){ client_location[2]+=30.0; } else{ client_location[2]-=40.0; } TE_SetupBeamRingPoint(client_location, 10.0, radius, BeamSprite, HaloSprite, 0, 15, 0.5, 10.0, 10.0, {255,255,255,33}, 120, 0); TE_SendToAll(); new beamcolor[]={0,200,255,255}; //blue //secondary ring if(our_team==2) { //TERRORISTS/RED in TF? beamcolor[0]=255; beamcolor[1]=0; beamcolor[2]=0; } //secondary ring TE_SetupBeamRingPoint(client_location, 20.0, radius+10.0, BeamSprite, HaloSprite, 0, 15, 0.5, 10.0, 10.0, beamcolor, 120, 0); TE_SendToAll();
if(War3_GetGame()==Game_TF){ client_location[2]-=30.0; } else{ client_location[2]+=40.0; } EmitSoundToAll(explosionSound1,client); if(War3_GetGame()==Game_TF){ EmitSoundToAll("weapons/explode1.wav",client); } else{ EmitSoundToAll("weapons/explode5.wav",client); } ///building damage if(War3_GetGame()==Game_TF && GetConVarBool(SuicideDamageSentryCvar)) { // Do they have a sentry that should get blasted too? new ent=0; new buildinglist[1000]; new buildingsfound=0; while((ent = FindEntityByClassname(ent,"obj_sentrygun"))>0) { buildinglist[buildingsfound]=ent; buildingsfound++; } while((ent = FindEntityByClassname(ent,"obj_teleport"))>0) { buildinglist[buildingsfound]=ent; buildingsfound++; } while((ent = FindEntityByClassname(ent,"obj_dispenser"))>0) { buildinglist[buildingsfound]=ent; buildingsfound++; }
for(new i=0;i<buildingsfound;i++){ ent=buildinglist[i]; if(!IsValidEdict(ent)) continue; new builder=GetEntPropEnt(ent,Prop_Send,"m_hBuilder"); if(GetClientTeam(builder)!=our_team) { new Float:pos_comp[3]; GetEntPropVector(ent,Prop_Send,"m_vecOrigin",pos_comp); new Float:dist=GetVectorDistance(client_location,pos_comp); if(dist>radius) continue; if(!W3HasImmunity(builder,Immunity_Ultimates)) { //new damage=RoundFloat(100*(1-FloatDiv(dist,radius)+0.40)); new damage=RoundFloat(SuicideBomberDamageTF[level]*(radius-dist)/radius); //special case PrintToConsole(client,"%T","Suicide bomber BUILDING damage: {amount} at distance {amount}",client,damage,dist); SetVariantInt(damage); AcceptEntityInput(ent,"RemoveHealth",client); // last parameter should make death messages work } else{ PrintToConsole(client,"%T","Player {player} has immunity (protecting buildings)",client,builder); } } } } new Float:location_check[3]; for(new x=1;x<=MaxClients;x++) { if(ValidPlayer(x,true)&&client!=x) { new team=GetClientTeam(x); if(ss_ff==0 && team==our_team) continue; else if(ss_ff==2 && !mp_ff && team==our_team) continue;
GetClientAbsOrigin(x,location_check); new Float:distance=GetVectorDistance(client_location,location_check); if(distance>radius) continue; if(!W3HasImmunity(x,Immunity_Ultimates)) { new Float:factor=(radius-distance)/radius; new damage; if(War3_GetGame()==Game_TF){ damage=RoundFloat(SuicideBomberDamageTF[level]*factor); } else{ damage=RoundFloat(SuicideBomberDamage[level]*factor); } //PrintToChatAll("daage suppose to be %d/%.1f max. distance %.1f",damage,SuicideBomberDamage[level],distance); War3_DealDamage(x,damage,client,_,"suicidebomber",W3DMGORIGIN_ULTIMATE,W3DMGTYPE_PHYSICAL); PrintToConsole(client,"%T","Suicide bomber damage: {amount} to {amount} at distance {amount}",client,War3_GetWar3DamageDealt(),x,distance); War3_ShakeScreen(x,3.0*factor,250.0*factor,30.0); W3FlashScreen(x,RGBA_COLOR_RED); } else { PrintToConsole(client,"%T","Could not damage player {player} due to immunity",client,x); } } } //PrintCenterText(client,"BOMB DETONATED!"); }
|
|
|
|
|
Logged
|
|
|
|
|
Arturius
|
 |
« Reply #20 on: November 27, 2011, 02:49:56 AM » |
|
Спасибо за ответ. Я хочу извиниться за свою настойчивость в этом вопросе, но иначе никак. Прошу понять меня правильно, но как я могу узнать о всех способностях и ограничениях расы, если не могу посмотреть, где и что обозначено? С одной стороны, я искренне радуюсь, что коды совершенствуются и функции модифицируются, для их более удобного использования в расах. Но с другой стороны, как человеку непосвящённому во все детали, мне становится невероятно трудно определять все параметры этих функций, не зная их источников. Даже если возникает необходимость узнать, какие иммунитеты работают против определённого скила, смотря только на код расы, это становится невыполнимой задачей.
|
|
|
|
|
Logged
|
|
|
|
|
Frenzzy
|
 |
« Reply #21 on: November 27, 2011, 03:36:17 AM » |
|
Используй поиск по файлам! В Notepad++ это находится в меню: Поиск -> Найти в файлах (Ctrl+Shift+F) Ищи в папке ../addons/sourcemod/scripting/ Используй поиск по вложенным папкам Ищи в файлах с расширением *.sp и *.inc Все функции которые могут использоваться плагинами - обязательно присутствуют в файлах этой папки, иначе бы плагины не компилировались. Кстати все исходные файлы war3 тоже должны быть в этой папке scripting. --- Специально для ленивых ---Прототипы фукнций War3_DealDamage() и War3_SuicideBomber() здесь (описание функций должно быть в этом же файле): ../addons/sourcemod/scripting/W3SIncs/SuperHero_Interface.inc [Строка 848] native bool:War3_DealDamage(victim, damage, attacker = 0, damage_type = DMG_GENERIC, String:weaponNameStr[], War3DamageOrigin:W3DMGORIGIN = W3DMGORIGIN_UNDEFINED, War3DamageType:W3DMGTYPE = W3DMGTYPE_MAGIC, bool:respectVictimImmunity = true, bool:countAsFirstDamageRetriggered = false, bool:noWarning = false); [Строка 1551] native War3_SuicideBomber(client, Float:location[], Float:damage, race_skillid, Float:radius, bool:effect = true); Исходники DealDamage здесь: ../addons/sourcemod/scripting/War3Source_Engine_DamageSystem.sp Исходники SuicideBomber здесь (начиная со строки 84): ../addons/sourcemod/scripting/WCX_Engine_Skills.sp
|
|
|
|
|
Logged
|
O_o
|
|
|
|
Arturius
|
 |
« Reply #22 on: November 27, 2011, 04:19:42 AM » |
|
Я пользуюсь Notepad++, но не догадался о возможности поиска по папкам  . Поверьте, я не из ленивых и перерыл весь War3Source_Interface.inc. War3_SuicideBomber присутствует там в строке 1554, но не имеет детального описания относительно иммунитетов. Мой косяк только в том, что я, не зная о возможностях поиска, не начал вручную перебирать все файлы и искать описание функции. Собственно, спасибо вам за подсказку! Хочу ещё кое-что спросить о Human. Если я правильно понимаю: fBashChance, //Registers a chance to bash, (Note: 0.7 would equal a 30% chance to bash)
то при: new Float:BashChance[5]={0.0,0.07,0.13,0.19,0.25}; ... new skill_bash=War3_GetSkillLevel(client,thisRaceID,SKILL_BASH); new Float:bash=BashChance[skill_bash]; War3_SetBuff(client,fBashChance,thisRaceID,bash); //чем больше уровень скила, тем меньше шанс??? (0.0=100%, 0.07=93%, 0.13=87%, 0.19=81%, 0.25=75%)
Что-то одно из них неверно: либо описание fBashChance, либо расчёт BashChance[skill_bash]. И ещё один вопрос, для ясности. Верно ли я понимаю, что если в функции War3_DealDamage(), если указаны параметры W3DMGORIGIN и W3DMGTYPE, то функция проверяет наличие иммунитетов для этих параметров из Native_War3_DealDamage в файле War3Source_Engine_DamageSystem.sp, при условии, что указано bool:respectVictimImmunity=true?
|
|
|
|
« Last Edit: November 27, 2011, 05:52:52 AM by Arturius »
|
Logged
|
|
|
|
|
Frenzzy
|
 |
« Reply #23 on: November 27, 2011, 05:46:42 AM » |
|
Там ошибка в описании, должно быть: (Note: 0.3 would equal a 30% chance to bash) Следовательно: 1.0 = 100% 0.99 = 99% 0.505 = 50.5% 0.1 = 10% 0.0 = 0%
|
|
|
|
|
Logged
|
O_o
|
|
|
|
Arturius
|
 |
« Reply #24 on: November 27, 2011, 05:56:11 AM » |
|
Там ошибка в описании, должно быть: (Note: 0.3 would equal a 30% chance to bash)
Вот и славно. А то меня это несколько смутило. Не может быть, чтобы ошибка была в расчётах  . Иначе бы это подорвало всё моё доверие к разработчикам мода.
|
|
|
|
|
Logged
|
|
|
|
|