Форум работает в тестовом режиме. Все данные были перенесены со старого сайта 2018 года. Некоторая информация может быть недоступна, например вложения или хайды. Просьба сообщать о данных случаях через функционал "Жалоба", прямо под постом, где отсуствуют данные из хайда или проблемы с вложением.
Могут быть проблемы в "выкидыванием" с форума (слетевшей авторизацией). Нужно собрать статистику таких случаев.
Есть Тема, куда можете сообщить о проблемах с сайтом либо просто передать привет.

Таймер для дебафов

Рег
6 Апр 2017
Сообщения
17
Реакции
0
Таймер для дебафов ИНТЕРЛЮД

qq all.
А как вообще четкие пасаны делают такую фичу? Если ничего не путаю, то нужно в либах ковыряться каких-то (nwindow.dll вроде). И чего там искать-то? И вообще КАК? там же всё а-ля
:??0FCustomTooltip@@QAE@XZ
Для меня это такой высший пилотаж, что даже и не мечтаю когда-нибудь допереть до всего этого...

Потому и делаю через костыль с анреалскриптами. грубо говоря - время жизни бафов и дебафов (ведь клиенту нужно же знать, сколько должен висеть этот красный квадратик) шлется от сервера для отображения их на панели скиллов в AbnormalStatusWnd.uc. А потом уже в ToolTip.uc начинаются свои нюансы.
if (!IsDeBuff(Item.ClassID, Item.Level) && Item.Reserved>=0)
{
код прорисовки тултипа чтобы при наведении на скилл показывался кулдаун. И как видно из условия, секция для отрисовки времени будет только для недебафов и, более того, эффектов, которые имеют int параметр >0. А дебафы, что самое печальное, в этом параметре всегда имеют -1.
}
и что я делаю сейчас:
добавляю 3 строчки в функцию HandleAddNormalStatus класса AbnormalStatusWnd.uc
function HandleAddNormalStatus(string param)
{
local int i;
local int Max;
local int BuffCnt;
local StatusIconInfo info;
local DebufTimeInformer script;

script = DebufTimeInformer ( GetScript ( "DebufTimeInformer" ) );
ClearStatus(false, false);
info.Size = 24;
info.BackTex = "L2UI.EtcWndBack.AbnormalBack";
info.bShow = true;
info.bEtcItem = false;
info.bShortItem = false;
BuffCnt = 0;
ParseInt(param, "Max", Max);
for (i=0; i<Max; i++)
{
ParseInt(param, "SkillID_" $ i, info.ClassID);
ParseInt(param, "SkillLevel_" $ i, info.Level);
ParseInt(param, "RemainTime_" $ i, info.RemainTime);
ParseString(param, "Name_" $ i, info.Name);
ParseString(param, "IconName_" $ i, info.IconName);
ParseString(param, "Description_" $ i, info.Description);
if (IsDeBuff(info.ClassID, info.Level))
script.ShowMsg( info.ClassID, info.Name, info.RemainTime);
if (info.ClassID>0)
{
if (BuffCnt%NSTATUSICON_MAXCOL == 0)
{
m_NormalStatusRow++;
class'UIAPI_STATUSICONCTRL'.static.InsertRow("AbnormalStatusWnd.StatusIcon", m_NormalStatusRow);
}
class'UIAPI_STATUSICONCTRL'.static.AddCol("AbnormalStatusWnd.StatusIcon", m_NormalStatusRow, info);
BuffCnt++;
}
}
if (m_EtcStatusRow>-1)
{
m_EtcStatusRow = m_NormalStatusRow + 1;
}
if (m_ShortStatusRow>-1)
{
m_ShortStatusRow = m_NormalStatusRow + 1;
}
UpdateWindowSize();
}
то есть во время прорисовки бафов проверяется, дебаф ли это и в случае тру, посылаются три переменные (ClassID, Name, RemainTime) в функцию ShowMsg класса, который дополнительно создал.
В коде далее будет видно, что порядковый элемент массива = айди дебафа. :facepalm: а это четырехзначные числа...
Опять же повторюсь, это пока для тестирования и использование динамических массивов будет изменено на обычные массивы или вообще можно как-нибудь изъебнуться и обойтись только локальными переменными и одним-единственным массивом. Сколько вообще можно иметь максимально допустимо одновременно висящих на персе дебафов? Поди 10 штук наверное. Вот и можно ограничиться этим количеством [10]

т.е. в этом новом классе DebufTimeInformer.uc имеется функция ShowMsg( int tab, string name, int timer ), которая и содержит всю нужную инфу: айди дебафа, название, оставшееся время. Вот тут и напрашивается идея создать таймер с обратным отсчетом, чтобы выводить эту инфу на экран (в идеальном варианте - писать в тултип поверх скилла в абнормал статус)

пока что не идеальный вариант:
class DebufTimeInformer extends UICommonAPI;


var array<int> TimeOnStart;
var array<int> requiredTime;
var array<int> delta;
var array<string>msg;

var Color colorCyan;
var WindowHandle ME;

function OnLoad()
{
colorCyan.R = 7;
colorCyan.G = 222;
colorCyan.B = 215;
colorCyan.A = 255;
Me = GetHandle ( "DebufTimeInformer" );
}

function OnTimer ( int TimerId )
{
local int tab;

tab = int (Left(TimerId,4));
if ( TimerId == tab )
{
Me.KillTimer ( tab );
Countdown ( tab );
}
}

function int Gettooltip( int ID ) // в планах вызывать эту функцию из ToolTip.uc чтобы писать время так же как и обычных скиллов
{
local int i_time;
i_time = delta[id];
return i_time;
}

function ShowMsg( int tab, string name, int timer )
{
AddSystemMessage ( "ID "$ tab $ "\\n Name "$ name $ "\\n timer " $ timer, colorCyan );
Me.KillTimer( tab );
TimeOnStart[tab] = SystemTime();
requiredTime[tab] = timer;
msg[tab] = name;
class'UIAPI_TEXTBOX'.static.SetTextColor( "DebufTimeInformer.info1", colorCyan );
Countdown( tab );
}

function Countdown( int tab )
{
local string s_time, s_info;

delta[tab] = TimeOnStart[tab] - SystemTime() + requiredTime[tab];
if( delta[tab] <= 0 )
{
s_time = "00:00";
Me.KillTimer( tab );
HideWindow("DebufTimeInformer");
}
else
{
s_time = Time2Str( delta[tab] );
Me.SetTimer( tab,1000 );
ShowWindow("DebufTimeInformer");
UpdateWindowSize();
}
s_info = msg[tab] @ s_time;
class'UIAPI_TEXTBOX'.static. SetText ( "DebufTimeInformer.info1", s_info );
}

function string Time2Str(int time)
{
local string s_result, s_sec, s_min;
local int i_sec, i_min;

i_sec = time % 60;
i_min = time / 60;
if ( i_sec<10 )
s_sec = "0" $ string(i_sec);
else
s_sec = string(i_sec);
if( i_min<10 )
s_min = "0" $ string(i_min);
else
s_min = string(i_min);
s_result = s_min $ ":" $ s_sec;
return s_result;
}

function int SystemTime()
{
local string time;
local int i_time;

time = GetTimeString();
i_time = int(Left(time,2))*60*60+int(Mid(time,3,2))*60+int(Right(time,2));
return i_time;
}

defaultproperties
{
}

ну и вдобавок создается одноименный винд с текстбоксом info1 в interface.xdat. Как видно в видео, на экране показывается таймер только для последнего дебафа. Впрочем, еще раз повторюсь, код был набросан вчера вечером, чтобы убедиться работает ли. Теперь уже можно сделать показ всех дебафов и компоновать их в один блок или размещать один под другим, короче - реализаций полно. Вот с тултипом пока еще не разобрался, а точнее с ParamAdd(m_Info.Condition, "Type", "RemainTime"); Добавил в ToolTip.uc:
local string kokoko;
local DebufTimeInformer script;
script = DebufTimeInformer ( GetScript ( "DebufTimeInformer" ) );
...
...
if (IsDeBuff(Item.ClassID, Item.Level) == true )
{
kokoko = string (Script.Gettooltip(Item.ClassID));
StartItem();
m_Info.eType = DIT_TEXT;
m_Info.nOffSetY = 6;
m_Info.bLineBreak = true;
m_Info.t_bDrawOneLine = true;
m_Info.t_color.R = 163;
m_Info.t_color.G = 163;
m_Info.t_color.B = 163;
m_Info.t_color.A = 255;
m_Info.t_ID = 1199;
EndItem();

StartItem();
m_Info.eType = DIT_TEXT;
m_Info.nOffSetY = 6;
m_Info.t_bDrawOneLine = true;
m_Info.t_color.R = 163;
m_Info.t_color.G = 163;
m_Info.t_color.B = 163;
m_Info.t_color.A = 255;
m_Info.t_strText = " : ";
EndItem();

StartItem();
m_Info.eType = DIT_TEXT;
m_Info.nOffSetY = 6;
m_Info.t_bDrawOneLine = true;
m_Info.t_color.R = 176;
m_Info.t_color.G = 155;
m_Info.t_color.B = 121;
m_Info.t_color.A = 255;
m_Info.t_strText = MakeBuffTimeStr(Script.Gettooltip(Item.ClassID)); // тек время как раз и берется из DebufTimeInformer.uc
ParamAdd(m_Info.Condition, "Type", "RemainTime");
//ParamAdd(m_Info.Condition, "Type", kokoko);
EndItem();
И без понятия, что вместо "RemainTime" нужно слать. Condition судя по UIEventManager.uc представляет из себя динамический тект. Даже не знаю, как это :Kappa: Пробовал так же слать и сюда string (Script.Gettooltip(Item.ClassID)), но эффект тот же - счетчик не отсчитывается. Только при добавлении/удалении бафов/дебафов происходит обновление счетчика.
Нид ХЭЛП по этому вопросу
[media]https://youtu.be/LQxoGH6TsMI[/media]
 
//dell, херню сморозил, не смотрел еще..))
 
Интерлюд говно. Делал для ХФ и сделал для моветоши под это говно. Теперь каждый пытается повторить.

Там все тривиально, что ппц.



Prihlop написал(а):
Если ничего не путаю, то нужно в либах ковыряться каких-то (nwindow.dll вроде)
nwindow.dll


Prihlop написал(а):
И как видно из условия, секция для отрисовки времени будет только для недебафов и, более того, эффектов, которые имеют int параметр >0. А дебафы, что самое печальное, в этом параметре всегда имеют -1.
Потому что кореяки чекают дебаф ли это. Если дебаф, то его время заменяют на -1 и не выводят, проверяя время в UC.


Prihlop написал(а):
Поди 10 штук наверное. Вот и можно ограничиться этим количеством [10]
Вообще их 12.

Как доделаю свой софт под интерлюд мб покажу как это выглядит на самом деле.
Скринов пока не будет ибо кликр отвалился нахер.
 
@Zubastic,
Вот спасибо за разъяснения. Значит обойдусь простым текстбоксом с выводом на экран по типу on screen сообщений.
 
Где скачать этот патч на тест что ты делал на дебафы? :daaa:
 
@h3ymars,

На самом деле очень полезный патч, особенной для серверов Интерлюд х1-х3, хотелось бы протестировать его. Не знаю где скачать :frog:
 
[member=133Mhz],
В теме же было описано, что нужно в скриптах править.
Пока временно подзабил на таймеры, вероятно где-то косяки будут. Да и с кодом нужно что-то ловчить, ибо пока не айс

в архиве 3 файла.
2 файла в папку system
1 файл в папку systextures. Файл с текстурами такой большой потому что делаю нечто совсем другое и всю доп графику запихиваю в 1 пакован.
Посмотреть вложение dbufftimers.rar

Суть такова:
debuff.jpg


debuf_optionsf.jpg
Перво-наперво нужно нажать кнопку для настройки. Она находится в статусном окне твоего персонажа. Потом поставить галки нужным членам группы. После нажать кнопку для настройки у того чара, инфа о котором интересует. С помощью стрелок располагаешь на экране, если вылезла за его пределы - щелкаешь центральную кнопку и все должно быть расположено по центру. Цвет по вкусу...

для каждого патимембера свои отдельные настройки. Цвет будет храниться в файле addonpanels.ini (он создастся автоматически после 1 запуска л2).И если не завтыкал проставить unk109 во всех окнах, то расположение оных будет сохранятся в файле WindowsInfo.ini. Ну чтобы не настраивать каждый раз

Доп инфо:
тип шрифта можно поменять вручную через тот же xdat editor. Например, дебафы у мейн чара такие жирные, потому что у параметра текстбоксов unk102 стоит 7. Обычный текст, например, = 0. Дебафам я поставил 1
sssss.jpg
 
@Prihlop,
Спасибо, вот моя почта отпиши мне [email protected], я тебе на пиво хоть закину :beer:
Очень годный патч! :shedevr: :shedevr: :shedevr: :zalubov:

@Prihlop,
После того как ставишь патч, пропадает возможность (стягивать и растягивать) статы ХП,ЦП,МП.
Это можно как-то пофиксить?
 
[member=133Mhz],
Ого, спасибо за отзыв. Кому-то кроме меня пригодилась эта штука.
Только не понял что именно нельзя стягивать растягивать? бар с полосками? Ведь даже увеличил пределы растягиваемости.

[media]https://youtu.be/Bb7KZDTCqfU[/media]

UPD:
Если всё же это, то в xdat файле в окне PartyWnd я изменил unk122 с "202" на "1000". И добавил один текстбокс чтобы показывался лвл патимемберов. И все.
Следовтельно, чтобы вернуть к изначальному виду, нужно поменять значение в unk122. Текстбокс никак не влияет
 
@Prihlop,
Да, я ошибся, нельзя стянуть до минимального значения (привык что они меньше, ну это такое, а растянуть можно ооочень длинно))
Патч классный, показывает даже лвл персонажа в пати.
Напиши кошелек яндекс денег, кину поддержку
Спасибо тебе
 
[member=133Mhz],
да вроде основной работы хватает, чтобы жить без нужды. Полез в скрипты л2 чисто для расширения кругозора.
Лучше задонать на серве где ты играешь пару лишних донок. Вот тем ребятам действительно нужна поддержка. :dadada:
 
@Prihlop, Критует когда игру сворачиваю, но всё равно норм тема молодец.
2017.9.8 19:19:18
OS : Windows Vista 6.1 (Build: 7601)
CPU : GenuineIntel PentiumPro-class processor @ 1797 MHz with 4095MB RAM
Video : Intel(R) HD Graphics 4000 (7878)

General protection fault!

History: FStaticTexture::GetTextureData <- l2ui_ch3.PlayerStatusWnd.ps_sizecontrol1 <- FD3DTexture::Cache <- FD3DRenderInterface::CacheTexture <- FD3DRenderInterface::HandleCombinedMaterial <- FD3DRenderInterface::SetSimpleMaterial <- FD3DRenderInterface::SetMaterial <- FCanvasUtil::Flush <- FCanvasUtil::BeginPrimitive <- FCanvasUtil::DrawTile <- UCanvas::DrawNormalText <- UCanvas::DrawTextToCanvas <- NCGDevice::DrawTextW <- NCNameCtrl::DrawName <- NCVirtualWndMain::DrawChildWindow <- NCVirtualWndMain::DrawChildWindow <- NCVirtualWndMain::DispatchWndMsg <- NConsoleWnd::ConsolePostRender <- UGameEngine::Draw <- UWindowsViewport::Repaint <- UWindowsClient::Tick <- ClientTick <- UGameEngine::Tick <- UpdateWorld <- MainLoop


Ещё есть вот такой момент
232323846e.png
 
Ну и извращения у вас однако, уважаемые.
16a9976aa95bae16f74e0fb064cd.png

Раз

ffc811b03f1a07079fb22d319513.png

Два
 
[member=133Mhz],
способ, который реализован у зубастика самый оптимальный для отображения таймера дебафов. Но для меня это СЛИШКАМ СЛОЖНА, ибо там, как писалось в теме ранее - лютый хардкор в длльках, хоть он [зубстик] и пишет, что на деле всё изи.


Насчет критов и снижения фпс - пасиба за оповещение. буду улучшать.
 
@Prihlop,
Такой способ наверное невозможно сделать для Инетрлюда. на скрине хроники выше? ;)
У меня не критует игра, что касается снижения ФПС, то этого замечено не было
 
133Mhz написал(а):
Prihlop, Такой способ наверное невозможно сделать для Инетрлюда. на скрине хроники выше? ;) У меня не критует игра, что касается снижения ФПС, то этого замечено не было
Копрофилы, оно и на интерлюде работает вашем.
 
@Zubastic,
Не нужно называть нас "копрофилами", мы же тебя не оскорбляли подобными словами ^_^
Покажи как надо это делать, или скинь для тестов данный патч.
:mlg2:
:kothype:
 
Назад
Сверху