Это понятно но каждый раз гонять for, возможно есть другой способ?По идее при каждом изменении списка эффектов вычислять разницу с тем что было и тем что стало - в разнице и будет наложенный или снятый бафф/дебафф.
Это как?такие штуки лучше в сервер сайде отслеживать)
ну по окончанию эффекта отсылать какой нибудь ивент в клиент) ты же меня сам учил)Это как?
Нет проблема в том, что неизвестно когда происходит событие и я хочу сделать это только на стороне клиента.ну по окончанию эффекта отсылать какой нибудь ивент в клиент) ты же меня сам учил)
ну тогда парсить чат месседж, других вариантов наверно нетНет проблема в том, что неизвестно когда происходит событие и я хочу сделать это только на стороне клиента.
Сервер отсылает пакет клиенту и так, MagicEffectIconну по окончанию эффекта отсылать какой нибудь ивент в клиент) ты же меня сам учил)
В нем только имя бафа и толку нет от этого так как по имени не найти ид и имя иконки, я не смог(ну тогда парсить чат месседж, других вариантов наверно нет
Дело в том, что не все приходит в скрипты.Сервер отсылает пакет клиенту и так, MagicEffectIcon
Попробуй покопать интерфейс deadz'a, там вроде было что-то такое
У него есть, судя по ролику:Дело в том, что не все приходит в скрипты.
У deadz'a вроде нет такого как я помню.
ну по идее если есть доступ к сервер сайду ты можешь хоть id посылать хоть имя баффа в месседжеВ нем только имя бафа и толку нет от этого так как по имени не найти ид и имя иконки, я не смог(
Под видео ссылки не работают на скачивания патча можешь скинуть его?У него есть, судя по ролику:
Я просто на клиенте хочу отследить.ну по идее если есть доступ к сервер сайду ты можешь хоть id посылать хоть имя баффа в месседже
ДержиПод видео ссылки не работают на скачивания патча можешь скинуть его?
Я просто на клиенте хочу отследить.
НашелВы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками Вход или Регистрация
Но скачать не могу весь патч интернет плохой скиньте пожалуйста в архиве interface.u и xdat
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--;
}
}
}
.......
.......
}
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
{
}
//특정한 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
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?