Как отследить завершение, снятие бафа?

BIT_hack

Знающий
Участник
Сообщения
254
Розыгрыши
0
Решения
2
Репутация
79
Реакции
158
Баллы
485
Никак не могу сообразить как отследить, что баф закончился или сняли его канцелом?
В AbnormalStatusWnd.uc не нашел ничего подходящего и не могу придумать алгоритм.
Нужно получить ID бафай или имя иконки!
Может кто-то делал подобное подскажите?
Хроники: interlude
 

По идее при каждом изменении списка эффектов вычислять разницу с тем что было и тем что стало - в разнице и будет наложенный или снятый бафф/дебафф.
 
По идее при каждом изменении списка эффектов вычислять разницу с тем что было и тем что стало - в разнице и будет наложенный или снятый бафф/дебафф.
Это понятно но каждый раз гонять for, возможно есть другой способ?
EV_SystemMessage выдает только имя баффа больше нет параметров или я не могу их получить.
 
такие штуки лучше в сервер сайде отслеживать)
 
При завершении/ канселе бафа от сервера высылается пакет, попробуй с l2phx поймать его, может, получиться через скрипты обрабатывать их
 
ну по окончанию эффекта отсылать какой нибудь ивент в клиент) ты же меня сам учил)
Нет проблема в том, что неизвестно когда происходит событие и я хочу сделать это только на стороне клиента.
 
Нет проблема в том, что неизвестно когда происходит событие и я хочу сделать это только на стороне клиента.
ну тогда парсить чат месседж, других вариантов наверно нет
 
ну по окончанию эффекта отсылать какой нибудь ивент в клиент) ты же меня сам учил)
Сервер отсылает пакет клиенту и так, MagicEffectIcon
Попробуй покопать интерфейс deadz'a, там вроде было что-то такое
 
ну тогда парсить чат месседж, других вариантов наверно нет
В нем только имя бафа и толку нет от этого так как по имени не найти ид и имя иконки, я не смог(

Сервер отсылает пакет клиенту и так, MagicEffectIcon
Попробуй покопать интерфейс deadz'a, там вроде было что-то такое
Дело в том, что не все приходит в скрипты.
У deadz'a вроде нет такого как я помню.
 
Последнее редактирование модератором:
В нем только имя бафа и толку нет от этого так как по имени не найти ид и имя иконки, я не смог(
ну по идее если есть доступ к сервер сайду ты можешь хоть id посылать хоть имя баффа в месседже
 
У него есть, судя по ролику:
Под видео ссылки не работают на скачивания патча можешь скинуть его?

ну по идее если есть доступ к сервер сайду ты можешь хоть id посылать хоть имя баффа в месседже
Я просто на клиенте хочу отследить.

Нашел
Но скачать не могу весь патч интернет плохой скиньте пожалуйста в архиве interface.u и xdat
 
Под видео ссылки не работают на скачивания патча можешь скинуть его?


Я просто на клиенте хочу отследить.

Нашел
Но скачать не могу весь патч интернет плохой скиньте пожалуйста в архиве interface.u и xdat
Держи
 

Вложения

В патче у Deadz не разобрался.
Сделал так, вроде рабочий способ!

Файл: AbnormalStatusWnd.uc
C++:
var String NameSkillCancel;

//Стандартная функция
function OnLoad()
    {
      RegisterEvent(EV_SystemMessage);
      .......
      .......
      }

//Стандартная функция
function OnEvent(int Event_ID, string param)
    {
   if (Event_ID == EV_SystemMessage ) {
      HandleSystemMessage(Param);
      }
    }

//! Моя Функция для обработки системного сообщения
function HandleSystemMessage(String a_Param) {
 local int systemMsgIndex;
 local String Name;
  // Извлечение индекса системного сообщения из параметра
    ParseInt(a_Param, "Index", systemMsgIndex);
   // Извлечение имя бафа из параметра
    ParseString(a_Param, "Param1", Name);
 switch (systemMsgIndex) {
    case 92:
    case 749:
    NameSkillCancel = Name;
 break;
    }
    }

//Стандартная функция
function ClearStatus(bool bEtcItem, bool bShortItem) {
    .......
    .......

 if (info.ClassID>0)
    {
 if (info.bEtcItem==bEtcItem && info.bShortItem==bShortItem)
    {
    StatusIcon.DelItem(i, j);
    j--;
    ColCount--;

       //Добавил свой код
// Если имя из систем сообщения совпадает с удаленной иконкой то покажем ее на экране
 if (info.Name == NameSkillCancel) {
    TextureHandle(GetHandle("CancelSkillWnd.CancelIconTexture" )).SetTexture(info.IconName);
    }
       ////

    RowCountTmp = StatusIcon.GetRowCount();
 if (RowCountTmp != RowCount)
    {
    i--;
    RowCount--;

    }
    }
    }

    .......
    .......
    }
 
возможно, это поможет тебе, моя дорогая
этот код находится в интерфейсе l2aqua

C#:
class CancelCtrlWnd extends UICommonAPI;

const CANCEL_TIMER = 20100;
const MAX_CANCELED_BUFFS = 14;
const VARIABLE_TIMER = 20101;


var WindowHandle Me;

var TextureHandle tex[MAX_CANCELED_BUFFS];
var TextureHandle EmptyTest;
var bool Canceled;

var string SelfCancelBuffName;
//var string ArmorMacroCancel[4]

var int counter;

var string buffNames[MAX_CANCELED_BUFFS];



function OnRegisterEvent()
{
    RegisterEvent( EV_SystemMessage );
}

function OnLoad()
{
    InitHandle();
    OnRegisterEvent();
}

function InitHandle()
{
  local int i;

    Me = GetWindowHandle("CancelCtrlWnd");
   for( i=0; i<MAX_CANCELED_BUFFS; i++ )
    tex[i] = GetTextureHandle("CancelCtrlWnd.c_buff"$(i+1));

}

function OnTimer(int TimerID)
{
    //local int i;
  
    if (TimerID == CANCEL_TIMER)
    {
        Reset();
        Canceled = False;
        Me.KillTimer( CANCEL_TIMER );
        Me.KillTimer( VARIABLE_TIMER );
    }
   //Allow abnormalstatuswnd to start function StartCancelWnd
    if (TimerID == VARIABLE_TIMER)
    {
        Canceled = False;
        Me.KillTimer( VARIABLE_TIMER );
    }
  
}

function StartCancelWnd()
{

    Me.KillTimer(CANCEL_TIMER);
    Me.KillTimer( VARIABLE_TIMER );
    Me.SetTimer(CANCEL_TIMER,5000);
    Me.SetTimer(VARIABLE_TIMER,2500);
    Canceled = true;


}

function Reset()
{
  local int i;
 
   for( i=0; i<MAX_CANCELED_BUFFS; i++)
   {
    buffNames[i] = "";
    tex[i].SetTexture("");
   }

   canceled = false;
   counter = 0;
}

function OnEvent(int Event_ID, String param)
{
   if(class'UIAPI_CHECKBOX'.static.IsChecked("ExtraOptionWindow.CancelBox"))
      if (Event_ID == EV_SystemMessage)
        HandleSystemMessage(param);

}


function HandleSystemMessage(string param)
{
    local int msg_idx;
    local string buffName;

    ParseInt(param, "Index", msg_idx);
  
    if (msg_idx == 749) //Buff off
    {
        ParseString(param, "Param1", buffName);
    //No self cancel allowed hue
       if(SelfCancelBuffName != buffName)
       {
         buffNames[counter] = buffName;
         counter = ( counter + 1 )%14;
       }else{
         SelfCancelBuffName = "";
         //AddSystemMessageString( "suck it self cancel" );
       }
      

    }
}


defaultproperties
{
}

AbnormalStatusWnd.uc
C#:
//특정한 Status들을 초기화한다.
function ClearStatus(bool bEtcItem, bool bShortItem)
{
    local int i;
    local int j;
    local int RowCount;
    local int RowCountTmp;
    local int ColCount;
    local StatusIconInfo info;
    local int z;
   
    //Normal¾ÆÀÌÅÛÀ» ÃʱâÈÇÏ´Â °æ¿ì¶ó¸é, Normal¾ÆÀÌÅÛÀÇ ÇöÀçÇàÀ» ÃʱâÈÇÑ´Ù.
    if (bEtcItem==false && bShortItem==false)
    {
        m_NormalStatusRow = -1;
        m_SongDanceStatusRow = -1;
        m_DebuffRow = -1;
        m_TriggerSkillRow = -1;
    }
    //Etc¾ÆÀÌÅÛÀ» ÃʱâÈÇÏ´Â °æ¿ì¶ó¸é, Etc¾ÆÀÌÅÛÀÇ ÇöÀçÇàÀ» ÃʱâÈÇÑ´Ù.
    if (bEtcItem==true && bShortItem==false)
    {
        m_EtcStatusRow = -1;
        //~ m_ShortStatusRow = -1;
    }
    //Short¾ÆÀÌÅÛÀ» ÃʱâÈÇÏ´Â °æ¿ì¶ó¸é, Short¾ÆÀÌÅÛÀÇ ÇöÀçÇàÀ» ÃʱâÈÇÑ´Ù.
    if (bEtcItem==false && bShortItem==true)
    {
        m_ShortStatusRow = -1;
        //~ m_EtcStatusRow = -1;
    }
   
    RowCount = StatusIcon.GetRowCount();
    for (i=0; i<RowCount; i++)
    {
        ColCount = StatusIcon.GetColCount(i);
        for (j=0; j<ColCount; j++)
        {
            StatusIcon.GetItem(i, j, info);
           
            //Á¦´ë·Î ¾ÆÀÌÅÛÀ» ¾ò¾î¿Ô´Ù¸é
            if (IsValidItemID(info.ID))
            {
                if (info.bEtcItem==bEtcItem && info.bShortItem==bShortItem)
                {
                    StatusIcon.DelItem(i, j);
                    j--;
                    ColCount--;
                       
                        for(z=0; z<script_cancel.MAX_CANCELED_BUFFS; z++)
                        {

                         if (info.Name == script_cancel.buffNames[z])
                         {
                            //AddSystemMessageString(info.Name$" = "$script_cancel.buffNames[z]);
                            //AddSystemMessageString("counter = "$script_cancel.counter);
                            //AddSystemMessageString("Canceled = "$script_cancel.Canceled);

                            script_cancel.tex[z].SetTexture(info.IconName);
                            //fixing a display bug
                            //z = script_cancel.MAX_CANCELED_BUFFS;

                            if(!script_cancel.Canceled)
                            {
                              script_cancel.StartCancelWnd();
                            }
                         }

                        }
                       
               
                    RowCountTmp = StatusIcon.GetRowCount();
                    if (RowCountTmp != RowCount)
                    {
                        i--;
                        RowCount--;
                    }
                }
            }
        }
    }
}
 
возможно, это поможет тебе, моя дорогая
этот код находится в интерфейсе l2aqua
Спасибо посмотрел , реализовано как я выше выложил, на данный момент думаю это единственный способ реализации.
По поводу перевода, Дорогая = Feminine, Дорогой = Masculine. У меня masculine gender)))
 
Назад
Сверху Снизу