interlude
// L2Character.java
public final void dispelSkillEffect ( int skillId, int skillLevel ) {
// Найти скилл с подходящим ID и уровнем
final L2Skill skill = SkillTable. getInstance ( ) . getInfo ( skillId, skillLevel ) ;
// Skill не найден и не может быть отменён
if ( skill == null )
{
return ;
}
// Пенальти и дебафы не могут быть отменены
if ( skill.isStayAfterDeath ( ) || skill. isDebuff ( ) )
{
return ;
}
// Сбрасывать с персонажа эфект скила с ид
_effects. stopSkillEffects ( skill
// RequestBypassToServer.java
// Usage: _dispel:<int:skill_id>,<int:skill_level>
// Example: _dispel:313,8
else if ( _command. startsWith ( "_dispel" ) )
{
String params = _command. substring ( _command. indexOf ( ":" ) + 1 ) ;
// Split params into tokens
StringTokenizer st = new StringTokenizer ( params, "," ) ;
// Get skill ID from first token
intid = Integer . parseInt ( st.nextToken ( ) ) ;
activeChar. dispelSkillEffect ( id, level ) ; }
// AbnormalStatusWnd.uc
class AbnormalStatusWnd extends UIScript ;
const NSTATUSICON_FRAMESIZE = 12 ;
const NSTATUSICON_MAXCOL = 12 ;
const NSTATUSICON_SIZE = 24 ;
// ...
// AbnormalStatusWnd.uc
function OnLButtonDblClick ( int X , int Y ) {
local Rect windowBounds ;
local int targetRow ;
local int targetCol ;
local StatusIconInfo info ;
local SkillInfo skillInfo ;
// Find window position
windowBounds = Me. GetRect ( ) ;
// Process clicks outside of window frame only
if ( X > ( windowBounds. nX + NSTATUSICON_FRAMESIZE ) ) {
targetRow = ( Y - windowBounds. nY ) / NSTATUSICON_SIZE ;
targetCol = ( X - windowBounds. nX - NSTATUSICON_FRAMESIZE ) / NSTATUSICON_SIZE ;
StatusIcon. GetItem ( targetRow , targetCol , info ) ;
if ( GetSkillInfo ( info. ClassID , info. Level , skillInfo ) ) {
// Request server to stop skill effect
// Usage: _dispel:<int:skill_id>,<int :skill_level>
// Example: _dispel:313,8
RequestBypassToServer ( "_dispel:" $ string ( skillInfo. SkillID ) $ "," $ string ( skillInfo. SkillLevel ) ) ) ;
}
}
}
Код:// L2Character.java public final void dispelSkillEffect ( int skillId, int skillLevel ) { // Найти скилл с подходящим ID и уровнем final L2Skill skill = SkillTable. getInstance ( ) . getInfo ( skillId, skillLevel ) ; // Skill не найден и не может быть отменён if ( skill == null ) { return ; } // Пенальти и дебафы не могут быть отменены if ( skill.isStayAfterDeath ( ) || skill. isDebuff ( ) ) { return ; } // Сбрасывать с персонажа эфект скила с ид _effects. stopSkillEffects ( skill
// L2Character.java
public final void dispelSkillEffect ( int skillId, int skillLevel ) {
final L2Skill skill = SkillTable. getInstance ( ) . getInfo ( skillId, skillLevel ) ;
if ( skill == null )
{
return ;
}
if ( skill.isStayAfterDeath ( ) || skill. isDebuff ( ) )
{
return ;
}
_effects. stopSkillEffects ( skill. getId ( ) ) ;
}
У говнолюда точно есть OnKeyDown\Up, что как бы намекает, что alt+click всё таки сделать можно, если немного постараться.К сожалению, простого способа отслеживания Alt+Click в клиенте Interlude нет, поэтому используем обычный двойной клик левой кнопки мыши для снятия баффа . Событие будет обрабатываться окном AbnormalStatusWnd , в котором отображаются иконки бафов и дебаффов
function OnKeyDown(EInputKey nKey)
{
if (nKey == IK_Alt )
bAltClicked = true;
}
function OnKeyUp(EInputKey nKey)
{
if (nKey == IK_Alt )
bAltClicked = false;
}
event OnClickItem(string strID, int Index);
Не помню точно, но вроде есть и IsKeyDown, что автоматически избавляет от костылей с OnKeyDown и OnKeyUpУ говнолюда точно есть OnKeyDown\Up, что как бы намекает, что alt+click всё таки сделать можно, если немного постараться.
C#:function OnKeyDown(EInputKey nKey) { if (nKey == IK_Alt ) bAltClicked = true; } function OnKeyUp(EInputKey nKey) { if (nKey == IK_Alt ) bAltClicked = false; }
Что касается StatusIconCtrl - а разве хендлер OnClickItem не принимает нажатия в этот элемент? Если да, то это немного ослабит вашу жажду математики, т.к. индекс тут возвращается в аргументе и ничего считать не надо.
C#:event OnClickItem(string strID, int Index);
P.S. Я не знаю точно, как он работает в ИТ, но в хрониках выше клики в StatusIcon принимает OnClickItem. Возможно это было сделано как раз для alt+click баффов и в ИТ никакого листенера на StatusIcon нет.
Ну это так, костыли для костылей, старый добрый интерлюдик.Не помню точно, но вроде есть и IsKeyDown, что автоматически избавляет от костылей с OnKeyDown и OnKeyUp
Сам по себе интрелюдик костыль для ностальгирующих по старой л2)Не помню точно, но вроде есть и IsKeyDown, что автоматически избавляет от костылей с OnKeyDown и OnKeyUp
Я вот взял 362 и копаю как раз по реализациям которых нет, олли 3 на 3, мировая торговля, сундукНу это так, костыли для костылей, старый добрый интерлюдик.
P.S. На месте ТСа я бы задумался не над костылингом синего трупа, а над подъёмом пакетки до каких то более или менее адекватных клиентов, которые уже имеют весь необходимый функционал, типа RequestDispel. Под адекватными я имею ввиду 152 протокол и выше.
Это конечно предложении из серии забраться на Эверест, в то время как ТС просто предложил сходить в ларёк за сигаретами, но тем не менее.
Совсем дурак чтоли? Это скопировано с зоны, откуда шмакси забрало) шмакси говорит юморист))Нужно было указать что скопиравно это все со шмакси
Насколько оправдано в UC приводить переменные к стринг-типу, если вначале уже была использована текстовая строка? По моему компилятору наплевать на такие кейзы.Посмотреть вложение 46097
Что за обход? Гугл транслит что ли? )
P.S.: интересно, сколько раз еще копи-пастнут этот пост, до того как удалят лишнюю скобку?
Код:RequestBypassToServer ( "_dispel:" $ string ( skillInfo. SkillID ) $ "," $ string ( skillInfo. SkillLevel ) ) ) ;
local float f;
f = 25.4;
RequestBypassToServer ( "shas int otpravim, eba: " $ string(int(f)) ) ;
компилятор автоматически добавит вызов этого приведения, если потом взглянешь на декомпил, сам в этом убедишься, по этому по сути не имеет значения, делать это самому руками или же компилятор добавит это самостоятельноНасколько оправдано в UC приводить переменные к стринг-типу, если вначале уже была использована текстовая строка? По моему компилятору наплевать на такие кейзы.
Следую аналогичной логике, можно ещё более кислотные конструкции строить -
C#:local float f; f = 25.4; RequestBypassToServer ( "shas int otpravim, eba: " $ string(int(f)) ) ;
Сорян чуть подобосрался, ТС и на шмакси данный мануал писалСовсем дурак чтоли? Это скопировано с зоны, откуда шмакси забрало) шмакси говорит юморист))
Чисто формально, пакет появился в GP1, поэтому наверняка можно апнуть и чуть-чуть ниже. (например до 83). А интерфейс всегда можно кастрироватьПод адекватными я имею ввиду 152 протокол и выше.
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?