Пакет ExMonsterBookRewardFactionUI

Gaikotsu

яжпрограммист
Легенда
Сообщения
1 776
Розыгрыши
0
Решения
29
Репутация
6 247
Реакции
2 879
Баллы
2 188
Хроники
  1. Grand Cursade
Исходники
Присутствуют
Сборка
своя
Кто нибудь из тех кто реализовывал бестиарий, может подсказать на кой фиг этот пакет нужен, где его слать и с какой структурой?
А то единственный пакет, связанный с бестиарием, который я так и не могу понять куда присобачить.
На отправку пустого пакета клиент никак не реагирует.

З.Ы. опкод 0x1BF, если что.
 
Сам не имплементил просто пробегал мимо в 196 протоколе:
"c" //Count
for (Count) {
"c" //FractionID обрабатывается в NConsoleWnd::OnReceiveFactionDataRewardIcon и посылает ивент 10170.
"c" //User::SetUserFactionInfoRewardIcon в который подаеются оба параметра.
}
 
Последнее редактирование:
если я верно понял,то в клиенте есть какие-то структуры относящиеся к этому

C#:
struct native constructive L2UserFactionUIInfo
{
    var int        nFactionID;
    var int        nFactionLevel;
    var float    fFactionPointRate;
    var bool    bIsFactionLevelLimited;
    var bool    bIsFactionRewardIcon;
};

struct native constructive L2FactionLevelUIData
{
    var int        nFactionLevel;
    var string    strIconTexture;
    var array<int> arrQuestID;
    var array<int> arrQuestLevel;
    var array<string> arrQuestName;

    var array<string> arrFactionRewardTitle;
    var array<string> arrFactionRewardDesc;
    var array<int> arrFactionRewardGroup;
};

struct native constructive L2FactionUIData
{
    var int        nFactionID;
    var string    strFactionName;
    var string    strEmblemTexture;
    var string    strEmblemBigTexture;
    var string    strFactionDesc;
    var array<string> arrFactionNPCName;
    var array<int> arrFactionAreaZoneID;
    var array<string> arrFactionAreaName;
    var array<int> arrFactionAreaLevel;
    var int        nRegionID;                // 월드맵 개선(#3328) - moonhj
    var int        nMonsterbookUse;
    var array<L2FactionLevelUIData>    arrLevelData;
};
// end of Faction System

struct native constructive L2MonsterBookUIData
{
    var int        nMonsterBookID;
    var int        nSortOrder;
    var int        nNpcID;
    var int        nNpcLevel;
    var string    strNpcName;
    var string    strNpcNick;
    var INT64    nNpcHP;
    var INT64    nNpcMP;
    var array<int>        arrNpcProperty;
    var int        nTrophyLevel;    // 단계(별 개수, 4: clear)
    var int        nTrophyCount;    // 현재
    var int        nTrophyMax;        // 목표, Count == Max -> 보상
    var array<int>        arrDropItemID;
    var array<string>    arrDropItemName;    // for search
    var string    strCardTexture;
    var string    strCardPanel;
    var int        nZoneID;
    var string    strZoneName;
    var int        nFactionID;
    var string    strFactionName;
    var string    strFactionEmblem;
    var array<int>        arrRewardFP;
    var array<INT64>    arrRewardExp;
    var array<int>        arrRewardSP;
    var array<int>        arrRewardItem1;
    var array<int>        arrRewardItem2;
    var array<int>        arrRewardItem3;
    var array<int>        arrRewardItem4;
    var int        nViewX;
    var int        nViewY;
    var float    fViewScale;
    var int        nViewRot;
    var int        nViewDist;
};
 
Ну судя по коду структура L2UserFactionInfo мапится на L2UserFactionUIInfo и в последствии становится bIsFactionRewardIcon. NConsoleWnd::OnReceiveFactionDataRewardIcon отправляет ивент 10170, не знаю что он там модифицирует.
 
EV_FactionInfoRewardIcon

ну судя по всему стрингу с иконкой шлёт,по логике
Он шлет стрингу с FactionID в формате FactionID%d. Ну короче это уже совсем другая история
Обработчик как понимаю в GFX ?)))
 
Обработчик как понимаю в GFX ?)))
ну естественно,куда без него

закреплю сразу уж и анриалскриптовский класс,который регистрирует этот эвент,за ради инфы
может кто в итоге гфикс декомпильнёт,ибо я выше ХФ клиентов не имею
C#:
class FactionWnd extends L2UIGFxScript;

const TYPE_FACTION_START_NPC = 2;

function OnRegisterEvent()
{  
    // 10080
    registerGfxEvent( EV_FactionInfo );      
    registerGfxEvent( EV_FactionInfoRewardIcon );  
}

function OnLoad()
{      
    AddState( "GAMINGSTATE" );
    SetContainerWindow(WINDOWTYPE_DECO_NORMAL, 3443);
}

function onHide ()
{
    eraseStartNpcRegioninfo ();
}

function onCallUCFunction ( string functionName, string param )
{  
    switch  ( functionName )
    {
        case "showStartNPC" :
            showStartNpc ( param ) ;
        break;
        case "hideStartNPC":
            eraseStartNpcRegioninfo();
        break;
    }
}

// 시작 NPC 위치 보여주기
function showStartNpc ( string param )
{
    local Vector XYZ;
    local int x, y, z;
    local string  npcName;
    local MinimapCtrlHandle m_MiniMap;
    local MinimapWnd mapScript ;
    local MinimapRegionInfo regionInfoForMapIcon;

    mapScript = MinimapWnd( GetScript( "MinimapWnd"));

    m_MiniMap = GetMinimapCtrlHandle( "MinimapWnd.Minimap" );

    if (!GetWindowHandle("MinimapWnd").IsShowWindow()) GetWindowHandle("MinimapWnd").ShowWindow();

    parseString ( param, "npcName", npcName );
    parseInt ( param, "StartNpcX", x );
    parseInt ( param, "StartNpcY", y );
    parseInt ( param, "StartNpcZ", z );
   
    XYZ.x = x ;
    XYZ.y = y ;
    XYZ.z = z ;
   
    // 위치 이동
    mapScript.SetContinent(m_MiniMap.GetContinent(XYZ));  
    class'UIAPI_MINIMAPCTRL'.static.AdjustMapView( "MinimapWnd.Minimap", XYZ, false );
   
    m_MiniMap.SetShowRegionInfoByType(EMinimapRegionType.MRT_Etc, true);

    regionInfoForMapIcon = makeRegionInfo (npcName, XYZ);
    m_MiniMap.EraseRegionInfoCtrl(EMinimapRegionType.MRT_Etc, TYPE_FACTION_START_NPC) ;
    m_MiniMap.AddRegionInfoCtrl(regionInfoForMapIcon);  
}

// 시작 NPC 위치 삭제
function eraseStartNpcRegioninfo ()
{
    local MinimapCtrlHandle m_MiniMap;  
    m_MiniMap = GetMinimapCtrlHandle( "MinimapWnd.Minimap" );
    m_MiniMap.EraseRegionInfoCtrl(EMinimapRegionType.MRT_Etc, TYPE_FACTION_START_NPC) ;
}

// 시작 NPC 위치 아이콘 만들기
function MinimapRegionInfo makeRegionInfo( string tooltipString,  Vector pLoc )
{
    local MinimapRegionInfo regionInfoForMapIcon;
    local MinimapRegionIconData iconData;
    local string toolTipParam;

    toolTipParam = "";  
    ParamAdd(toolTipParam, "tooltipString", tooltipString);
    ParamAdd(toolTipParam, "Type", String ( int ( EMinimapRegionType.MRT_Etc )));  
    regionInfoForMapIcon.strTooltip = toolTipParam;

    regionInfoForMapIcon.eType = EMinimapRegionType.MRT_Etc;
    regionInfoForMapIcon.nIndex = TYPE_FACTION_START_NPC; //huntingZoneData.nSearchZoneID;
    //regionInfoForMapIcon.strDesc = tooltipString;

    iconData.nWidth = 32;
    iconData.nHeight = 32;
    iconData.nWorldLocX = pLoc.x;// - iconData.nIconOffsetX; // 3197;  // - 3197 은 기획(조중곤), 16픽셀에 해당하는값.
    iconData.nWorldLocY = pLoc.y;// - iconData.nIconOffsetY; // 3197;
    iconData.nWorldLocZ = pLoc.z;
    iconData.nIconOffsetX = -3;
    iconData.nIconOffsetY = -20;

    iconData.strIconNormal = "L2UI_CT1.Minimap.Minimap_DF_Icon_Pin_Campaign_Over";
    iconData.strIconOver   = "L2UI_CT1.Minimap.Minimap_DF_Icon_Pin_Campaign";
    iconData.strIconPushed = "L2UI_CT1.Minimap.Minimap_DF_Icon_Pin_Campaign_Over";      

    regionInfoForMapIcon.iconData = IconData ;
    return regionInfoForMapIcon ;
}
 
ну естественно,куда без него
Ну и хрен с ним, может гляну если найду свои поделки для просмотра этой хрени)

Отбой, хендлер пустой в GFX:
JavaScript:
 override public function onEvent(param1:int, param2:Object) : void
      {
         var _loc3_:int = 0;
         var _loc4_:int = 0;
         var _loc5_:Array = null;
         var _loc6_:int = 0;
         var _loc7_:int = 0;
         switch(param1)
         {
            case FactionWndEvent.EV_FactionInfo:
               if(!L2UISystem.isShowWindow(root.loaderInfo.url))
               {
                  return;
               }
               FactionWndData.paramInsert(param2,FactionWndData.EV_FactionInfoParam);
               _loc3_ = -1;
               _loc4_ = this.mainForm.list.selectedIndex;
               if(_loc4_ != -1)
               {
                  _loc3_ = this.subWindow.currFactionID;
               }
               FactionWndData.factionWndFactionDataProvider.cleanUp();
               _loc5_ = FactionWndNative.getUserFactionInfoList();
               _loc5_.sortOn(["FactionLevel","FactionPointRate","FactionID"],[Array.DESCENDING | Array.NUMERIC,Array.DESCENDING | Array.NUMERIC,Array.CASEINSENSITIVE]);
               _loc6_ = 0;
               while(_loc6_ < _loc5_.length)
               {
                  FactionWndData.factionWndFactionDataProvider.push(_loc5_[_loc6_]);
                  _loc6_++;
               }
               FactionWndData.factionWndFactionDataProvider.invalidate();
               if(_loc3_ != -1)
               {
                  _loc7_ = FactionWndData.getIndexByFactionID(_loc3_);
                  if(_loc4_ == _loc7_)
                  {
                     root.dispatchEvent(new Event(Event.CHANGE));
                  }
                  else
                  {
                     this.mainForm.list.selectedIndex = FactionWndData.getIndexByFactionID(_loc3_);
                  }
               }
               break;
            case FactionWndEvent.EV_FactionInfoRewardIcon:
         }
      }
 
Люблю такие темы, где я вообще не одупляю что происходит)

lordofdest,
А можно чучуть к коду докопаться?)
У тебя там в свтиче еще что-то есть? А то не сильно видно смысл от него.

Еще вопрос: ты пару раз используеь -1 как значение. У нас принято использовать константы, если это > 2 раз.
+ возможно где-то еще она же есть... ( просто мысли в слух)


JavaScript:
               if(_loc3_ != -1)
               {
                  _loc7_ = FactionWndData.getIndexByFactionID(_loc3_);
                  if(_loc4_ == _loc7_)
                  {
                     root.dispatchEvent(new Event(Event.CHANGE));
                  }
                  else
                  {
                     this.mainForm.list.selectedIndex = FactionWndData.getIndexByFactionID(_loc3_);
                  }
               }
               break;
Тут можно early return заюзать чтобы по красивому) В начале же юзал)
 
попробовал со структурой указанной lordofdest отсылать, в разных ситуациях, с разными открытыми окнами связанными с фракциями и бестиарием - так никакого результата и не увидел.
вобщем странный и непонятно зачем нужный пакет...
 
кароче в анриалскрипте есть NoticeWnd и оно регистрирует эвент (не в gfx) EV_MonsterBookRewardIcon

помав он выполняет:
C#:
    else if ( Event_ID == EV_MonsterBookRewardIcon )
    {
        // 몬스터 도감 보상 조건 완료
        createNoticeButton(    ENoticeType.TYPE_MONSTERBOOK, 3511);
    }

полагаю, пакет нужен для того,что бы выплюнуть какую-нибудь мигающую иконку над меню

а может я и не прав,ибо тогда не до конца понятно,что в нём слать,что бы было приятно
 
Дык для этогого есть другие пакеты - для фракций это ExFactionLevelUpNotify, а для бестиария ExMonsterBookRewardIcon
и они вполне работают, а вот от этого пакета эффекта 0, в каких бы я комбинациях его не слал.
 

Похожие темы

Ответы
4
Просмотры