Archived copy of war3source.com, the War3Source forum (2009–2020), rebuilt from the Internet Archive by wc3mods.net. This page was captured on 2012-10-25 (original capture). Forum · All archived topics · Wiki · Bug tracker · Blog
Chat

War3:Source
October 24, 2012, 07:17:13 PM *
Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length
News: Download: http://war3source.com/index.php?board=9.0
What is War3Source?: http://war3source.com/index.php?topic=200.0
Sample Stats: http://war3source.com/war3stats
Steam Community Group: http://steamcommunity.com/groups/war3source
War3Source SVN Checkout: http://ownageclan.com/svn/war3source/
War3Source servers: http://www.game-monitor.com/search.php?vars=war3_version=
 
   Home   Help Search Login Register  
Pages: [1] 2
  Print  
Author Topic: [Russian] Вопросы по иммунитету.  (Read 1046 times)
Arturius
Moderator
Full Member
*****
Posts: 155



View Profile Email
« on: November 05, 2011, 10:39:08 AM »

Стал замечать, что во многих нестандартных расах у меня не работает иммунитет от их скилов и/или ультиматов.
Вот например в расе Lucky Strike:

Code:
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
Moderator
Full Member
*****
Posts: 155



View Profile Email
« Reply #1 on: November 07, 2011, 12:49:43 AM »

Хоть бы кто ответил, а то пришлось самому напрягаться и искать причины моего недоразумения. Cheesy
А недоразумение заключалось в том, что я, по наивности своей, считал, что "ожерелье иммунитета" даёт иммунку от всего, где имеется 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
Moderator
Full Member
*****
Posts: 217


337905984 frenzzy@live.ru
View Profile WWW
« Reply #2 on: November 07, 2011, 07:04:17 AM »

Обычно все расы у которых меньше 10hp, либо имунка от навыков дается на время (например при ульте). Висп?

Quote
// 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
Full Member
***
Posts: 189


Ich schmarotze dich!

258631507
View Profile WWW
« Reply #3 on: November 07, 2011, 09:20:25 PM »

У тебя не правильно написано.
Ты сам у себя проверяешь иммунитет в первом навыке. Соответственно если у тебя нет иммунитета, то у жертвы ты воруешь.
Во втором все нормально.

Совет.

Используй для проверки иммунитетов:
Code:
IsSkillImmune(client)
IsUltImmune(client)

и для проверки шанса:
Code:
W3Chance(0.33)
W3Chance(SkillChance[skilllevel])
Logged

Welcome to my server
Arturius
Moderator
Full Member
*****
Posts: 155



View Profile Email
« Reply #4 on: November 08, 2011, 05:09:24 AM »

Спасибо, Schmarotzer! Исправил Wink
Logged
Arturius
Moderator
Full Member
*****
Posts: 155



View Profile Email
« Reply #5 on: November 14, 2011, 02:08:10 AM »

Встретил в расе Lich такую строчку:
Quote
War3_SetBuff(client,fArmorPhysical,thisRaceID,FrostArmorAmount[sklevel]);
Что такое fArmorPhysical и на что он влияет?
Logged
Frenzzy
Moderator
Full Member
*****
Posts: 217


337905984 frenzzy@live.ru
View Profile WWW
« Reply #6 on: November 14, 2011, 10:53:00 AM »

Тоже самое что физическая и магическая броня в warcraft 3 ?
Logged

O_o
Arturius
Moderator
Full Member
*****
Posts: 155



View Profile Email
« Reply #7 on: November 14, 2011, 03:42:56 PM »

Хорошо... Перефразирую свой вопрос. Можно ли считать, что действие fArmorPhysical=4.0 аналогично War3_DamageModPercent(0.4)?
Logged
Frenzzy
Moderator
Full Member
*****
Posts: 217


337905984 frenzzy@live.ru
View Profile WWW
« Reply #8 on: November 14, 2011, 07:49:08 PM »

Нет, это не одно и тоже.
..вроде
Logged

O_o
nvn
Full Member
***
Posts: 133


View Profile
« 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
Moderator
Full Member
*****
Posts: 155



View Profile Email
« 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
Moderator
Full Member
*****
Posts: 155



View Profile Email
« 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 такой код:
Code:
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
Moderator
Full Member
*****
Posts: 217


337905984 frenzzy@live.ru
View Profile WWW
« Reply #12 on: November 18, 2011, 05:14:24 PM »

Если fBashDuration не указано, значит используется значение по-умолчанию. В данном случае 0.0 секунд.
При этом игроки все равно получают сообщение о баше и урон (если указан iBashDamage и больше 0).
Tongue
Logged

O_o
Arturius
Moderator
Full Member
*****
Posts: 155



View Profile Email
« Reply #13 on: November 19, 2011, 01:33:55 AM »

То есть, получается что в данном коде баш Человека срабатывает с частотой шанса bash, задерживая противника на 0.0 секунд, не нанося никакого урона. Получается, что он вообще не имеет никакого эффекта. Как тогда связать эти параметры, чтобы баш был с частотой шанса bash и продолжительностью 1.0 секунд?
Logged
Arturius
Moderator
Full Member
*****
Posts: 155



View Profile Email
« Reply #14 on: November 26, 2011, 06:00:36 AM »

Объясните мне, пожалуйста значения следующих констант:
Code:
bHexed,  // no skill proc
bPerplexed, //cannot use items / proc items
Как они работают в игре? Что именно и каким образом не дают делать?
Logged
Schmarotzer
Full Member
***
Posts: 189


Ich schmarotze dich!

258631507
View Profile WWW
« Reply #15 on: November 26, 2011, 02:39:42 PM »

Hexed - проклятие, не дает использовать навык (соответственно только те, которым ты прописал проверку в расах)
Perplexed - запрет использования артефактов (нахожу только у Когтей Атаки, Змеиного Браслета и Шлема Черного Легиона)
Logged

Welcome to my server
Arturius
Moderator
Full Member
*****
Posts: 155



View Profile Email
« Reply #16 on: November 26, 2011, 02:59:17 PM »

Спасибо!
Чем дальше я пытаюсь разобраться, тем больше запутываюсь.
Вот код расы War3Source_001_UndeadScourge.sp:
Code:
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
Moderator
Full Member
*****
Posts: 217


337905984 frenzzy@live.ru
View Profile WWW
« Reply #17 on: November 27, 2011, 12:05:21 AM »

War3_SuicideBomber() - это большая функция в которой еще куча всяких проверок.
Но еще и сама функция War3_DealDamage() имеет собственные проверки на иммунитет.
Logged

O_o
Arturius
Moderator
Full Member
*****
Posts: 155



View Profile Email
« Reply #18 on: November 27, 2011, 01:35:29 AM »

War3_SuicideBomber() - это большая функция в которой еще куча всяких проверок.
Но еще и сама функция War3_DealDamage() имеет собственные проверки на иммунитет.
Я повторю свой вопрос. Где это обозначено? В каких дебрях прописано?
Logged
alex0310
Full Member
***
Posts: 170



View Profile
« Reply #19 on: November 27, 2011, 02:23:41 AM »

К сожалению нет последней версии,   а SVN не работает..
А вообще раньше, эта функция выглядела так:
Code:
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
Moderator
Full Member
*****
Posts: 155



View Profile Email
« Reply #20 on: November 27, 2011, 02:49:56 AM »

Спасибо за ответ. Я хочу извиниться за свою настойчивость в этом вопросе, но иначе никак. Прошу понять меня правильно, но как я могу узнать о всех способностях и ограничениях расы, если не могу посмотреть, где и что обозначено? С одной стороны, я искренне радуюсь, что коды совершенствуются и функции модифицируются, для их более удобного использования в расах. Но с другой стороны, как человеку непосвящённому во все детали, мне становится невероятно трудно определять все параметры этих функций, не зная их источников. Даже если возникает необходимость узнать, какие иммунитеты работают против определённого скила, смотря только на код расы, это становится невыполнимой задачей.
Logged
Frenzzy
Moderator
Full Member
*****
Posts: 217


337905984 frenzzy@live.ru
View Profile WWW
« 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
Moderator
Full Member
*****
Posts: 155



View Profile Email
« Reply #22 on: November 27, 2011, 04:19:42 AM »

Я пользуюсь Notepad++, но не догадался о возможности поиска по папкам Roll Eyes.
Поверьте, я не из ленивых и перерыл весь War3Source_Interface.inc. War3_SuicideBomber присутствует там в строке 1554, но не имеет детального описания относительно иммунитетов. Мой косяк только в том, что я, не зная о возможностях поиска, не начал вручную перебирать все файлы и искать описание функции. Собственно, спасибо вам за подсказку!

Хочу ещё кое-что спросить о Human. Если я правильно понимаю:
Code:
fBashChance, //Registers a chance to bash, (Note: 0.7 would equal a 30% chance to bash)
то при:
Code:
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
Moderator
Full Member
*****
Posts: 217


337905984 frenzzy@live.ru
View Profile WWW
« 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
Moderator
Full Member
*****
Posts: 155



View Profile Email
« Reply #24 on: November 27, 2011, 05:56:11 AM »

Там ошибка в описании, должно быть: (Note: 0.3 would equal a 30% chance to bash)
Вот и славно. А то меня это несколько смутило. Не может быть, чтобы ошибка была в расчётах Cheesy. Иначе бы это подорвало всё моё доверие к разработчикам мода.
Logged
Pages: [1] 2
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2009, Simple Machines LLC Valid XHTML 1.0! Valid CSS!