SMF - Just Installed!
UPDATE 12:
JULY 2018
- Custom NPC move
- CustomCommandInfo (v2)
- Custom RankUser OverHead
- Custom Party Icon(s4/s6)
- Trade Value
- Party Disable PK
- New Anti SpeedHack Skill System
- Update TvtEvent new requistes
- Add Auto Heal Skill in /Attack
- Add Global Password System
- Option to show Rankuser in all places
- Option to Hide Reset in Rankuser
- Option to Hide MReset in Rankuser
- Option to Change MReset name in Rankuser
- Disable Party HpBar option
- Increase CustomShops to 100
- Fixes in custom buy vip windows
- Others fixes
UPDATE 13:
AUGUST
- GS and GSCS new interface
- MasterReset remove fixed resets
- Command Start Invasion
- Command Start Custom Arena
- Custom Quest Command (v2)
- Custom EventTime (v2)
- Custom Npc Quest
- Custom Npc Name up to 100
- Custom Pick (v2)
- Add Custom Pick Excelent
- Add Custom Pick Socket
- Add Custom Pick SetItem
- Enable Lucky item trade
- Disable Duel Restore HP
- Disable Duel Restore SD
- Require Reset/MResets to enter in room
- Add Reset/MasterReset Requisite on Create Character
- Fixes in MapServerMove
- Other fixes
UPDATE 14:
SEPTEMBER
- Custom RF Gloves (S6)
- Custom Start Item
- Custom Interdace (S6)
- Speed SkillHack auto bloc account
- Add PK disable shop option
- Add PK disable trade option
- Add SummonMonsterRate in CustomMonster.txt
- Show ping in game option
- Show Fps in game option
- Stop Auto Reset when vip is over
- Fix auto move from Icarus if dinorant/fenrir died
- Fix Custom CommandInfo (S8)
- Fix DL Summon Party Skill (PK)
- Fix Pk Item drop to PkLevel 3 only
- Fix BuyVip + CustomStore
- Fix GuildWareHouse + Lock command
- Fix Reset remove zen
- Fix OffPvp command in Events
- Fix RankUser in GameMaster
- Fix Start event option
- Fix in Disconnect Accounts
- Fix Npc Quest Add Buff
UPDATE 15:
OCTUBER
- Add Duel MaxScore Option
- Add CustomMove to CustomNpcCommand
- Add CustomExchangeCoin to CustomNpcCommand
- Add Pk Drop Item by map Option
- Add Berserker buff(SUM) in Custom Attack
- Auto Reward Online Users System
- Auto Party buff Mana shield in Custom Attack
- Custom Exchange Coin Command
- Custom Duel Bet
- Custom Mix
- Custom disable item glow
- Guils vs Guils Event
- Skill Summon enable PK Move Option
- MapManager.txt updated
- Skill Damage System
- Guild Assistant/Battle Master can get Cs Crown
- Fix S6 Duel Score with Custom Interface S1/S2/S3
- Fix update MasterReset/Reset in rank user
- Fix Master Reset check in Custom Move
- Fix Guild Warehouse Dupe
UPDATE 16:
- Add GVG Event to Client Event Time
- Client Error logs moved to Logs folder (S6)
- Custom Bow/Crossbow (V2)
- Custom Gloves for RF(S8)
- Custom Pets System
- Disable Move List (M) Option
- Disable Set +15 Effect Option
- Increased Set items limite to 255(S6)
- Increased Item color Name(S6)
- Increased Custom Bow limit to 100
- Increased Custom Effects to 5000
- Increased Custom Item Description to 2000(S4)
- Increased Custom NpcName to 200
- Fix mini wing preview
- Fix Swith character when dying
- Fix Kalima ticket gate level
- Fix Set item drop rate
- Fix Party request when dying
- Fix GVG and TVT required item
- Fix Custom Gloves inventory position(S6)
- Fix War score + custom interface(S6)
- Fix Personal Store change item price
- Fix Custom Store close button(s6)
UPDATE 17:
- Add Keep DL command status option
- Add Option CS Reset Accumulated Time when die
- Command OffPvP by Map
- Command Helper by Map
- Command SetParty
- Command Bloc Chat
- Custom Advanced Status
- Custom Increase FPS
- Custom Jewel Bank
- Custom Npc Requirement(VIP NPC)
- Custom Monster Power Table
- Custom Monster Information (Alt+Mouse Over)
- Fix Custom Interface + Crywolf Score(S4/s6)
- Fix Custom Interface + Cs Minimap (S4/s6)
- Fix Custom Interface Dark heaven skill position(S6)
- Fix Custom Item inventory turn on mouse over(S6)
- Fix mob movement when it is dying
- Fix Guild password (removed)
- Fix Ring Starter increase damage and speed attack
- Fix Battle Royale issues
- Fix Lucky Itens Options(S6)
- Fix CS gates damage when open
- Fix CS Statue/Gate attack by defensive guild
- Fix Party Special Experience
- Fix Summon ChaosMix (S8)
- Fix Custom Pet Dinorant type Fly Icarus/Tarkan
- Fix ChaosMachine+Expansion Invent problem(S6)
- Fix Master Scrolls without master level
- Fix Master Scrolls of Battle and Strength
- Increase GameServer performance
- New Resistence Calc System (Ring,Pendant)
- New Custom Pets Options
- Pets & Guardians no descrease life option
- Ranking GvG
- Ranking Battle Royale
- Update Character Damage Calc
UPDATE 18:
- Auto Disable Custtom Attack Command when vip is over
- Auto Disable Custtom Pick Command when vip is over
- Auto Disable Auto Reset Command when vip is over
- Auto Disable OffPvp Command when vips is over
- Allow Mu Helper + Inventory Option(S6/S8)
- Boss Top Hit item drop count System
- Command Set PK
- Custom Npc Quest Reward LevelUpPoint and Zen Option
- Custom Quest Save Monster Count
- Custom Quest Reward LevelUpPoint and Zen Option
- Custom Pet New Moviment (V3)
- Custom Pet New Options (v2)
- Custom Pet Static Effect System
- Custom Pet Dynamic Effect System
- Custom Pet increased to 100
- Disable Die effect Option
- Disable Battle Royale item drop time
- Disable Time to Pick Up a dropped item option
- Disable CashShop Option (X) (S6)
- Disable Command Window (D) Option (S4/S6)
- Disable FullMap (Tab) Option (S6)
- Increased Custom Monster performance
- Increased Death Stab Skill performance
- Increased Mu Helper Max Time(S6/S8)
- JoinServer Updated to disconnect accounts
- Map by AccountLevel(Auto Move when vip is over)
- MonsterSetBase increased to 10000
- Rakilion(selupan) enable pvp option
- Trade By Map option
- Fix Custom Pet Dinorant type Fly Icarus/Tarkan(S6)
- Fix Battle Royale Trade
- Fix Summon Monster with Rank User
- Fix Custom Interface Numbers (S4)
- Fix Custom Interface favorite skill number (S4/S6)
- Fix Battle Royale DL command reset
- Fix Battle Royale Skins reset
- Fix TvtEvent Remove disconnected player
- Fix TvtEvent disable pvp in stand time
UPDATE 19:
- Custom Cloak
- Custom Jewel Updated
- Custom NPC requeriment - Class
- Custom disable ItemGlow/Excellent Effect(S4/S6)
- Custom Disable Systems(S4/S6)
- Custom Pet Glow
- Combo Effect when die
- Command Jewel Pack & UnPack (V2)
- Death Stab Skill hit multiplier option
- ItemMove.txt Updated
- New Menu System (S4/S6)
- Marry Command pk can't move option
- Lock Command bloc cashshop gift
- Fix Plasma Storm Skill decrease defense/durability
- Fix Castle siege Teleport Skill Bugs
- Fix Battle Royale Increase Health Effect
- Fix Custom Pet Dinorant type Height (S6)
- Fix GvG move when get disconnect
- Fix Custom Jewel green slot on mouse over (S6)
- Fix Custom Quest issues
- Fix party byff crash (s8)
- Fix Remedy of love effect
- Fix Guardian Effect
UPDATE 20
- Allow EarthQuake skill in a Custom DarkHorse
- Change Character Delete level option
- Custom Off Attack Auto Resume
- Custom Off Store Auto Resume
- Personal Store save values
- Global Chat show server name
- Custom Item by VIP, Resets, MasterResets
- Increase max invasion to 50
- Custom Font (S4/S6)
- Custom Post Item (S4/S6)
- Server Time
- Message.txt multi-language
- Reflect Damage by class balance
- Server Allow/Disallow Pk enter
- PersonalShop(Bless,Soul,Chaos) works toghether JewelBank
- Fix Cant disable Commands withou requisites
- Fix when Gvg and Tvt starts you can pvp in other maps
- Fix Reload quiz event
- Fix Duel Bet GS Crash (S8)
- Fix Double Goer move party
- Fix chat in russian language
- Fix Custom Jewel ancient apply on non-ancient items
- Fix Item 0,41 repair (S4,S6)
- Fix Summon Party closes the CS Gate
- Fix Switch character in Kalima
- Fix Set Party command issues
- Fix CustomBow auto reload arrow
- Fix Spirit of Guardian descrease damage in Pvp
- Fix PrintScreen in 1366x768 resolution
- Removed MuError.log (S4/S6)
Update 21:
- Add 9 New Maps Slots (Total 18) (S4,S6)
- Increase Max Custom Monsters to 200
- Incresed Max Global Message size
- Show Level+Master level in the status(S4/S6)
- Changed ExpBar in the interface Season 2/8 (S4/S6)
- New Custom Interfaces (S4/S6)
- New Downgrade Options (S4/S6)
- Quest Window
- Reduce Memory use (V2)
- RankUser by quets
- Fix Marry track/trace move in events
- Fix Marlon Auto move
- Fix Hamrmony Itens use 62 ~ 72 (S4)
- Fix Cashshop button with Season 2 interface
- Fix Lugard Window fix text on Wide resolution
- Fix DisableSkillEffect client crashs
- Fix CustomWing max durability
- Fix can trade/party when dying
- Fix update monster power table when reset/mreset
- Fix Rank user vip type to works with multi-lang
- [AntiDupe] Disabled Helper Config window click when use the Chaos maxhine
- [AntiDupe] New System antidupe to show in log the dupes
- [AntiDupe] Disabled CashShop open when have a item in the Chaos
- [AntiDupe] Check Dupes when move item in the Warehouse and inventory
- [AntiDupe] Check Dupes when logout chacter
- [AntiDupe] Check dupes before send a Jewel to Jewel Bank
- [AntiDupe] Check dupes before pack and unpack
Update 22:
- AntiFlood System - Add Dragon Sky Switch ON/OFF
- Custom Attack Skill Control
- Custom Monster Effect
- Custom Monster Glow
- Character Max Rate Settings
- Right Click move item to chaos
- Right Click Equip/Unquip items
- Rank User show level + master level option
- Select Character change interface(map)/char position(S4/S6)
- Select Character show level + master level option
- Select Character show reset/mreset option
- Select character show rank user option
- Select character animations option
- Select server change room names
- Custom Summon Scroll sytem
- Custom Npc quest auto open windown when click in the NPC
- Change min monster level party formula option
- Hack Skill Check New Type
- Disable attack when use teleport skill option
- Reset Keep DL Command Point by Account level
- Elf Buffer Show Quest Window Option (S6/S8)
- Fix chat for russian language (S8)
- Fix max ip connection problem with offattack/store
- Fix stop Sky dragon when invasion ends
- Fix common shop custom value index 256 ~ 512
- Fix SpeedHackSkill type 4 - bloc account
- Fix monster(traps) show rank user
- Fix Pet block stuck
- Fix add basic skill when reset/mreset
- Fix add basic skill when use changeclass command
- Fix Cutom Item Vip
- Fix Custom Pet Dinorant type Height (S4)
- Fix Custom Pet Dinorant type Fly Icarus/Tarkan(S4)
- Fix marry pk trace/track
- Fix two attack at the same time (CustomAttack)
- Fix Excellent items glow (S8)
- Fix Dark Horse look around (S4/S6)
- Fix Custom Monster HP Bar (S8)
- Fix DragonSky in the GSCS
- Fix Personal store open/buy with the lock command enabled
- Fix Mu Rummy cards desappear (S8)
- Fix Show JOH option in the ancient items (S8)
- Fix marry track trace move to/from kanturu
- Fix Blood Castle drop event item loot time
- Fix IllusionTemple drop event item loot time
- Fix show pets damage decrease on advanced status
- Fix Damage PvP 380 item
- Fix new Dupe Type
- Fix Rename less than 4 characters
- Fix QuestWorld count kill monsters in party
- Fix Move from icarus if no use a wing or pet
- Fix Equip transformation rings double change skin (s8)
- Fix Boss Monster no drops
- Fix Reflect Damage (NewDamageCalc = 1)
- Fix Mana shield max Rate
- Fix Greater Life Skill in party
UPDATE 23:
- Added warning message in the Duel bet
- Auction system (max 200 auctions)
- Change Item power system(Dmg,Def)
- Command Rename show global message option (ON/OFF)
- Command Reset add coins reward option
- Command Master Reset add coins reward option
- Guild War improvements
- Increased max customjewel to 50
- Increased max custom monster glow to 400
- Increased Max ItemtooltipLine to 1024(S6/S8)
- Increased Max CustomMix to 32.000
- New GS Interface
- New Store procedure WZ_SetPlayerKiller
- New Store procedure WZ_GetPlayerKiller
- New Store procedure WZ_RankingAll
- Master Skill upgraded (s6)
- Party Level Gap Option
- Pvp championship event
- Fix Battle royale trade
- Fix Battle royale others
- Fix Commands that didn't charge coins
- Fix Client Crashs when use panda ring in Kanturu
- Fix server close withot offilines
- Fix Show +Skill in the drop name
- Fix King of Mu Event
- Fix use teleport skill using CustomAttack
- Fix Master skill issues
- Fix customn quest inventory space
- Fix equip two transformation rings with right click
Update 24:
- Added 5 extra plugins in maininfo
- Anti Speed Hack Movement
- Battle Royale Event Drop itens when die option
- Blood Castle aplly the exp by rate of ExperienceTable
- Chaos Castle aplly the exp by rate of ExperienceTable
- Devil Square aplly the exp by rate of ExperienceTable
- Chaos Castle aplly the exp by rate of ExperienceTable
- Imp.Guardian aplly the exp by rate of ExperienceTable
- Custom Client Icon
- Custom Item Power increased to 1000
- Custom Monster Skill
- Custom Mix (v2)
- Disable Teleport Skill when Immobilized
- New Castle Siege damage rate options
- Disable Twist slash multi skill on cs option
- Item inventory reskin (Ex. Horn of fenrir)
- EventItemBag drops in inventory option
- New Character name style
- AllowWings380Opt (house skype) verificar
- Show Monster name (S4/S6)
- Change monster name color
- Mount Stuck rate option
- Reset Monster Hit damage when player die option
- Kundun boss use OrderOfProtection and Reffil HP
- Promotional Banner when enter in game
- Fix UserHp bar position
- Fix Illusion temple remove effects when enter
- Fix Npc Delgado window (lucky coin)(S8)
- Fix Mount speed s8 (S8)
- Fix Custom Jewel aplly on Arrow/Bolt
- Fix Master Experience after reset
- Fix move when is stuned
- Fix SetItem especial values
- Fix Item tooltip bugs (s6)
- Fix Items Name in the Auction/Customquest systems
- Fix Christmas ring
- Fix Box of Kundun glow (S8)
UPDATE 25:
- Auto resume OffHelper (S4/S8)
- Add Blood Castle allow buff in safe zone option
- Add Blood Castle allow pvp option
- Add Character close time option
- Add Command /Makeall /MakeallMap
- Add Command /DropAll /DropllMap
- Add ExcellentOptionRate.txt
- Add Imperial guardian reward experience option
- Add ItemOptionWing.txt
- Add Kanturu Multi-language system
- Add Russian Roulette Remove Rate option
- Add Status Points by master level option
- Advanced event item bag updated
- Combo with 1 or 2 skills
- Custom Menu Option
- Custom MiniMap type 2
- Custom Name Style (V2) (S4/S6)
- Custom sign by VIP or RankUser
- Event Entry Count Limit
- EventItemBag coins reward option
- GS Monster Drop info system
- Key Ctrl Attack enable/disable
- Main show confirmation messagebox to close option
- Max Game Instances
- Max Master Skill tree points
- Monster health bar updated(S4/S6)
- New MonsterSetBase system
- Npc Invasion option
- PK Zone system
- Fix Blood Castle gm wings
- Fix Blood Castle shows archangel on the back
- Fix Custom Jewel excellent in Wings 2nd
- Fix Custom Jewel excellent remove without using
- Fix Custom Jewel excellent add max options on wings
- Fix Custom Jewel option add random type in wings
- Fix Friend mail + trade zen bug
- Fix Kanturu global message only in kanturu map
- Fix Lock command can buy from a personal store
- Fix Some Skills use on Custom pet
- Fix duel command with command lock activeted
- Fix bottom black bar with Custom Interface(S4/S6)
- Fix turn into pk when kill other pk
- Fix snow lorencia/noria
- Fix Jewel bank + Npc Guardsman
- Fix Black shadow + Npc Guardsman
- Fix Illustion temple ticket right-click
- Fix impale skill with custom mounts pets
UPDATE 26:
- Add ItemLevel in the ItemOption.txt
- Add EventGvGMaxGuildMembers Option
- Custom Flag System
- Custom Pet Damage decrease option
- Disable Guild PK Option
- Gremory Case System
- New DefaultClassStatus.txt file
- New MasterResetTable.txt file
- Reset Reward item
- Master Reset Reward Item
- Online time Reward Item
- Party Search System(S4/S6)
- Store Search System(S4/S6)
- Open Store in Hunt zone Option
- Two Weapons Damage Rate
- Pk Limit Option
- Fix Indulgence item (13,60)
- Fix mastered frozen stab attack speed effetct
- Fix OffHelper items level name
- Fix TopHit Monster coin reward
- Fix Skill Inside Option
- Fix Custom Quest no inventory Space
- Fix Custom Quest LevelUpPoints when reset
- Fix Online time save into database
- Fix CustomRankUser by quest no save
- Fix Gvg Max guild option
- Fix Party Gap in the JoinParty command
- Fix Teleport skill bug with sleep or stun
- Fix Map move bug with sleep or stun effect
- Fix character can't use skill with Ice arrow.
- Fix Can move when use the Summon Skill
- Fix Dark spirit postion in view port (safezone)(créditos rafhael)
- Fix Personal store view port close when die
- Fix white boots when evolve to 3rd class
UPDATE 27:
- Blood Castle event by level/reset/mreset (S4/S6)
- Devil Square event by level/reset/mreset (S4/S6)
- Character Combo Skill Damage Settings to All class
- Character.dat Max Attack Speed Option
- Common shop items with serial
- Command Remaster v2
- Command delay save
- Command delay by vip
- Dropped item tooltip
- CustomPet allow skills in mount option
- CustomNpcRequeriment check if is pk to use option
- Item Option Combination
- Guild Warehouse Message
- Marathon Event
- Improvements to the Item Serial System
- Invasion Manager Updated
- Block pk move in gate.txt option
- New EventBags for marathon and PVP championship
- Block Gens leave option
- Increase Max Buff effects to 32(S6)
- Max Custom Item description increased to 3000 (S4)
- Max Custom gloves incresed to 40 (S6/S8)
- MasterReset required stats points option
- Fix Character creation cards (S6)
- Fix reset monster top hit damage when change/close character
- Fix Master skill table points
- Fix MG skill stop attacking if have a bk using twist slash(ex)
- Fix Twist slash when riding a mount (S6)
- Fix Marry trace/track to vulcanus
- Fix Personal store inventory full block other purchases
- Fix Seach store gameserver crash
- Fix CustomNpcQuest item expire time
- Fix CustomMonster summon respaw
- Fix JewelBank + Duel bet dupe jewels
- Fix Mini map click/walk in the s8 interface(S6)
- Fix Personal Shop Tittle cut (S6)
Update 28:
- Custom Auto Move
- Custom Invasion Information(v2)
- Custom Npc Collector (v2)
- Custom skin system
- Custom stack item
- Custom Item Bank
- Custom Shop v3(S4/S6)
- Custom Chat Interfaces(S4/S6)
- ItemOptionRate.txt Updated
- Reuse removed socket option
- Multiwarehouse interface (S4/S6)
- Fix Summ Attack speed when add status points
- Fix some problems in the marathon event
- Fix Heal and potions when use MuHelper
- Fix Custom add status with some buffs
- Fix CustomAddStatus open chat when press enter
- Fix ConfirmBox open chat when press enter
- Fix Custom Monster Sound problems
Update 29:
- Allow use asan Of Mobility after reset Option
- Allow pet mount in safezone option
- Infinity Arrow option
- Custom buff icon (S4/S6)
- Custom Item Fusion
- Custom Item title color (S6)
- Custom Item Power(v2) (S4/S6)
- Custom Lucky Wheel
- Custom Model effect
- Custom pet pick item (Muun Type)
- Custom PK reward
- Custom reset/master reset button
- New hack movement check options
- MapManager Drop Type
- Quest zyro system (S6/S8)
- Fix Infinity arrow reload when offline
- Fix Master Skill tree rebuild(S4)
- Fix use hack to crash the Gameserver
- Fix Monster name behind the invasion button
- Fix duel buff removed (S6/S8)
- Fix Custom pet mount sit in the game seates
Update 30:
- Allow Guild War by map option
- Allow Marry commands by map option(trace/track)
- Allow Cashshop by map option
- Auto Save Login
- Command Message Box
- Command Reward/Rewardall multilanguage message(S6/S8)
- Create account in game
- Custom Event Time (V2)
- Custom Guild Effect
- Custom Item Description
- Notice multilanguage(S6/S8)
- Max rate of Lesser Damage Skill by class option
- Max rate of Lesser Defense Skill by class option
- Max Coins limit
- Monster invasion amount by online players count
- Incoming Message icon and Warning
- Ice Arrow Skill rate/time option
- Party Master Experience
- Reload Map/Terrain Option
- Reload Message/Notice
- Fix Castle siege after click switch can't move(S6)
- Fix Gift command with Delay
- Fix Marry trace
- Fix MonsterPowerTable by Master level
- Fix Wz_Setcoin with cashshop disabled
Update 31:
- Chaos Mix item log
- Character Start Gate by map
- Command /make /drop updated
- Experience rate option
- Gate/Move check Level+Master level
- Guild Alliance Disable PK Option
- Item plus remove level amount option
- Max Level 65000
- New Admin commands
- Required item level check master level option
- Server log utf-8 option
- Fix remove iron skill when reset master skill tree(S8)
- Fix total points in the skill tree, over 255 (S6)
- Fix Life Stone drop in the common GS
- Fix EventItemBag stack drop
- Fix Castle siege icon change when get the crown
- Fix item info close client in widescreen (S6)
- Fix menu icon type 1 when shows item info window(S6)
Cita de: bin9xhn2 en Abr 01, 2025, 03:41 PMok voy a revisarCita de: Dakosmu en Mar 31, 2025, 08:32 PM[h5]Monster HP Bar main 5.2[/url][/h5]It seems that this source code is lacking. Can you fix it and indicate the additional part?
WsClient.cpp
Code: [Select]case 0xE2:
GCNewHealthBarRecv((PMSG_NEW_HEALTH_BAR_RECV*)ReceiveBuffer);
return 1;
.cpp
Code: [Select]CHealthBar gHealthBar;
CHealthBar::CHealthBar()
{
ClearNewHealthBar();
}
CHealthBar::~CHealthBar()
{
}
void GCNewHealthBarRecv(PMSG_NEW_HEALTH_BAR_RECV* lpMsg) // OK
{
gHealthBar.ClearNewHealthBar();
for (int n = 0; n < lpMsg->count; n++)
{
PMSG_NEW_HEALTH_RECV* lpInfo = (PMSG_NEW_HEALTH_RECV*)(((BYTE*)lpMsg) + sizeof(PMSG_NEW_HEALTH_BAR_RECV) + (sizeof(PMSG_NEW_HEALTH_RECV) * n));
gHealthBar.InsertNewHealthBar(lpInfo->index, lpInfo->type, lpInfo->rate, lpInfo->ViewHP);
}
}
void CHealthBar::ClearNewHealthBar() // OK
{
for (int n = 0; n < MAX_MAIN_VIEWPORT; n++)
{
gNewHealthBar[n].index = 0xFFFF;
gNewHealthBar[n].type = 0;
gNewHealthBar[n].rate = 0;
gNewHealthBar[n].ViewHP[0] = 0;
gNewHealthBar[n].ViewHP[1] = 0;
}
}
void CHealthBar::InsertNewHealthBar(WORD index, BYTE type, BYTE rate, DWORD* ViewHP) // OK
{
for (int n = 0; n < MAX_MAIN_VIEWPORT; n++)
{
if (gNewHealthBar[n].index == 0xFFFF)
{
gNewHealthBar[n].index = index;
gNewHealthBar[n].type = type;
gNewHealthBar[n].rate = rate;
gNewHealthBar[n].ViewHP[0] = ViewHP[0];
gNewHealthBar[n].ViewHP[1] = ViewHP[1];
return;
}
}
}
NEW_HEALTH_BAR* CHealthBar::GetNewHealthBar(WORD index, BYTE type) // OK
{
for (int n = 0; n < MAX_MAIN_VIEWPORT; n++)
{
if (gNewHealthBar[n].index != 0xFFFF)
{
if (gNewHealthBar[n].index == index && gNewHealthBar[n].type == type)
{
return &gNewHealthBar[n];
}
}
}
return 0;
}
void CHealthBar::DrawNewHealthBar()
{
float Width = 85.f;
char Text[100], Text2[100], Text3[100];
vec3_t Angle;
int ScreenX, ScreenY;
static float LastHP[MAX_MAIN_VIEWPORT] = { 0 };
static float DamageTimer[MAX_MAIN_VIEWPORT] = { 0 };
for (int j = 0; j < MAX_MAIN_VIEWPORT; ++j)
{
auto ViewportAddress = &CharactersClient[j];
if (!ViewportAddress) continue;
NEW_HEALTH_BAR* lpNewHealthBar = GetNewHealthBar(ViewportAddress->Key, ViewportAddress->Object.Kind);
if (lpNewHealthBar == 0) continue;
Vector(
ViewportAddress->Object.Position[0],
ViewportAddress->Object.Position[1],
ViewportAddress->Object.Position[2] + ViewportAddress->Object.BoundingBoxMax[2] + 100.f,
Angle);
if (ViewportAddress->Object.Kind == 2)
{
BeginOpengl(0, 0, GetWindowsX, GetWindowsY);
Projection(Angle, &ScreenX, &ScreenY);
EndOpengl();
ScreenX -= (int)(Width / 2);
// Texto do HP aprimorado
auto FormatNumber = [](int num) -> std::string {
char buffer[16];
if (num >= 1000000000) // 1 bilhão
sprintf(buffer, "%.1fKKK", num / 1000000000.0);
else if (num >= 1000000) //
Cita de: Dakosmu en Mar 31, 2025, 08:32 PM[h5]Monster HP Bar main 5.2[/url][/h5]It seems that this source code is lacking. Can you fix it and indicate the additional part?
WsClient.cpp
Code: [Select]case 0xE2:
GCNewHealthBarRecv((PMSG_NEW_HEALTH_BAR_RECV*)ReceiveBuffer);
return 1;
.cpp
Code: [Select]CHealthBar gHealthBar;
CHealthBar::CHealthBar()
{
ClearNewHealthBar();
}
CHealthBar::~CHealthBar()
{
}
void GCNewHealthBarRecv(PMSG_NEW_HEALTH_BAR_RECV* lpMsg) // OK
{
gHealthBar.ClearNewHealthBar();
for (int n = 0; n < lpMsg->count; n++)
{
PMSG_NEW_HEALTH_RECV* lpInfo = (PMSG_NEW_HEALTH_RECV*)(((BYTE*)lpMsg) + sizeof(PMSG_NEW_HEALTH_BAR_RECV) + (sizeof(PMSG_NEW_HEALTH_RECV) * n));
gHealthBar.InsertNewHealthBar(lpInfo->index, lpInfo->type, lpInfo->rate, lpInfo->ViewHP);
}
}
void CHealthBar::ClearNewHealthBar() // OK
{
for (int n = 0; n < MAX_MAIN_VIEWPORT; n++)
{
gNewHealthBar[n].index = 0xFFFF;
gNewHealthBar[n].type = 0;
gNewHealthBar[n].rate = 0;
gNewHealthBar[n].ViewHP[0] = 0;
gNewHealthBar[n].ViewHP[1] = 0;
}
}
void CHealthBar::InsertNewHealthBar(WORD index, BYTE type, BYTE rate, DWORD* ViewHP) // OK
{
for (int n = 0; n < MAX_MAIN_VIEWPORT; n++)
{
if (gNewHealthBar[n].index == 0xFFFF)
{
gNewHealthBar[n].index = index;
gNewHealthBar[n].type = type;
gNewHealthBar[n].rate = rate;
gNewHealthBar[n].ViewHP[0] = ViewHP[0];
gNewHealthBar[n].ViewHP[1] = ViewHP[1];
return;
}
}
}
NEW_HEALTH_BAR* CHealthBar::GetNewHealthBar(WORD index, BYTE type) // OK
{
for (int n = 0; n < MAX_MAIN_VIEWPORT; n++)
{
if (gNewHealthBar[n].index != 0xFFFF)
{
if (gNewHealthBar[n].index == index && gNewHealthBar[n].type == type)
{
return &gNewHealthBar[n];
}
}
}
return 0;
}
void CHealthBar::DrawNewHealthBar()
{
float Width = 85.f;
char Text[100], Text2[100], Text3[100];
vec3_t Angle;
int ScreenX, ScreenY;
static float LastHP[MAX_MAIN_VIEWPORT] = { 0 };
static float DamageTimer[MAX_MAIN_VIEWPORT] = { 0 };
for (int j = 0; j < MAX_MAIN_VIEWPORT; ++j)
{
auto ViewportAddress = &CharactersClient[j];
if (!ViewportAddress) continue;
NEW_HEALTH_BAR* lpNewHealthBar = GetNewHealthBar(ViewportAddress->Key, ViewportAddress->Object.Kind);
if (lpNewHealthBar == 0) continue;
Vector(
ViewportAddress->Object.Position[0],
ViewportAddress->Object.Position[1],
ViewportAddress->Object.Position[2] + ViewportAddress->Object.BoundingBoxMax[2] + 100.f,
Angle);
if (ViewportAddress->Object.Kind == 2)
{
BeginOpengl(0, 0, GetWindowsX, GetWindowsY);
Projection(Angle, &ScreenX, &ScreenY);
EndOpengl();
ScreenX -= (int)(Width / 2);
// Texto do HP aprimorado
auto FormatNumber = [](int num) -> std::string {
char buffer[16];
if (num >= 1000000000) // 1 bilhão
sprintf(buffer, "%.1fKKK", num / 1000000000.0);
else if (num >= 1000000) //
case 0xE2:
GCNewHealthBarRecv((PMSG_NEW_HEALTH_BAR_RECV*)ReceiveBuffer);
return 1;
}
CHealthBar gHealthBar;
CHealthBar::CHealthBar()
{
ClearNewHealthBar();
}
CHealthBar::~CHealthBar()
{
}
void GCNewHealthBarRecv(PMSG_NEW_HEALTH_BAR_RECV* lpMsg) // OK
{
gHealthBar.ClearNewHealthBar();
for (int n = 0;n < lpMsg->count;n++)
{
PMSG_NEW_HEALTH_RECV* lpInfo = (PMSG_NEW_HEALTH_RECV*)(((BYTE*)lpMsg) + sizeof(PMSG_NEW_HEALTH_BAR_RECV) + (sizeof(PMSG_NEW_HEALTH_RECV) * n));
gHealthBar.InsertNewHealthBar(lpInfo->index, lpInfo->type, lpInfo->rate, lpInfo->ViewHP);
}
}
void CHealthBar::ClearNewHealthBar() // OK
{
for (int n = 0;n < MAX_MAIN_VIEWPORT;n++)
{
gNewHealthBar[n].index = 0xFFFF;
gNewHealthBar[n].type = 0;
gNewHealthBar[n].rate = 0;
gNewHealthBar[n].ViewHP[0] = 0;
gNewHealthBar[n].ViewHP[1] = 0;
}
}
void CHealthBar::InsertNewHealthBar(WORD index, BYTE type, BYTE rate, DWORD* ViewHP) // OK
{
for (int n = 0;n < MAX_MAIN_VIEWPORT;n++)
{
if (gNewHealthBar[n].index == 0xFFFF)
{
gNewHealthBar[n].index = index;
gNewHealthBar[n].type = type;
gNewHealthBar[n].rate = rate;
gNewHealthBar[n].ViewHP[0] = ViewHP[0];
gNewHealthBar[n].ViewHP[1] = ViewHP[1];
return;
}
}
}
NEW_HEALTH_BAR* CHealthBar::GetNewHealthBar(WORD index, BYTE type) // OK
{
for (int n = 0;n < MAX_MAIN_VIEWPORT;n++)
{
if (gNewHealthBar[n].index != 0xFFFF)
{
if (gNewHealthBar[n].index == index && gNewHealthBar[n].type == type)
{
return &gNewHealthBar[n];
}
}
}
return 0;
}
void CHealthBar::DrawNewHealthBar()
{
float Width = 85.f;
char Text[100], Text2[100], Text3[100];
vec3_t Angle;
int ScreenX, ScreenY;
static float LastHP[MAX_MAIN_VIEWPORT] = { 0 };
static float DamageTimer[MAX_MAIN_VIEWPORT] = { 0 };
for (int j = 0; j < MAX_MAIN_VIEWPORT; ++j)
{
auto ViewportAddress = &CharactersClient[j];
if (!ViewportAddress) continue;
NEW_HEALTH_BAR* lpNewHealthBar = GetNewHealthBar(ViewportAddress->Key, ViewportAddress->Object.Kind);
if (lpNewHealthBar == 0) continue;
Vector(
ViewportAddress->Object.Position[0],
ViewportAddress->Object.Position[1],
ViewportAddress->Object.Position[2] + ViewportAddress->Object.BoundingBoxMax[2] + 100.f,
Angle);
if (ViewportAddress->Object.Kind == 2)
{
BeginOpengl(0, 0, GetWindowsX, GetWindowsY);
Projection(Angle, &ScreenX, &ScreenY);
EndOpengl();
ScreenX -= (int)(Width / 2);
// Texto do HP aprimorado
auto FormatNumber = [](int num) -> std::string {
char buffer[16];
if (num >= 1000000000) // 1 bilhão
sprintf(buffer, "%.1fKKK", num / 1000000000.0);
else if (num >= 1000000) // 1 milhão
sprintf(buffer, "%.1fKK", num / 1000000.0);
else if (num >= 1000) // 1 mil
sprintf(buffer, "%.1fK", num / 1000.0);
else
sprintf(buffer, "%d", num);
return std::string(buffer);
};
std::string hpCurrent = FormatNumber(lpNewHealthBar->ViewHP[0]);
std::string hpMax = FormatNumber(lpNewHealthBar->ViewHP[1]);
sprintf(Text, "%s / %s (%d%%)", hpCurrent.c_str(), hpMax.c_str(), lpNewHealthBar->rate);
g_pRenderText->SetFont(g_hFont);
g_pRenderText->SetTextColor(255, 255, 255, 255);
g_pRenderText->SetBgColor(0, 0, 0, 128);
g_pRenderText->RenderText(ScreenX + (Width / 2), ScreenY - 8, Text, Width, 0, 8);
sprintf(Text2, "%s", ViewportAddress->ID);
g_pRenderText->RenderText(ScreenX + (Width / 2), ScreenY - 18, Text2, Width, 0, 8);
// Barra de fundo
EnableAlphaTest();
glColor4f(0.2f, 0.2f, 0.2f, 0.8f);
RenderColor((float)(ScreenX), (float)(ScreenY + 2), Width, 6.f);
// Cálculo da porcentagem do HP
float HP_Percentage = (float)lpNewHealthBar->ViewHP[0] / (float)lpNewHealthBar->ViewHP[1];
float HP_Width = Width * HP_Percentage;
// Se a vida diminuiu, inicia o timer e mantém a barra de marcação do dano
if (lpNewHealthBar->ViewHP[0] < LastHP[j]) {
DamageTimer[j] = 2.0f; // Agora dura 1,5 segundos antes de desaparecer
}
// Suaviza a descida da barra de marcação do dano
if (LastHP[j] > lpNewHealthBar->ViewHP[0]) {
LastHP[j] -= ((LastHP[j] - lpNewHealthBar->ViewHP[0]) * 0.05f); // Suavização lenta
}
else {
LastHP[j] = lpNewHealthBar->ViewHP[0];
}
float LastHP_Percentage = (float)LastHP[j] / (float)lpNewHealthBar->ViewHP[1];
float LastHP_Width = min(Width, Width * LastHP_Percentage);
// Reduz gradualmente a transparência da marcação do dano
if (DamageTimer[j] > 0) {
glColor4f(0.8f, 0.0f, 0.0f, DamageTimer[j] * 0.66f); // Mais opaco no início, sumindo devagar
RenderColor((float)(ScreenX + HP_Width), (float)(ScreenY + 3), LastHP_Width - HP_Width, 4.f);
DamageTimer[j] -= 0.008f; // Agora a transparência desaparece mais devagar
}
// Barra de HP principal com gradiente
float Red = 1.0f - HP_Percentage;
float Green = HP_Percentage;
glColor4f(Red, Green, 0.f, 1.f);
RenderColor((float)(ScreenX + 1), (float)(ScreenY + 3), HP_Width - 2, 4.f);
DisableAlphaBlend();
}
else if(ViewportAddress->Object.Kind == 1)
{
BeginOpengl(0, 0, GetWindowsX, GetWindowsY);
Projection(Angle, &ScreenX, &ScreenY);
EndOpengl();
if (CheckMouseIn(ScreenX - 20, ScreenY, 40, 120))
{
if (GetAsyncKeyState(VK_CONTROL) & 0x8000) {
EnableAlphaTest();
glColor4f(0, 0.f, 0.f, 1.f);
RenderColor((float)((GetWindowsX / 2) - 51), (float)(GetWindowsY - 80 - 1), 102, 8.f);
glColor4f(1.f, 0.f, 0.f, 1.f);
RenderColor((float)((GetWindowsX / 2) - 50), (float)(GetWindowsY - 80), lpNewHealthBar->rate, 6.f);
DisableAlphaBlend();
glColor3f(1.f, 1.f, 1.f);
EnableAlphaBlend();
g_pRenderText->SetFont(g_hFont);
g_pRenderText->SetTextColor(255, 255, 255, 255);
g_pRenderText->SetBgColor(0, 0, 0, 0);
sprintf(Text3, "%d%%", lpNewHealthBar->rate);
g_pRenderText->RenderText((float)((GetWindowsX / 2)), (float)(GetWindowsY - 81), Text3, 100.f, 0, 8);
}
}
}
}
DisableAlphaBlend();
glColor3f(1.f, 1.f, 1.f);
}
#define MAX_MAIN_VIEWPORT 400
struct NEW_HEALTH_BAR
{
WORD index;
BYTE type;
BYTE rate;
DWORD ViewHP[2];
};
class CHealthBar {
public:
CHealthBar();
~CHealthBar();
void ClearNewHealthBar();
NEW_HEALTH_BAR* GetNewHealthBar(WORD index, BYTE type);
void DrawNewHealthBar();
void InsertNewHealthBar(WORD index, BYTE type, BYTE rate, DWORD* ViewHP);
private:
NEW_HEALTH_BAR gNewHealthBar[MAX_MAIN_VIEWPORT];
};
extern CHealthBar gHealthBar;
bool SEASON3B::CNewUINameWindow::Render()
{
EnableAlphaTest();
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
RenderName();
RenderTimes();
matchEvent::RenderMatchTimes ();
RenderBooleans();
DrawPersonalShopTitleImp();
DisableAlphaBlend();
if (SceneFlag == MAIN_SCENE)
{
gInterface.m_Lua.Generic_Call("BeforeMainProc", ">");
gHealthBar.DrawNewHealthBar(); //hpbar
g_pReconnect->ReconnectMainProc();
}
return true;
}
struct PMSG_NEW_HEALTH_BAR_RECV
{
PSWMSG_HEAD header; // C2:F3:E2
BYTE count;
};
struct PMSG_NEW_HEALTH_RECV
{
WORD index;
BYTE type;
BYTE rate;
DWORD ViewHP[2];
};
void GCNewHealthBarSend(LPOBJ lpObj) // OK
{
#if(GAMESERVER_EXTRA==1)
#if(GAMESERVER_UPDATE<=603)
if(gServerInfo.m_MonsterHealthBarSwitch == 0)
{
return;
}
BYTE send[4096];
PMSG_NEW_HEALTH_BAR_SEND pMsg;
pMsg.header.set(0xF3,0xE2,0);
int size = sizeof(pMsg);
pMsg.count = 0;
PMSG_NEW_HEALTH_BAR info;
for(int n=0;n < MAX_VIEWPORT;n++)
{
if(lpObj->VpPlayer[n].state != VIEWPORT_SEND && lpObj->VpPlayer[n].state != VIEWPORT_WAIT)
{
continue;
}
if (lpObj->VpPlayer[n].type == OBJECT_MONSTER && gServerInfo.m_MonsterHealthBarSwitch == 0)
{
continue;
}
if (lpObj->VpPlayer[n].type == OBJECT_USER && gServerInfo.m_UserHealthBarSwitch == 0)
{
continue;
}
if(OBJECT_RANGE(lpObj->VpPlayer[n].index) == 0)
{
continue;
}
LPOBJ lpTarget = &gObj[lpObj->VpPlayer[n].index];
if(lpTarget->Live == 0 || lpTarget->State != OBJECT_PLAYING || OBJECT_RANGE(lpTarget->SummonIndex) != 0 || CC_MAP_RANGE(lpTarget->Map) != 0)
{
continue;
}
info.index = lpTarget->Index;
info.type = (BYTE)lpTarget->Type;
info.rate = (BYTE)((lpTarget->Life*100)/(lpTarget->MaxLife+lpTarget->AddLife));
info.ViewHP[0] = (DWORD)(lpTarget->Life);
info.ViewHP[1] = (DWORD)(lpTarget->MaxLife);
memcpy(&send[size],&info,sizeof(info));
size += sizeof(info);
pMsg.count++;
}
pMsg.header.size[0] = SET_NUMBERHB(size);
pMsg.header.size[1] = SET_NUMBERLB(size);
memcpy(send,&pMsg,sizeof(pMsg));
DataSend(lpObj->Index,send,size);
#endif
#endif
}
struct PMSG_NEW_HEALTH_BAR_SEND
{
PSWMSG_HEAD header; // C2:F3:E2
BYTE count;
};
struct PMSG_NEW_HEALTH_BAR
{
WORD index;
BYTE type;
BYTE rate;
DWORD ViewHP[2];
};
CEffect.h
#pragma once
#define ITEM_INTER 649
#define ITEM(x, y) ((x * 512) + y)
#define ITEM2(x, y) ((x * 512) + y + ITEM_INTER)
#define Naked(Function) void __declspec(naked) Function()
#define RenderMesh ((void(__thiscall*)(int This, int a2, int a3, GLfloat alpha, int a5, float a6, float a7, float a8, int a9)) 0x00502F50)
#define sub_49CC70 ((double(__cdecl*)(float a1)) 0x0049CC70)
#define sub_644101 ((double(__cdecl*)(float a1)) 0x00644101)
namespace ASM
{
enum T
{
JMP = 0xE9,
JE = 0x74,
JNE = 0x75,
JGE = 0x7D,
NOP = 0x90,
CALL = 0xE8,
CALLD = 0xFF,
PUSH = 0x68,
};
};
void CEffect();
CEffect.cpp
#include "stdafx.h"
#include "CEffect.h"
#include "Util.h"
#include "TMemory.h"
// ----
DWORD dwItemId;
DWORD dwWingThis;
DWORD dwWingStyle;
DWORD dwWingEff;
// ----
DWORD dwCustomItemGlowJmp00 = 0x0061D3CB;
DWORD dwCustomItemGlowJmp01 = 0x0061D3BF;
Naked(CustomItemGlow)
{
_asm
{
// ----
MOV EAX, DWORD PTR SS:[EBP+0x10]
MOV dwItemId, EAX
// ----
MOV EDX,DWORD PTR SS:[EBP+0x8]
MOV dwWingThis, EDX
// ----
MOV EAX,DWORD PTR SS:[EBP+0xC]
MOV dwWingStyle, EAX
// ----
}
if(dwItemId == ITEM2(0,26)) //Flameberge
{
// ----
glColor3fv((GLfloat*)(dwWingThis+72));
// ----
RenderMesh(dwWingThis,
0,
2,
*(GLfloat *)(dwWingStyle + 424),
*(DWORD *)(dwWingStyle + 148),
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
RenderMesh(dwWingThis,
2,
2,
*(GLfloat *)(dwWingStyle + 424),
2,
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
*(float *)(dwWingThis + 72) = 1.0;
*(float *)(dwWingThis + 76) = 0.0;
*(float *)(dwWingThis + 80) = 0.2;
RenderMesh(dwWingThis,
1,
66,
*(GLfloat *)(dwWingStyle + 424),
1,
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
*(float *)(dwWingThis + 72) = 1.0;
*(float *)(dwWingThis + 76) = 1.0;
*(float *)(dwWingThis + 80) = 1.0;
RenderMesh(dwWingThis,
1,
70,
*(GLfloat *)(dwWingStyle + 424),
1,
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
RenderMesh(dwWingThis,
3,
66,
*(GLfloat *)(dwWingStyle + 424),
3,
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
RenderMesh(dwWingThis,
4,
66,
*(GLfloat *)(dwWingStyle + 424),
4,
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
float v407 = ((int)(timeGetTime() * 0.05) % 16 / 4) * 0.25;
RenderMesh(dwWingThis,
5,
66,
1.0,
5,
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
v407,
-1);
_asm
{
//---
JMP dwCustomItemGlowJmp01
}
}
if(dwItemId == ITEM2(0,27)) //Sword Breaker
{
// ----
glColor3fv((GLfloat*)(dwWingThis+72));
// ----
RenderMesh(dwWingThis,
0,
2,
*(GLfloat *)(dwWingStyle + 424),
*(DWORD *)(dwWingStyle + 148),
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
RenderMesh(dwWingThis,
1,
2,
*(GLfloat *)(dwWingStyle + 424),
*(DWORD *)(dwWingStyle + 148),
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
RenderMesh(dwWingThis,
1,
70,
*(GLfloat *)(dwWingStyle + 424),
1,
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
_asm
{
//---
JMP dwCustomItemGlowJmp01
}
}
if(dwItemId == ITEM2(5,31)) //Inberial Staff
{
// ----
glColor3fv((GLfloat*)(dwWingThis+72));
// ----
RenderMesh(dwWingThis,
0,
2,
*(GLfloat *)(dwWingStyle + 424),
*(DWORD *)(dwWingStyle + 148),
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
RenderMesh(dwWingThis,
1,
66,
*(GLfloat *)(dwWingStyle + 424),
1,
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
float v40 = (int)timeGetTime() * 0.001000000047497451;
float v41 = sub_49CC70(v40);
RenderMesh(dwWingThis,
0,
66,
*(GLfloat *)(dwWingStyle + 424),
0,
v41,
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
32401);
_asm
{
//---
JMP dwCustomItemGlowJmp01
}
}
if(dwItemId == ITEM2(6,17)) //Crimson Glory
{
// ----
glColor3fv((GLfloat*)(dwWingThis+72));
// ----
RenderMesh(dwWingThis,
0,
2,
*(GLfloat *)(dwWingStyle + 424),
*(DWORD *)(dwWingStyle + 148),
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
RenderMesh(dwWingThis,
1,
66,
*(GLfloat *)(dwWingStyle + 424),
1,
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
RenderMesh(dwWingThis,
2,
70,
*(GLfloat *)(dwWingStyle + 424),
2,
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
_asm
{
//---
JMP dwCustomItemGlowJmp01
}
}
if(dwItemId == ITEM2(6,19)) //Frost Barrier
{
// ----
glColor3fv((GLfloat*)(dwWingThis+72));
// ----
RenderMesh(dwWingThis,
0,
2,
*(GLfloat *)(dwWingStyle + 424),
*(DWORD *)(dwWingStyle + 148),
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
RenderMesh(dwWingThis,
1,
66,
*(GLfloat *)(dwWingStyle + 424),
1,
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
float v40 = (int)timeGetTime() * 0.001000000047497451;
float v41 = sub_49CC70(v40);
RenderMesh(dwWingThis,
2,
66,
*(GLfloat *)(dwWingStyle + 424),
2,
v41,
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
_asm
{
//---
JMP dwCustomItemGlowJmp01
}
}
if(dwItemId == ITEM2(6,21)) //Cross Shield
{
// ----
glColor3fv((GLfloat*)(dwWingThis+72));
// ----
RenderMesh(dwWingThis,
0,
2,
*(GLfloat *)(dwWingStyle + 424),
*(DWORD *)(dwWingStyle + 148),
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
float v407 = ((int)timeGetTime() % 2000) * 0.25;
RenderMesh(dwWingThis,
1,
70,
*(GLfloat *)(dwWingStyle + 424),
*(DWORD *)(dwWingStyle + 148),
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
v407,
-1);
RenderMesh(dwWingThis,
2,
66,
*(GLfloat *)(dwWingStyle + 424),
2,
*(float *)(dwWingStyle + 152),
*(float *)(dwWingStyle + 156),
*(float *)(dwWingStyle + 160),
-1);
_asm
{
//---
JMP dwCustomItemGlowJmp01
}
}
// ----
_asm
{
//---
CMP DWORD PTR SS:[EBP+0x10],0x1AAD //Wing of Storm
JMP dwCustomItemGlowJmp00
}
}
void __declspec ( naked ) NOGlow1()
{
static DWORD Return = 0x0062356D;
static DWORD CALL = 0x005059D2;
static DWORD JMP = 0x00623674;
// ----
_asm
{
CMP DWORD PTR SS:[EBP+0x10],0x29E
JNZ NOGlow1Prop_Label1
MOV EDX,DWORD PTR SS:[EBP+0x20]
PUSH EDX
PUSH 0
MOV EAX,DWORD PTR SS:[EBP+0xC]
MOV ECX,DWORD PTR DS:[EAX+0xA0]
PUSH ECX
MOV EDX,DWORD PTR SS:[EBP+0xC]
MOV EAX,DWORD PTR DS:[EDX+0x9C]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0xC]
MOV EDX,DWORD PTR DS:[ECX+0x98]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0xC]
MOV ECX,DWORD PTR DS:[EAX+0x94]
PUSH ECX
MOV EDX,DWORD PTR SS:[EBP+0x14]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0x18]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0x8]
CALL CALL
JMP JMP
// ----
NOGlow1Prop_Label1:
// ----
CMP DWORD PTR SS:[EBP+0x10],ITEM2(0,26)//Flameberge
JNZ NOGlow1Prop_Label2
MOV EDX,DWORD PTR SS:[EBP+0x20]
PUSH EDX
PUSH 5 //<<Grupo de la Textura
MOV EAX,DWORD PTR SS:[EBP+0xC]
MOV ECX,DWORD PTR DS:[EAX+0xA0]
PUSH ECX
MOV EDX,DWORD PTR SS:[EBP+0xC]
MOV EAX,DWORD PTR DS:[EDX+0x9C]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0xC]
MOV EDX,DWORD PTR DS:[ECX+0x98]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0xC]
MOV ECX,DWORD PTR DS:[EAX+0x94]
PUSH ECX
MOV EDX,DWORD PTR SS:[EBP+0x14]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0x18]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0x8]
CALL CALL
JMP JMP
// ----
NOGlow1Prop_Label2:
// ----
CMP DWORD PTR SS:[EBP+0x10],ITEM2(0,27)//Sword Breaker
JNZ NOGlow1Prop_Label3
MOV EDX,DWORD PTR SS:[EBP+0x20]
PUSH EDX
PUSH 1 //<<Grupo de la Textura
MOV EAX,DWORD PTR SS:[EBP+0xC]
MOV ECX,DWORD PTR DS:[EAX+0xA0]
PUSH ECX
MOV EDX,DWORD PTR SS:[EBP+0xC]
MOV EAX,DWORD PTR DS:[EDX+0x9C]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0xC]
MOV EDX,DWORD PTR DS:[ECX+0x98]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0xC]
MOV ECX,DWORD PTR DS:[EAX+0x94]
PUSH ECX
MOV EDX,DWORD PTR SS:[EBP+0x14]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0x18]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0x8]
CALL CALL
JMP JMP
// ----
NOGlow1Prop_Label3:
// ----
CMP DWORD PTR SS:[EBP+0x10],ITEM2(6,19)//Frost Barrier
JNZ NOGlow1Prop_Label4
MOV EDX,DWORD PTR SS:[EBP+0x20]
PUSH EDX
PUSH 2 //<<Grupo de la Textura
MOV EAX,DWORD PTR SS:[EBP+0xC]
MOV ECX,DWORD PTR DS:[EAX+0xA0]
PUSH ECX
MOV EDX,DWORD PTR SS:[EBP+0xC]
MOV EAX,DWORD PTR DS:[EDX+0x9C]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0xC]
MOV EDX,DWORD PTR DS:[ECX+0x98]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0xC]
MOV ECX,DWORD PTR DS:[EAX+0x94]
PUSH ECX
MOV EDX,DWORD PTR SS:[EBP+0x14]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0x18]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0x8]
CALL CALL
JMP JMP
// ----
NOGlow1Prop_Label4:
// ----
CMP DWORD PTR SS:[EBP+0x10],ITEM2(6,21)//Cross Shield
JNZ NOGlow1Prop_Label5
MOV EDX,DWORD PTR SS:[EBP+0x20]
PUSH EDX
PUSH 1 //<<Grupo de la Textura
MOV EAX,DWORD PTR SS:[EBP+0xC]
MOV ECX,DWORD PTR DS:[EAX+0xA0]
PUSH ECX
MOV EDX,DWORD PTR SS:[EBP+0xC]
MOV EAX,DWORD PTR DS:[EDX+0x9C]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0xC]
MOV EDX,DWORD PTR DS:[ECX+0x98]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0xC]
MOV ECX,DWORD PTR DS:[EAX+0x94]
PUSH ECX
MOV EDX,DWORD PTR SS:[EBP+0x14]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0x18]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0x8]
CALL CALL
JMP JMP
// ----
NOGlow1Prop_Label5:
// ----
NOGlow1Prop_LabelReturn:
// ----
JMP Return
}
}
void __declspec ( naked ) NOGlow2()
{
static DWORD Return = 0x0062356D;
static DWORD CALL = 0x005059D2;
static DWORD JMP = 0x0062392D;
// ----
_asm
{
CMP DWORD PTR SS:[EBP+0x10],0x29E
JNZ NOGlow2Prop_Label1
MOV EAX,DWORD PTR SS:[EBP+0x20]
PUSH EAX
PUSH 0
MOV ECX,DWORD PTR SS:[EBP+0xC]
MOV EDX,DWORD PTR DS:[ECX+0xA0]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0xC]
MOV ECX,DWORD PTR DS:[EAX+0x9C]
PUSH ECX
MOV EDX,DWORD PTR SS:[EBP+0xC]
MOV EAX,DWORD PTR DS:[EDX+0x98]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0xC]
MOV EDX,DWORD PTR DS:[ECX+0x94]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0x14]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0x18]
PUSH ECX
MOV ECX,DWORD PTR SS:[EBP+0x8]
CALL CALL
JMP JMP
// ----
NOGlow2Prop_Label1:
// ----
CMP DWORD PTR SS:[EBP+0x10],ITEM2(0,26)//Flameberge
JNZ NOGlow2Prop_Label2
MOV EAX,DWORD PTR SS:[EBP+0x20]
PUSH EAX
PUSH 5 //<<Grupo de la Textura
MOV ECX,DWORD PTR SS:[EBP+0xC]
MOV EDX,DWORD PTR DS:[ECX+0xA0]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0xC]
MOV ECX,DWORD PTR DS:[EAX+0x9C]
PUSH ECX
MOV EDX,DWORD PTR SS:[EBP+0xC]
MOV EAX,DWORD PTR DS:[EDX+0x98]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0xC]
MOV EDX,DWORD PTR DS:[ECX+0x94]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0x14]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0x18]
PUSH ECX
MOV ECX,DWORD PTR SS:[EBP+0x8]
CALL CALL
JMP JMP
// ----
NOGlow2Prop_Label2:
// ----
CMP DWORD PTR SS:[EBP+0x10],ITEM2(0,27)//Sword Breaker
JNZ NOGlow2Prop_Label3
MOV EAX,DWORD PTR SS:[EBP+0x20]
PUSH EAX
PUSH 1 //<<Grupo de la Textura
MOV ECX,DWORD PTR SS:[EBP+0xC]
MOV EDX,DWORD PTR DS:[ECX+0xA0]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0xC]
MOV ECX,DWORD PTR DS:[EAX+0x9C]
PUSH ECX
MOV EDX,DWORD PTR SS:[EBP+0xC]
MOV EAX,DWORD PTR DS:[EDX+0x98]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0xC]
MOV EDX,DWORD PTR DS:[ECX+0x94]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0x14]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0x18]
PUSH ECX
MOV ECX,DWORD PTR SS:[EBP+0x8]
CALL CALL
JMP JMP
// ----
NOGlow2Prop_Label3:
// ----
CMP DWORD PTR SS:[EBP+0x10],ITEM2(6,19)//Frost Barrier
JNZ NOGlow2Prop_Label4
MOV EAX,DWORD PTR SS:[EBP+0x20]
PUSH EAX
PUSH 2 //<<Grupo de la Textura
MOV ECX,DWORD PTR SS:[EBP+0xC]
MOV EDX,DWORD PTR DS:[ECX+0xA0]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0xC]
MOV ECX,DWORD PTR DS:[EAX+0x9C]
PUSH ECX
MOV EDX,DWORD PTR SS:[EBP+0xC]
MOV EAX,DWORD PTR DS:[EDX+0x98]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0xC]
MOV EDX,DWORD PTR DS:[ECX+0x94]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0x14]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0x18]
PUSH ECX
MOV ECX,DWORD PTR SS:[EBP+0x8]
CALL CALL
JMP JMP
// ----
NOGlow2Prop_Label4:
// ----
CMP DWORD PTR SS:[EBP+0x10],ITEM2(6,21)//Cross Shield
JNZ NOGlow2Prop_Label5
MOV EAX,DWORD PTR SS:[EBP+0x20]
PUSH EAX
PUSH 1 //<<Grupo de la Textura
MOV ECX,DWORD PTR SS:[EBP+0xC]
MOV EDX,DWORD PTR DS:[ECX+0xA0]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0xC]
MOV ECX,DWORD PTR DS:[EAX+0x9C]
PUSH ECX
MOV EDX,DWORD PTR SS:[EBP+0xC]
MOV EAX,DWORD PTR DS:[EDX+0x98]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0xC]
MOV EDX,DWORD PTR DS:[ECX+0x94]
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+0x14]
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+0x18]
PUSH ECX
MOV ECX,DWORD PTR SS:[EBP+0x8]
CALL CALL
JMP JMP
// ----
NOGlow2Prop_Label5:
// ----
NOGlow2Prop_LabelReturn:
// ----
JMP Return
}
}
void CEffect()
{
SetCompleteHook(0xE9,0x0061D3C4, &CustomItemGlow);
SetCompleteHook(0xE9,0x00623521, &NOGlow1);
SetCompleteHook(0xE9,0x006237B9, &NOGlow2);
}
this->BindObject(eRanking_MAIN, 0x7A5A, 222, 200, 205, -1);
float MainWidth = 230.0;
float MainHeight = 180.0;
float StartBody = 80.0;
float StartY = 80.0;
float StartX = (MAX_WIN_WIDTH / 2) - (MainWidth / 2);
float MainCenter = StartX + (MainWidth / 3);
float ButtonX = MainCenter - (float)(29.0 / 2);
// ----
gInterface.DrawGUI(eRanking_MAIN, StartX, StartY + (float)2.0);
gInterface.DrawGUI(eVip_TITLE, StartX, StartY);
StartY = gInterface.DrawRepeatGUI(eVip_FRAME, StartX, StartY + (float)5.0, 10);
gInterface.DrawGUI(eVip_FOOTER, StartX, StartY);
gInterface.DrawGUI(eRanking_CLOSE, StartX + MainWidth - gInterface.Data[eRanking_CLOSE].Width, StartBody);
// ----
float MainWidth = 230.0;
float MainHeight = 240.0;
float StartBody = ((MAX_WIN_HEIGHT - 51) / 2) - (MainHeight / 2);
float StartY = ((MAX_WIN_HEIGHT - 51) / 2) - (MainHeight / 2);
float StartX = (MAX_WIN_WIDTH / 2) - (MainWidth / 2);
float MainCenter = StartX + (MainWidth / 3);
float ButtonX = MainCenter - (float)(29.0 / 2);
// ----
gCentral.PrintDropBox(StartX, StartY, MainWidth, MainHeight, 0, 0);
echo '<tr><td style="width:1%;text-align:center;"><i class="fas fa-shield-alt"></i></td><td>Dias Online</td><td style="color:#00aa00;font-weight:bold;"> <script>
var montharray=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")
function countup(yr,m,d){
var today=new Date()
var todayy=today.getYear()
if (todayy < 1000)
todayy+=1900
var todaym=today.getMonth()
var todayd=today.getDate()
var todaystring=montharray[todaym]+" "+todayd+", "+todayy
var paststring=montharray[m-1]+" "+d+", "+yr
var difference=(Math.round((Date.parse(todaystring)-Date.parse(paststring))/(24*60*60*1000))*1)
difference+=" días"
document.write(" "+difference+" ")
}
//NOTA: Cambia en la linea de abajo, el dia desde el que quieres contar el tiempo
countup(2023,06,01)
</script></td></tr>';
<?php
/**
* WebEngine CMS
* https://webenginecms.org/
*
* @version 1.2.6
* @author Lautaro Angelico <http://lautaroangelico.com/>
* @copyright (c) 2013-2025 Lautaro Angelico, All Rights Reserved
*
* Licensed under the MIT license
* http://opensource.org/licenses/MIT
*/
if(!isLoggedIn()) redirect(1,'login');
echo '<div class="page-title"><span>'.lang('module_titles_txt_4').'</span></div>';
// module status
if(!mconfig('active')) throw new Exception(lang('error_47'));
// common class
$common = new common();
// Webengine cfg
$webEngineConfig = loadConfig();
// Retrieve Account Information
$accountInfo = $common->accountInformation($_SESSION['userid']);
if(!is_array($accountInfo)) throw new Exception(lang('error_12'));
// account last connection
$lastConnection = $common->accountMembStat($_SESSION['username']);
// account online status
$onlineStatus = ($common->accountOnline($_SESSION['username']) ? '<span class="label label-success">'.lang('myaccount_txt_9').'</span>' : '<span class="label label-danger">'.lang('myaccount_txt_10').'</span>');
// account status
$accountStatus = ($accountInfo[_CLMN_BLOCCODE_] == 1 ? '<span class="label label-danger">'.lang('myaccount_txt_8').'</span>' : '<span class="label label-default">'.lang('myaccount_txt_7').'</span>');
// characters info
$Character = new Character();
$AccountCharacters = $Character->AccountCharacter($_SESSION['username']);
// Account Information
echo '<table class="table myaccount-table">';
echo '<tr>';
echo '<td>'.lang('myaccount_txt_1').'</td>';
echo '<td>'.$accountStatus.'</td>';
echo '</tr>';
echo '<tr>';
echo '<td>'.lang('myaccount_txt_2').'</td>';
echo '<td>'.$accountInfo[_CLMN_USERNM_].'</td>';
echo '</tr>';
echo '<tr>';
echo '<td>'.lang('myaccount_txt_3').'</td>';
echo '<td>'.$accountInfo[_CLMN_EMAIL_].' <a href="'.__BASE_URL__.'usercp/myemail/" class="btn btn-xs btn-primary pull-right">'.lang('myaccount_txt_6').'</a></td>';
echo '</tr>';
echo '<tr>';
echo '<td>'.lang('myaccount_txt_4').'</td>';
echo '<td>•••••••• <a href="'.__BASE_URL__.'usercp/mypassword/" class="btn btn-xs btn-primary pull-right">'.lang('myaccount_txt_6').'</a></td>';
echo '</tr>';
echo '<tr>';
echo '<td>'.lang('myaccount_txt_5').'</td>';
echo '<td>'.$onlineStatus.'</td>';
echo '</tr>';
try {
$creditSystem = new CreditSystem();
$creditCofigList = $creditSystem->showConfigs();
if(is_array($creditCofigList)) {
foreach($creditCofigList as $myCredits) {
if(!$myCredits['config_display']) continue;
$creditSystem->setConfigId($myCredits['config_id']);
switch($myCredits['config_user_col_id']) {
case 'userid':
$creditSystem->setIdentifier($accountInfo[_CLMN_MEMBID_]);
break;
case 'username':
$creditSystem->setIdentifier($accountInfo[_CLMN_USERNM_]);
break;
case 'email':
$creditSystem->setIdentifier($accountInfo[_CLMN_EMAIL_]);
break;
default:
continue 2;
}
$configCredits = $creditSystem->getCredits();
echo '<tr>';
echo '<td>'.$myCredits['config_title'].'</td>';
echo '<td>'.number_format($configCredits).'</td>';
echo '</tr>';
}
}
} catch(Exception $ex) {}
echo '<tr>';
echo '<td>Membresía Vip</td>';
switch($accountInfo[_CLMN_VIP_TYPE_]) {
case 0:
echo '<td>Humilde</td>';
break;
case 1:
echo '<td>'.lang('vip_title_type_1').'</td>';
break;
case 2:
echo '<td>'.lang('vip_title_type_2').'</td>';
break;
case 3:
echo '<td>'.lang('vip_title_type_3').'</td>';
break;
}
echo '</tr>';
if (!empty($lastConnection['ConnectTM']) && strtotime($lastConnection['ConnectTM']) !== false) {
$dateLastConnection = new DateTime($lastConnection['ConnectTM']);
$formattedLastConnection = $dateLastConnection->format('d \d\e F \d\e\l Y \@ H:i:s');
} else {
$formattedLastConnection = 'Fecha no disponible';
}
echo '<tr>';
echo '<td>Última conexión</td>';
echo '<td>'.$formattedLastConnection.'</td>';
echo '</tr>';
if ($accountInfo[_CLMN_VIP_TYPE_] > 0) {
$dateVipExpire = new DateTime($accountInfo[_CLMN_VIP_DATE_]);
$formattedVipExpire = $dateVipExpire->format('d \d\e F \d\e\l Y \@ H:i');
echo '<tr>';
echo '<td>Vencimiento VIP</td>';
echo '<td>'.$formattedVipExpire.'</td>';
echo '</tr>';
}
echo '</table>';
echo '<div class="panel panel-sidebar">';
echo '<div class="panel-heading">';
echo '<h3 class="panel-title">Hola '.$accountInfo[_CLMN_USERNM_].'</h3>';
echo '</div>';
echo '<div class="panel-body">';
echo '<p>Bienvenido nuevamente a '.$webEngineConfig['server_name'].', disfruta de tu estadía.</p>';
echo '</div>';
echo '</div>';
setlocale(LC_TIME, 'es_ES.UTF-8');
setlocale(LC_TIME, 'spanish');
// Account Characters
echo '<div class="page-title"><span>'.lang('myaccount_txt_15').'</span></div>';
if(is_array($AccountCharacters)) {
$onlineCharacters = loadCache('online_characters.cache') ? loadCache('online_characters.cache') : array();
echo '<div class="">';
foreach($AccountCharacters as $characterName) {
$characterData = $Character->CharacterData($characterName);
$FormStr = $characterData[_CLMN_CHR_STAT_STR_] / 320;
$FormAgi = $characterData[_CLMN_CHR_STAT_AGI_] / 320;
$FormVit = $characterData[_CLMN_CHR_STAT_VIT_] / 320;
$FormEne = $characterData[_CLMN_CHR_STAT_ENE_] / 320;
$FormCom = $characterData[_CLMN_CHR_STAT_CMD_] / 320;
if(!is_array($characterData)) continue;
if(defined('_TBL_MASTERLVL_')) {
if(_TBL_MASTERLVL_ != _TBL_CHR_) {
$characterMLData = $Character->getMasterLevelInfo($characterName);
if(is_array($characterMLData)) {
$characterData[_CLMN_CHR_LVL_] += $characterMLData[_CLMN_ML_LVL_];
}
} else {
$characterData[_CLMN_CHR_LVL_] += $characterData[_CLMN_ML_LVL_];
}
}
$characterClassAvatar = getPlayerClassAvatar($characterData[_CLMN_CHR_CLASS_], false);
$characterOnlineStatus = in_array($characterName, $onlineCharacters) ? '<img src="'.__PATH_ONLINE_STATUS__.'" class="online-status-indicator" alt="Online"/>' : '<img src="'.__PATH_OFFLINE_STATUS__.'" class="online-status-indicator"/>';
echo '<div class="col-md-12 panel panel-sidebar" style="margin-bottom: 2rem; padding-left: 0; padding-right: 0;">';
echo '<div class="col-md-12 panel-heading">';
echo '<h3 class="panel-title">Personaje - '.playerProfile($characterName).' <span style="float: right;">Estado '.$characterOnlineStatus.'</span></h3>';
echo '</div>';
echo '<div class="col-md-12 panel-body">';
echo '<div class="col-md-4 col-lg-4">';
echo '<img src="'.$characterClassAvatar.'" alt="Avatar" width="70%" height="auto" style="-moz-border-radius: 2%;-webkit-border-radius: 2%;border-radius: 2%;-khtml-border-radius: 2%;border: 4px solid #151515;"/>';
echo '</div>';
echo '<div class="col-md-8 col-lg-8">';
echo '<div class="col-md-4 col-lg-4" style="font-weight: bold; color: #dc3545;">Fuerza:</div>';
echo '<div class="col-md-8 col-lg-8">';
echo '<div class="progress" style="background-color: #714f29;">';
echo '<div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="'. $FormStr .'" aria-valuemin="0" aria-valuemax="32000" style="width: '.$FormStr.'%;min-width:10%;max-width:100%;font-size: 15px;font-weight: 400;font-family: H67, Arial;text-transform: uppercase;">';
echo number_format("".$characterData[_CLMN_CHR_STAT_STR_],0,",",".");
echo '</div>';
echo '</div>';
echo '</div>';
echo '<div class="col-md-4 col-lg-4" style="font-weight: bold; color: #198754;">Agilidad:</div>';
echo '<div class="col-md-8 col-lg-8">';
echo '<div class="progress" style="background-color: #714f29;">';
echo '<div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="'. $FormAgi .'" aria-valuemin="0" aria-valuemax="32000" style="width: '.$FormAgi.'%;min-width:10%;max-width:100%;font-size: 15px;font-weight: 400;font-family: H67, Arial;text-transform: uppercase;">';
echo number_format("".$characterData[_CLMN_CHR_STAT_AGI_],0,",",".");
echo '</div>';
echo '</div>';
echo '</div>';
echo '<div class="col-md-4 col-lg-4" style="font-weight: bold; color: #ffc107;">Vida:</div>';
echo '<div class="col-md-8 col-lg-8">';
echo '<div class="progress" style="background-color: #714f29;">';
echo '<div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="'. $FormVit .'" aria-valuemin="0" aria-valuemax="32000" style="width: '.$FormVit.'%;min-width:10%;max-width:100%;font-size: 15px;font-weight: 400;font-family: H67, Arial;text-transform: uppercase;">';
echo number_format("".$characterData[_CLMN_CHR_STAT_VIT_],0,",",".");
echo '</div>';
echo '</div>';
echo '</div>';
echo '<div class="col-md-4 col-lg-4" style="font-weight: bold; color: #0dcaf0">Energía:</div>';
echo '<div class="col-md-8 col-lg-8">';
echo '<div class="progress" style="background-color: #714f29;">';
echo '<div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="'. $FormEne .'" aria-valuemin="0" aria-valuemax="32000" style="width: '.$FormEne.'%;min-width:10%;max-width:100%;font-size: 15px;font-weight: 400;font-family: H67, Arial;text-transform: uppercase;">';
echo number_format("".$characterData[_CLMN_CHR_STAT_ENE_],0,",",".");
echo '</div>';
echo '</div>';
echo '</div>';
if($characterData[_CLMN_CHR_STAT_CMD_] > 0) {
echo '<div class="col-md-4 col-lg-4" style="font-weight: bold; color: #0d6efd;">Comando</div>';
echo '<div class="col-md-8 col-lg-8">';
echo '<div class="progress" style="background-color: #714f29;">';
echo '<div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="'. $FormCom .'" aria-valuemin="0" aria-valuemax="32000" style="width: ' . $FormCom . '%;min-width:10%;max-width:100%;font-size: 15px;font-weight: 400;font-family: H67, Arial;text-transform: uppercase;">';
echo number_format("" . $characterData[_CLMN_CHR_STAT_CMD_], 0, ",", ".");
echo '</div>';
echo '</div>';
echo '</div>';
}
echo '</div>';
echo '</div>';
}
echo '</div>';
} else {
message('warning', lang('error_46'));
}
// Connection History (IGCN)
if(defined('_TBL_CH_')) {
echo '<div class="page-title"><span>'.lang('myaccount_txt_16').'</span></div>';
$me = Connection::Database('Me_MuOnline');
$connectionHistory = $me->query_fetch("SELECT TOP 10 * FROM "._TBL_CH_." WHERE "._CLMN_CH_ACCID_." = ? ORDER BY "._CLMN_CH_ID_." DESC", array($_SESSION['username']));
if(is_array($connectionHistory)) {
echo '<table class="table table-condensed general-table-ui">';
echo '<tr>';
echo '<td>'.lang('myaccount_txt_13').'</td>';
echo '<td>'.lang('myaccount_txt_17').'</td>';
echo '<td>'.lang('myaccount_txt_18').'</td>';
echo '<td>'.lang('myaccount_txt_19').'</td>';
echo '</tr>';
foreach($connectionHistory as $row) {
echo '<tr>';
echo '<td>'.$row[_CLMN_CH_DATE_].'</td>';
echo '<td>'.$row[_CLMN_CH_SRVNM_].'</td>';
echo '<td>'.$row[_CLMN_CH_IP_].'</td>';
echo '<td>'.$row[_CLMN_CH_STATE_].'</td>';
echo '</tr>';
}
echo '</table>';
}
}
?>