Описание параметров:skill_begin skill_name=[s_silence1] /* [사쁼냰삤] */ skill_id=1064 level=1 operate_type=A2 magic_level=40 effect={{p_block_spell}} is_magic=1 mp_consume1=7 mp_consume2=28 cast_range=600 effective_range=1100 skill_hit_time=4 skill_cool_time=0 skill_hit_cancel_time=0.5 reuse_delay=60 activate_rate=50 lv_bonus_rate=2 basic_property=men abnormal_time=30 abnormal_lv=1 abnormal_type=silence attribute=attr_derangement effect_point=-379 target_type=enemy_only affect_scope=single affect_limit={0;0} next_action=none abnormal_visual_effect=ave_silence debuff=1 ride_state={@ride_none;@ride_wind;@ride_star;@ride_twilight} skill_end
SKILL_INSTANT | = | A1 |
SKILL_DURATION | = | A2 |
SKILL_DURATION_LEVEL_UP | = | A4 |
SKILL_SELFDURATION | = | A3 |
SKILL_PASSIVE | = | p |
SKILL_TOGGLE | = | T |
SKILL_CHANNELLING_INSTANCE | = | CA1 |
SKILL_CHANNELLING_DURATION | = | CA2 |
SKILL_CHANNELLING_DURATION_LEVEL_UP | = | CA5 |
SKILL_CHARGE_INSTANT | = | DA1 |
SKILL_CHARGE_DURATION | = | DA2 |
SKILL_AURA | = | AU |
SKILL_AURA_ACTIVITY | = | A5 |
SKILL_GROUP_TOGGLE | = | TG |
SKILL_BACK_STEP_INSTANT | = | DA3 |
SKILL_BACK_STEP_DURATION | = | DA4 |
SKILL_AURA_ACTIVITY2 | = | A6 |
SKILL_PARTY_INSTANT | = | AP |
SKILL_DUAL_PUMP1 | = | DP1 |
SKILL_RACE_SPECIAL_PASSIVE | = | RP |
SKILL_BLINK_INSTANT | = | DA5 |
SKILL_BACK_STEP_DURATION_WITH_TARGET_KNOCKBACK | = | DA6 |
Да, всё верно. Он самый. Так как полагать(или предполагать) его работу при таком сочетании? Дважды хейтит с разными шансами на себя или всё же один раз?У него интерлуде ваганта.
Ну за ИЛ не скажу, особенно за многократно обкостыленный, но в ХФ и ГФ эффекта i_target_me_chance нет в ДП(и я сильно подозреваю, что в ядре тоже)У него интерлуде ваганта.
А есть ещё ц4 вампира(вроде), там аналогичная ситуация, но с др. цифрами.
Правильно или нет - сложно сказать. Либо вагант с вампиром упарывали некачественный героин, либо это офф-лайк. Третьего не дано.
Это самопал или чёто такое. Возможно наследие от с1-с4, углубляться не стал и не хочу.Ну за ИЛ не скажу, особенно за многократно обкостыленный, но в ХФ и ГФ эффекта i_target_me_chance нет в ДП(и я сильно подозреваю, что в ядре тоже)
Есть третий вариант: Взаимопроникновение идей, методом копипаста.
effect={{p_trigger_skill_by_dmg;{enemy_all;1;131};{100;50;diff}
nEnemyType; int nEnemyLevelFrom; int nEnemyLevelTo;
В яве можно просто создать общую функцию на триггеры, которая будет обрабатывать дефолтные для всех видов триггеров параметры, а также наследовать от нее персонифицированные функции триггеры.Подскажите, как расшифровать условие скила или как описать в яве.
Спасибо
Код:effect={{p_trigger_skill_by_dmg;{enemy_all;1;131};{100;50;diff}
Не совсем понимаю, что из этого урон, а что шанс.
Если по аналогии с умением: Мираж, то тригер при 100 урона с 50% шансом активации?
Но тогда, что значит: {enemy_all;1;131}
Реализация есть, интересует условие.В яве можно просто создать общую функцию на триггеры, которая будет обрабатывать дефолтные для всех видов триггеров параметры, а также наследовать от нее персонифицированные функции триггеры.
Также, на каждый тип триггера можно сделать функцию, калькулятор которой будет дергаться в момент когда происходит нужное событие. Например получение урона. Это наиболее простая реализация.
effect={{p_trigger_skill_by_dmg;{enemy_all;1;131};{100;50;diff}
<triggers>
<trigger id="0000" level="1" type="RECEIVE_DAMAGE" chance="50" increasing="true">
<player damage="100;0"/>
</trigger>
</triggers>
{100;50;diff}Что есть урон, а что шанс.
require_once "../../common.php";
$sd = $l2s::loadData("skilldata.txt");
$a = [];
for ($x = 0; $x < count($sd); $x++)
{
if ($sd[$x][0] != "skill_begin")
continue;
foreach ($sd[$x] as $t)
{
$t = trim($t);
if (strpos($t, "=") === false || strpos($t, "/*") !== false)
continue;
$t = explode("=", $t, 2);
$k = trim($t[0]);
$v = trim($t[1]);
if (!isset($a[$k]) || !in_array($v, $a[$k]))
$a[$k][] = $v;
}
}
if (!file_exists("skilldata"))
mkdir("skilldata");
foreach ($a as $k => $v)
{
sort($v);
file_put_contents("skilldata/{$k}.txt", implode("\n", $v)."\n");
}
Дополню немного своим разбором skilldata, которую делал, когда переписывал скилл движок. Тут разобрано по типам данных и эффектам.Может кому пригодится - от нечего делать расколупал и сохранил простеньким скриптом разные скиллдаты на тему того, какие в них существуют параметры и все такое.
Проанализировал таким образом все варианты скиллдат из недавней утечки и шары птс 287 протокола + скиллдату от хф.
В архивах названия файлов = названиям параметров, а их содержимое - все возможные значения этих параметров.
PHP:require_once "../../common.php"; $sd = $l2s::loadData("skilldata.txt"); $a = []; for ($x = 0; $x < count($sd); $x++) { if ($sd[$x][0] != "skill_begin") continue; foreach ($sd[$x] as $t) { $t = trim($t); if (strpos($t, "=") === false || strpos($t, "/*") !== false) continue; $t = explode("=", $t, 2); $k = trim($t[0]); $v = trim($t[1]); if (!isset($a[$k]) || !in_array($v, $a[$k])) $a[$k][] = $v; } } if (!file_exists("skilldata")) mkdir("skilldata"); foreach ($a as $k => $v) { sort($v); file_put_contents("skilldata/{$k}.txt", implode("\n", $v)."\n"); }
PHYSICAL_SKILL = 0
- is_magic = 0 - скорость каста скилла и откат зависят от каст спида
- is_magic = 1 - скорость каста скилла и откат зависят от атак спида
- is_magic = 2 - фиксированые скорость каста скилла и откат ни от чего не зависят aka SOE, свиток воскрешения etc.
- operate_type = P - пассивный, А1 или А2 - активный скилл.
SKILL_INSTANT | = | A1 |
SKILL_DURATION | = | A2 |
SKILL_DURATION_LEVEL_UP | = | A4 |
SKILL_SELFDURATION | = | A3 |
SKILL_PASSIVE | = | p |
SKILL_TOGGLE | = | T |
SKILL_CHANNELLING_INSTANCE | = | CA1 |
SKILL_CHANNELLING_DURATION | = | CA2 |
SKILL_CHANNELLING_DURATION_LEVEL_UP | = | CA5 |
SKILL_CHARGE_INSTANT | = | DA1 |
SKILL_CHARGE_DURATION | = | DA2 |
SKILL_AURA | = | AU |
SKILL_AURA_ACTIVITY | = | A5 |
SKILL_GROUP_TOGGLE | = | TG |
SKILL_BACK_STEP_INSTANT | = | DA3 |
SKILL_BACK_STEP_DURATION | = | DA4 |
SKILL_AURA_ACTIVITY2 | = | A6 |
SKILL_PARTY_INSTANT | = | AP |
SKILL_DUAL_PUMP1 | = | DP1 |
SKILL_RACE_SPECIAL_PASSIVE | = | RP |
SKILL_BLINK_INSTANT | = | DA5 |
SKILL_BACK_STEP_DURATION_WITH_TARGET_KNOCKBACK | = | DA6 |
Вот я их в сервере в enum видел тоже, но в скилл дате не нашел ничего похожего. Это для каких хроник актуально?
SKILL_INSTANT = A1 SKILL_DURATION = A2 SKILL_DURATION_LEVEL_UP = A4 SKILL_SELFDURATION = A3 SKILL_PASSIVE = p SKILL_TOGGLE = T SKILL_CHANNELLING_INSTANCE = CA1 SKILL_CHANNELLING_DURATION = CA2 SKILL_CHANNELLING_DURATION_LEVEL_UP = CA5 SKILL_CHARGE_INSTANT = DA1 SKILL_CHARGE_DURATION = DA2 SKILL_AURA = AU SKILL_AURA_ACTIVITY = A5 SKILL_GROUP_TOGGLE = TG SKILL_BACK_STEP_INSTANT = DA3 SKILL_BACK_STEP_DURATION = DA4 SKILL_AURA_ACTIVITY2 = A6 SKILL_PARTY_INSTANT = AP SKILL_DUAL_PUMP1 = DP1 SKILL_RACE_SPECIAL_PASSIVE = RP SKILL_BLINK_INSTANT = DA5 SKILL_BACK_STEP_DURATION_WITH_TARGET_KNOCKBACK = DA6
Из этого списка в Glory Days есть до A6 (включительно). Выше хроник нету чтобы глянутьВот я их в сервере в enum видел тоже, но в скилл дате не нашел ничего похожего. Это для каких хроник актуально?
Salvation Orfen Fafurion, возможно и выше.Вот я их в сервере в enum видел тоже, но в скилл дате не нашел ничего похожего. Это для каких хроник актуально?
Он у тебя неправильныйУ меня другие значения в skillgrp
S maybe = Sharedreuse_delay_type = S
De hecho, parece un CD global de habilidades, gracias Aristo
Нет, это именно Super. Если скилл имеет reuse_delay_type = S, то он получает откат для всех сабов и мейна, а если нет, только на активный саб или мейн.S maybe = Shared
enum SkillReuseDelayType : __int32
{
SRDT_NORMAL = 0x0,
SRDT_SUPER = 0x1,
};
__int64 __fastcall CCreature::SetSkillReuseDelay(CCreature *this, CSkillInfo *skill)
{
double v4; // xmm6_8
int m_nReuseDelayGroup; // r8d
std::_Tree_node<std::pair<int const ,CSkillInfo const *>,void *> *v6; // rcx
std::_Tree_node<std::pair<int const ,CSkillInfo const *>,void *> *v7; // rax
const CSkillInfo *v8; // rdx
std::_Tree_node<std::pair<int const ,CSkillInfo const *>,void *> *v9; // rdx
std::_Tree_node<std::pair<int const ,CSkillInfo const *>,void *> *j; // rdx
int m_nSubJobId; // r8d
int v12; // edx
std::_Tree_node<std::pair<int const ,CSkillInfo const *>,void *> *Myhead; // rcx
std::_Tree_node<std::pair<int const ,CSkillInfo const *>,void *> *Left; // rax
const CSkillInfo *second; // rdx
std::_Tree_node<std::pair<int const ,CSkillInfo const *>,void *> *Right; // rdx
std::_Tree_node<std::pair<int const ,CSkillInfo const *>,void *> *i; // rdx
int m_nSkillId; // edx
v4 = (double)(int)CCreature::CalcReuseDelay(this, skill);
if ( v4 > 0.0 )
{
m_nReuseDelayGroup = skill->m_nReuseDelayGroup;
if ( skill->m_ReuseDelayType )
{
if ( m_nReuseDelayGroup > 0 )
{
Myhead = this->m_ActiveSkills._Mypair._Myval2._Myval2._Myhead;
Left = Myhead->_Left;
if ( Myhead->_Left == Myhead )
{
LABEL_33:
m_nSkillId = skill->m_nSkillId;
}
else
{
while ( 1 )
{
second = Left->_Myval.second;
if ( skill->m_nSkillId != second->m_nSkillId && m_nReuseDelayGroup == second->m_nReuseDelayGroup )
break;
if ( !Left->_Isnil )
{
Right = Left->_Right;
if ( Right->_Isnil )
{
for ( i = Left->_Parent; !i->_Isnil && Left == i->_Right; i = i->_Parent )
Left = i;
Left = i;
}
else
{
do
{
Left = Right;
Right = Right->_Left;
}
while ( !Right->_Isnil );
}
}
if ( Left == Myhead )
goto LABEL_33;
}
m_nSkillId = second->m_nSkillId;
}
CSkillReuseDelay::AddOrUpdateSkillReuseDelay(
&this->m_SkillReuseDelay,
m_nSkillId,
this->m_data->m_nSubJobId,
(int)v4,
0);
}
m_nSubJobId = 4;
}
else
{
if ( m_nReuseDelayGroup > 0 )
{
v6 = this->m_ActiveSkills._Mypair._Myval2._Myval2._Myhead;
v7 = v6->_Left;
if ( v6->_Left != v6 )
{
while ( 1 )
{
v8 = v7->_Myval.second;
if ( skill->m_nSkillId != v8->m_nSkillId && m_nReuseDelayGroup == v8->m_nReuseDelayGroup )
break;
if ( !v7->_Isnil )
{
v9 = v7->_Right;
if ( v9->_Isnil )
{
for ( j = v7->_Parent; !j->_Isnil && v7 == j->_Right; j = j->_Parent )
v7 = j;
v7 = j;
}
else
{
do
{
v7 = v9;
v9 = v9->_Left;
}
while ( !v9->_Isnil );
}
}
if ( v7 == v6 )
goto LABEL_17;
}
v12 = v8->m_nSkillId;
m_nSubJobId = this->m_data->m_nSubJobId;
goto LABEL_37;
}
}
LABEL_17:
m_nSubJobId = this->m_data->m_nSubJobId;
}
v12 = skill->m_nSkillId;
LABEL_37:
CSkillReuseDelay::AddOrUpdateSkillReuseDelay(&this->m_SkillReuseDelay, v12, m_nSubJobId, (int)v4, 0);
}
if ( v4 > 300000.0 )
_InterlockedExchange(&this->m_lSaveSkillReuseDelay, 1);
return (unsigned int)(int)v4;
}
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?