Rose Resurrected 2026

Newbie Spellweaver
Joined
Apr 25, 2009
Messages
12
Reaction score
9
RoseResurrected-Landsca - Rose Resurrected 2026 - RaGEZONE Forums


Hi There,

I am the Original Project Manager of the RoseZA server WAY WAY back a million years ago... And I stepped away from the Project to work on my other passion, Linux Development which has been very fun... ( you can check it out here : ) I am also the creator of Electra AI ( check it out here ).

RoseZA was an Evo project, and it is sad to see the state of the project and how badly it has degraded by those it was entrusted to continue, it looks like a bulldozer went through this project.

I intend to revive it, not only revive it but make it awesome again...

Public Repository :




I have recently started working on it again, a lot of things need fixing and I am in the process of doing just that. But i will also be adding some more fun stuff... like :


AI Player Bots :
The PlayerBot AI system designed for the ROSE Online server :


Architecture & Resource Optimization​

To ensure the server's resource footprint does not skyrocket:

  1. Socket-less World Injection:
    • Bots are instantiated as authentic CPlayer objects and added to CMap::PlayerList.
    • Each bot is assigned a dummy CClientSocket with isActive = false and sock = INVALID_SOCKET. Whenever packet broadcasting functions send packets to the bot, SendPacket() immediately exits, avoiding network sockets, buffers, and system calls.
  2. Zero Extra OS Threads:
    • Bots run synchronously inside the server's existing MapProcess loop while MapMutex and PlayerMutex are held.
    • Bot AI decision cycles are throttled to 500ms ticks (CLOCKS_PER_SEC / 2), preventing unnecessary CPU cycles while keeping bot movement and combat smooth.
  3. Database Integrity:
    • Bot characters are flagged with is_bot = true. CPlayer::savedata() immediately returns for bots, preventing dummy records from polluting MySQL character tables.
  4. Seamless World Integration:
    • Because bots exist in map->PlayerList, existing monsters' AIP aggro detection naturally detects bots, attacks them, and awards exp/drops when defeated.
    • Visible real players automatically receive standard spawn (0x793), movement (0x79a), and combat (0x798) packets.

Core State Machine (​

  • BOT_STATE_IDLE: Scans surroundings for low HP/MP, nearby loot drops, or hostile monsters.
  • BOT_STATE_ROAM: Wanders within an anchor radius looking for monsters or items with stuck detection and recovery.
  • BOT_STATE_COMBAT: Closes in on targets, triggers normal auto-attacks, and defends itself when aggroed.
  • BOT_STATE_LOOT: Approaches dropped Zulies or items, picks them up into its inventory, and chains to next nearby drops.
  • BOT_STATE_REST: Sits down (Stance = 1) when HP < 40% or MP < 30% for 3× regeneration speed until reaching 95%.
  • BOT_STATE_FOLLOW: Follows the GM/leader player, assists the leader in combat, and teleports if too far away (> 50 units).
  • BOT_STATE_DEAD: Upon defeat, waits 5 seconds and revives with full HP/MP at its spawn anchor.
  • Auto-Progression: Automatically spends stat points on level up based on class archetype (Soldier: STR/CON, Muse: INT/SEN, Hawker: DEX/SEN, Dealer: CON/SEN).
I have already started creating the bots...

Currently working on :
  1. Dynamic World Spawner: Automatically spawns 8–10 bots around any player within ±4±4 levels.
  2. Auto-Accept Party Invites: Bots accept group invites, follow the leader, and assist in combat.
  3. Class Spells & Level-Tiered Gear: Bots cast class skills/spells in combat and wear gear matching their level.
The idea with the Bots is for the bots to act like real players, they will explore, grind, quest, buff, setup shop, group etc etc .. Some will be scripted, some functions will be AI controlled... I'm going to push hard for the bots to b so good that regular players will not even know ... :)

And this is only the Begining....

Also a Million bugs to fix... (and im not even joking, probably is a million.... combat system, stat system, quests, zones... there is a lot of work here to be done, and im already quite far along with those ), then add some cool stuff ( already in the works )...

I should have some stuff ready in the coming weeks for people to play with... you are welcome to follow this thread. feel free to comment and put in any requests below...

And btw, I will not be calling this RoseZA this time around, i'm still pondering a new name to use....

PS. As for Source Code, I know everyone is gonna ask about it so ill address it now... this is a tough one, the non AI stuff i can release, the AI stuff is a different story... So ill address that when we get to that bridge... for now I'm just having fun getting this stuff off the ground again.

ill post some more info as it becomes available, maybe a couple of videos as well ...

To be clear, my work will mostly just be server side. Ill only touch the client if i absolutely must.... I also work in Linux only.

feel free to comment if you have anything to say below.




Key PlayerBot System Details Implemented :​

1. Automatic World Entry & Ambient Population​

  • Startup: Bots auto-populate the world upon server initialization without requiring manual GM commands.
  • Ambient Hubs: Baseline bot populations patrol major towns and starting fields:
    • Map 22 (Adventurer's Plains): Levels 1–10 (Novice/Beginner)
    • Map 1 (Valley of Lux): Levels 10–20 (First Jobs)
    • Map 21 (Zant City): Levels 15–25 (First Jobs)
    • Map 23 (Breezy Hills): Levels 20–35 (First Jobs)
    • Map 25 (El Vergel): Levels 35–50 (First Jobs)
    • Map 2 (Junon Polis): Levels 50–70+ (Second Jobs: Knight, Champion, Mage, Cleric, Raider, Scout, Bourgeois, Artisan)

2. Dynamic Player Proximity Spawning & Despawning​

  • Proximity Population (8–10 Bots): Whenever a real player is in the world, the spawner maintains 8–10 playerbots within 80m of that player.
  • Level Scaling: Dynamically spawned bots are configured within ±4±4 levels of the nearby player.
  • Resource Management (Orphan Pruning): Dynamic bots that remain more than 120m away from real players for longer than 60 seconds (and are not in a player's party) are automatically recycled to maintain low CPU and memory footprints.

3. Party Auto-Accept, Follow & Group Assist​

  • Party Auto-Accept: When a player sends a party invite to a bot (0x7d0), the bot auto-accepts immediately (0x7d1), sends an in-game message ("I'm with you! Let's hunt together!"), and enters follow mode (BOT_STATE_FOLLOW).
  • Target Assist & Defense:
    • The bot assists the party leader by focusing on whichever mob the leader attacks.
    • If a mob attacks the leader, the bot detects the threat and counter-attacks.
  • Party Healer AI: Muse and Cleric bots monitor party members' HP. If any party member falls below 60% HP, the bot casts Cure, Recovery, or Party Heal.

4. Stats, Skills & Combat Spells​

  • Skill Progression: Bots automatically learn class-appropriate spells matching their job and level (Soldier: Double Attack, Fatal Thrust, Voltage Crash; Muse: Mana Bolt, Ice Bolt, Cure; Hawker: Double Arrow, Triple Arrow, Stun Arrow; Dealer: Twin Shot, Triple Shot).
  • Skill Points & Stat Points: Allocated automatically as bots level up. Skill ranks scale up to rank 10 based on level.
  • Combat Rotation: Bots cast offensive spells when MP >15>15, respect cooldowns, and smoothly resume weapon attacks.

5. Tiered Visual Gear Matching Level​

  • Equipment upgrades automatically across 4 level tiers:
    • Tier 1 (Lvl 1–19): Wooden/Bronze sets, Toy Bow, Air Gun, Wooden Staff, Two-Handed Sword.
    • Tier 2 (Lvl 20–39): Copper/Adventurer sets, Short Bow, Iron Gun, Iron Staff, Broadsword.
    • Tier 3 (Lvl 40–69): Steel/Hunter sets, Long Bow, Rifle, Battle Staff, Claymore.
    • Tier 4 (Lvl 70+): Mithril/Grandmaster sets, Wing Bow, Shotgun, White Staff, Slayer.
  • Bots broadcast visual equip packets (0x7a5) so players see their armor, weapons, and shields in real time, and bots are flagged with infinite ammo so ranged classes never run out of arrows or bullets.

Stability & Bug Fixes Applied​

  1. Map Bounds Fix: Replaced a fixed 0..500 index loop in CBotManager::CheckProximitySpawns with iteration over GServer->MapList.Map, preventing out-of-bounds heap reads.
  2. Combat Skill Cast Throttling: Added isStartingCast guard in DoAttack so SKILL_ATTACK does not re-trigger attack logging and monster AI scripts every 10ms10ms while casting.
  3. Monster Death Null Pointers: Added monster != NULL checks before accessing monster->TD in battle.cpp lines 82, 837, and 2025.
  4. Crash Reporting: Added <execinfo.h> stack trace logging in Signal.cpp to output function frames if any signals occur.

    Work continues....

SUCCESS !!!!

The Bots are connected and working... ( see video, its just me and bunch of bots ). now the real fun begins...

<iframe width="560" height="315" src="" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

Fixed the combat radius issue where players would see other players standing on top of a monster while fighting :

Is this happening in real-time or is it just what other people see?​

It is actually happening in both:

  1. Real-time server coordinates: In the server's movement loop, attacking entities (bots, players, and monsters) had their destination coordinate set to the exact center of the monster (mob->x, mob->y). Because the logic to stop moving when reaching attack distance was commented out, characters continued walking every tick (50 times/second) until their distance dropped below 0.01m, physically merging them onto the exact same coordinates.
  2. Visual client glitch: When initiating an attack or moving to engage, packets 0x798 and 0x79a broadcast the monster's center coordinates to all nearby clients. Furthermore, no stop packet was broadcast when reaching melee reach, so observing clients rendered characters walking straight into the monster's model.

Can it be fixed?​

Yes. I have prepared a comprehensive implementation plan in implementation_plan.md to implement combat spacing across the server:

  • Vector-based Combat Standoff: Characters calculate a combat arrival point at proper weapon standoff distance (~1.8m – 2.2m for melee, or weapon reach ×× 0.85 for ranged/magic) rather than the monster's center.
  • Immediate Combat Halt: The moment an entity enters weapon/skill reach, the server halts their movement immediately and broadcasts a stop packet to visible clients, preventing momentum from carrying them into the monster's model.
  • Bot Combat Spacing: PlayerBots compute standoff waypoints so they never sprint into the mob's center during the 500ms AI decision interval.

The combat space radius and overlapping collision issue has been resolved.

What Was Fixed​

  1. Combat Standoff Position (GetCombatPosition):
    • Added CCharacter::GetCombatPosition to calculate a target approach coordinate offset along the approach vector: u⃗=Pattacker−Ptarget∥Pattacker−Ptarget∥u=∥Pattacker−Ptarget∥Pattacker−Ptarget Pdest=Ptarget+u⃗×combatDistancePdest=Ptarget+u×combatDistance
    • Melee characters stop 1.8m – 2.2m away from the target; ranged characters and spellcasters stop at 85% of their attack reach (e.g., ~15m for bow/magic).
  2. Packet Broadcasts (0x798, 0x7b3):
    • StartAction now broadcasts the standoff coordinate rather than the exact center of the target.
    • If an entity is already within attack range, they do not step forward into the monster.
  3. Immediate Combat Halt (UpdatePosition & DoAttack):
    • In character.cpp:UpdatePosition and battle.cpp:DoAttack, when IsTargetReached() becomes true, moving characters immediately stop and broadcast a stop packet (0x79a for players/bots, 0x797 for monsters). This prevents momentum from carrying them into the monster while waiting for attack cooldown timers.
  4. PlayerBot AI Standoff Navigation:
    • In PlayerBot.cpp:HandleCombat, bots now move to GetCombatPosition rather than the monster's exact coordinate, ensuring they never sprint into the monster during the 500ms AI interval.

Done and dusted... Another bug fixed ! See the video, notice how bots/ players and monsters now keep the required combat gap while fighting.

<iframe width="560" height="315" src="" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
 
Last edited:
After a complete Audit of the Server code, I have made a Todo-List of what is broken or partially working and what needs to be done. And I will work on thus roadmap to complete all the missing/broken parts. I am really surprised that so many years have passed and very little of this was coded or fixed... in fact some things i specifically remember working seems to be missing or broken. So i will fix it all... here is the full Audit :



First round of Fixes Done :
  1. Server-Side PvP Attack Safety Validation
    • File: worldpackets.cpp:1621 (pakStartAttack) & charfunctions.cpp:120 (StartAction)
    • Closed vulnerability where client packets targeting other players in safe zones (towns, adventure maps where map->allowpvp == 0) initiated combat.
    • Enforced friendly-fire prevention in team PvP modes (thisclient->pvp_id == targetPlayer->pvp_id).
  2. Quest Timer Engine Activation (QUESTREWD(013))
    • Files: player.h, playerfunctions.cpp:2188, MainProcess.cpp:234, QuestActions.cpp:1088
    • Activated the previously stubbed delayed quest trigger queue (SDelayedQuestTrigger).
    • Timed triggers register their future execution timestamp (time(NULL) + iSec) and fire reliably in the main player tick loop.
  3. Driving Stance Skill Casting Fix
    • File: worldpackets.cpp (pakStartSkill, pakSkillSelf, pakSkillAOE)
    • Removed blanket Status->Stance == DRIVING block.
    • Permitted driving/vehicle skills (skill tab 30–39 / family 1) while mounted on Castle Gear or Carts (checking motor and fuel), while blocking character on-foot skills and preventing vehicle skills when on foot.
  4. Valkyrie Charm (A_ADDDMG / Buff 83) INT Scaling Bonus
    • File: Buff.cpp:1030
    • Implemented INT scaling calculation: Value += (int)((Evalue - 15) / 8.0f), matching standard Cleric buff curves.
  5. Server Connection Capacity Limit
    • Files: SocketServer.cpp:160 & worldserver.cpp:273
    • Added capacity checks comparing active client count against Config.MaxConnections, gracefully rejecting and closing excess sockets.
  6. Cart & Castle Gear (PAT) Combat Formulas (playerstats.cpp):
    • Subclass ATK Formulas: Replaced placeholder fallback calculations and removed "ATK is not coded yet" warnings for all Cart weapon types:
      • Type 571 (Stone Hammer / Doom Hammer): Physical melee bludgeon scaling with Level (0.35), STR (0.75), and CON (0.40).
      • Type 572 (Battle Mirror / Battle Crystal): Magic / energy mental power scaling with Level (0.35), INT (0.85), and SEN (0.45).
      • Type 573 (Battle Bow / Tarkion Bow): Ranged ballistic power scaling with Level (0.35), DEX (0.85), and SEN (0.40).
      • Type 574 (Battle Katar / Battle Spear): Swift piercing strikes scaling with Level (0.35), STR (0.55), and DEX (0.65).
      • Types 575 & 551 (Battle Machine Gun / Battle Launcher): Heavy artillery scaling with Level (0.35), CON (0.65), STR (0.45), and DEX (0.35).
      • Factored in hand-weapon grade ATK scaling (weaponatk * 0.15) when an on-foot weapon is equipped.
    • Subclass ACC Formulas: Added missing case 551: and calibrated baseline accuracy offsets across all Cart weapon subclasses to prevent stat spikes and eliminate "ACC is not coded yet" logs.
  7. NPC Equipment Repair Economy (worldpackets.cpp:8261):
    • Implemented standard ROSE repair pricing based on base item price and lost condition: repair_cost=max⁡(10,⌊bprice×99−lifespan100×0.05⌋)repair_cost=max(10,⌊bprice×10099−lifespan×0.05⌋)
    • Validates player funds, deducts Zulies, restores lifespan to 99, and returns packet 0x7cd with the player's updated Zuly balance.
  8. Active Timed Quest Countdown & Conditions (Completed from Phase 2):
    • Added a 1-second interval ticking loop in playerfunctions.cpp:2212 for active quests with time limits, expiring them and calling SendQuestUpdate().
    • Completed QUESTCOND(012) (IFO / WarpGate / NPC lookup), QUESTCOND(016) (Zone Time), QUESTCOND(017) (variable double-read fix), QUESTCOND(022) (Server channel ID), QUESTCOND(028/029) (Clan conditions), QUESTREWD(012) (NPC Shout/Announce), and QUESTREWD(027) (Clan CP).
  9. Clan Skills Engine:
    • Persist clan skills in list_clan.skills and load them into memory (skills[60]).
    • Replace the hardcoded 120-byte zero arrays in SendClanInfo, SendRewardPoints, SendClanPoints, and lma_mask with the active clan skills.
    • Apply passive clan skill buffs (Blessings of Power, Defense, Magic, Accuracy, Agility, Health, Mana, Speed) to all active clan members across player stat calculations in playerstats.cpp.
  10. Clan Storage & Shared Vault:
    • Create clan_storage table in MySQL roseza.
    • Implement clan vault access in pakStorage, pakChangeStorage, and pakStoreZuly with role permissions (Leader/Deputy rank ≥5≥5 required for withdrawals).
  11. Clan Funds & Economy:
    • Add money column to list_clan.
    • Implement clan Zuly deposit and withdrawal accounting with wire updates.
  12. Clan Quests & Conditions:
    • Implement QUESTCOND(025) (Clan Contribution Points), QUESTCOND(028) (Clan Funds), and QUESTCOND(030) (Clan Skills check).
    • Implement QUESTREWD(024) (Clan Money award/deduct) and QUESTREWD(026) (Clan Skill learning).
  13. Clan Skills Persistence & Wire Format:
    • Added skills VARCHAR(500) column to list_clan in MySQL.
    • Loaded and parsed comma-separated clan skill IDs on login in charserver.cpp and playerdata.cpp.
    • Replaced hardcoded zero buffers with the full 120-byte clan skills block (60 WORDs) in packet 0x7e0:0x33 (SendClanInfo), SendClanPoints, and SendRewardPoints in clan.cpp.
  14. Clan Passive Skill Calculations:
    • Implemented CPlayer::ApplyClanPassive in playerstats.cpp.
    • Integrated Clan Passives across:
      • Combat stats: Attack Power (A_ATTACK), Defense (DEFENSE, A_DEFENSE), Magic Defense (A_MRESIST, MAGIC_RESISTENCE_2), Accuracy (ATK_ACCURACY, A_ACCUR), Dodge (DODGE, A_DODGE), Critical (A_CRITICAL, CRITICAL), Attack Speed (A_HASTE), Movement Speed (MOV_SPEED, A_DASH), Max HP (A_MAX_HP, A_HP, MAX_HP), Max MP (A_MAX_MP, A_MP, MAX_MP).
      • Core attributes: STR (A_STR), DEX (A_DEX), INT (A_INT), CON (A_CON), CHA (A_CHA), and SEN (A_SEN) via GetExtraStatsSkills().
  15. Clan Storage Shared Vault & Clan Bank:
    • Created table clan_storage (clanid, slotnum primary key) in roseza database.
    • Added money BIGINT UNSIGNED to list_clan and 8-byte QWORD serialization.
    • In worldpackets.cpp:
      • pakStorage (0x10, 0x20): Loads stored clan items and balance into packet 0x7ad.
      • pakChangeStorage (0x10, 0x11): Allows depositing items; enforces Master/Deputy authorization (Clan->clanrank >= 5) for item withdrawals.
      • pakStoreZuly (0x20, 0x21): Clan Bank deposit/withdraw with Master/Deputy check (clanrank >= 5).
  16. Clan Quest Engine Integration:
    • QuestConditions.cpp:
      • QUESTCOND(025): Checks player's ClanContribution.
      • QUESTCOND(028): Verifies clan funds (Clan->money >= data->m_nMONEY).
      • QUESTCOND(030): Checks if the clan has learned a specific skill.
    • QuestActions.cpp:
      • QUESTREWD(024): Clan Money reward adjustment and database update.
      • QUESTREWD(026): Clan Skill learning with database persistence and real-time online clan member stat recalculation.
------

I have setup a Public Repository. Anyone is free to grab the source code from there :

 
Last edited:
Hey man! @amaedict
It's crazy that today I tried to set up a private ROSE Server for my friends and Claude noticed that a new repository got created today - I could help you develop this, if you need any help and I'd like some guidance for the setup as well. Contact me on Discord @ matooo321
 

And the work continues, Completed Patch :​

​

1. Multi-Mode PvP Zone Engine (​

  • Parsed STB columns 18 (allowpvp) and 20 (zone_type) into 5 distinct PvP modes in worldmap.h and startup.cpp:
    • Mode 0 (PVP_MODE_OFF): Safe towns (Zant, Junon Polis, Eucar, Xita), adventure maps, and Agits (Zones 15–18, 40). Zero PvP combat allowed.
    • Mode 1 (PVP_MODE_FFA): Free-for-All maps (Training Grounds, Desert of the Dead, Temple Campgrounds, Forgotten Temple, Sikuku Ruins, Gates of Muris). Anyone outside your party is attackable.
    • Mode 2 (PVP_MODE_TEAM): Akram Arena / Colosseum (Map 9). Players are assigned to Red or Blue teams.
    • Mode 3 (PVP_MODE_CLAN): Clan Fields (Lion's Plains Map 8, Junon Clan Fields 11–13, Luna Clan Field 59, Pedion 101–120). Clanmates share team IDs and cannot damage each other.
    • Mode 4 (PVP_MODE_UNION): Junon Cartel (Map 5) and Union conflict zones. Members of the same Union cannot damage each other.

2. Centralized Combat Safety Engine (​

  • Enforced unified safety checks in character.h and character.cpp:
    • Large Bonfire Protection: Blocks attacks on Large Bonfires (montype 806).
    • Safe Map Protection: Prevents attacks in non-PvP zones.
    • Friendly-Fire Prevention: Blocks damaging party members, same-team players (pvp_id), clanmates (clanid), and union allies (unionid).
    • Summon Protection: Protects player summons from non-hostile attacks.
  • Integrated across:
    • Normal attacks (pakStartAttack, StartAction)
    • Targeted attack skills (pakStartSkill)
    • Targeted buffs/heals (prevents healing or buffing hostile players in PvP)
    • AoE attack skills (AoeSkill)
    • AoE debuffs (AoeDebuff)
  • PvP Death Penalty Immunity: Exempted all PvP maps, Clan Fields, and Arena from death EXP loss in battle.cpp:TakeExp.

3. Akram Arena / Colosseum Match Manager (​

  • Implemented match lifecycle singleton in Arena.h and Arena.cpp:
    • Automated round states: IDLE, COUNTDOWN, ACTIVE, ENDED.
    • Team balancing: Red Team (Base 301 at 5211.4f, 4867.9f) vs Blue Team (Base 302 at 5200.5f, 4725.1f).
    • Automated respawn timer (5 seconds) reviving dead combatants directly at their base with full HP/MP.
    • Round end condition: 10 kills or 5-minute timeout.
    • Rewards: +50,000 Zulies and +50,000 EXP for winners; +15,000 Zulies and +15,000 EXP for losers.
    • Player/GM commands: /arena join, /arena leave, /arena score, /arena status, /arena start, /arena stop.

4. Union Wars & Clan Field Scoring​

  • Set minimum player threshold UWNbPlayers to 1 in worldserver.cpp so Union Wars can start cleanly.
  • Enemy kills in Clan Fields now award +5 Clan Contribution Points (CP) to the killer in battle.cpp:UWKill.



------
------

Vendor Bots Patch :


Implementation Plan — Autonomous Vending Bots in Major Hub Towns​

Goal Description​

Implement an autonomous Vending Bot System allowing player bots to set up permanent personal vending shops across high-traffic hotspots in Junon Polis (Map 2) and Canyon City of Zant (Map 1). Vending bots will specialize in specific merchandise categories (Equipment & Gear, Jewels & Refining Materials, Crafting Materials & Monster Drops, Consumables & Ammo, Accessories & Jewelry, PAT/Cart & Miscellaneous). Real players will be able to approach, see their overhead shop banners, open their shop stalls, browse stocked items with prices, and purchase items using Zulies. Vending bots will automatically restock their inventory so stalls remain permanently active.

Grouped by component:

1. Bot State & Player Stance Engine​

[MODIFY]​

  • Add BOT_STATE_VENDING to enum BotState.
  • Add bool m_isVendingBot; and int m_vendingCategory; to CPlayerBot.
  • Add member functions:
    • void HandleVendingBot();
    • void SetupVendingShop( const char* shopTitle, int category );
    • bool IsVendingBot() const { return m_isVendingBot; }
    • void SetVendingBot( bool v ) { m_isVendingBot = v; }
  • In CBotManager:
    • Declare CPlayer* SpawnVendingBot( const char* name, int job, int level, int mapId, fPoint pos, const char* shopTitle, int category );
    • Declare void CheckVendingBots();
    • Add bool m_vendingBotsInitialized; and clock_t m_lastVendingBotCheck;

[MODIFY]​

  • In CPlayerBot::CPlayerBot(): initialize m_isVendingBot = false; m_vendingCategory = 0;.
  • In CPlayerBot::Update(): bypass standard AI loop when m_isVendingBot is true; call HandleVendingBot().
  • Implement CPlayerBot::HandleVendingBot():
    • Ensures m_player->Shop->open == true.
    • Ensures the bot stays seated in shop stance.
    • Periodically (every 45-60s) broadcasts an overhead promotional shout for the shop.
  • Implement CPlayerBot::SetupVendingShop( const char* shopTitle, int category ):
    • Populates inventory slots 12 through 41 (or appropriate tab slots) with category-specific items.
    • Configures m_player->Shop->SellingList: slot index, count (e.g. 999 for stackables, 1 for equipment), and fair Zuly price.
    • Sets m_player->Shop->Selling = numItems;.
    • Sets m_player->Shop->open = true;.
    • Sets m_player->Shop->ShopType = 0;.
    • Copies shopTitle into m_player->Shop->name.
    • Broadcasts 0x7c2 (Shop opened) to nearby visible clients.
  • Implement CBotManager::SpawnVendingBot(...):
    • Spawns a static (isDynamic = false) player bot with job (Dealer 311 / Bourgeois 322 / Artisan 321 / Knight 121 / Muse 211) and appropriate level.
    • Equips visually appealing class-specific gear.
    • Calls SetupVendingShop(shopTitle, category).
  • Implement CBotManager::CheckVendingBots():
    • Defines the 18 static vending bot configurations (name, job, level, mapId, position, shop title, category).
    • Ticks every 30 seconds; verifies all 18 vending bots exist and are open; spawns any missing bots.
  • In CBotManager::Update():
    • Call CheckVendingBots().

2. Item Catalog & Category Populator​

[NEW]​

  • Implement PopulateVendingInventory( CPlayer* bot, int category ):
    • Category 1: Equipment & Weapons (Swords, Bows, Guns, Launchers, Staffs, Katars, Dual Weapons).
    • Category 2: Armor & Shields & Wings (Nomadic sets, Knight sets, Shields, Fairy/Angel/Devil Wings).
    • Category 3: Gems & Jewels (Rubies, Sapphires, Topazes, Emeralds, Peridots, Diamonds T3–T7).
    • Category 4: Refining Catalysts & Runes (1st–10th Grade Talismans, Bindrunes, Apotropes, Venurune, Mercurune, Nepturune, Jupiterune, Saturune, Plutorune, Arua Fate).
    • Category 5: Crafting Materials & Monster Drops (Metals, Leathers, Threads, Feathers, Oils, Spirit Stones).
    • Category 6: Consumables, Potions & Scrolls (Health/Mana Bottles, Vital Water, Red/Blue Potions, Return Scrolls, Buff Scrolls).
    • Category 7: Ammunition (Elemental Arrows, Bullets, Shells).
    • Category 8: Accessories & Jewelry (Core stat rings, necklaces, earrings).
    • Category 9: PAT & Cart Parts (Cart Frames, Engines, Wheels, Cores, Event items).

3. Vending Transaction Safety & Auto-Replenishment​

[MODIFY]​

  • In pakBuyShop (around line 6890-6920):
    • When the seller is a bot (otherclient->is_bot):
      • Do not allow the selling slot to be cleared or depleted.
      • Replenish stackables back to full count (999) and equipment back to 1.
      • Buyer receives their purchased quantity and Zulies are deducted normally.
      • The shop remains open and populated for other players.

[MODIFY]​

  • In CPlayer::SaveSlot41( unsigned int slot ):
    • Add if ( is_bot ) return; at the beginning of the function to prevent unnecessary MySQL items table writes/deletions for bot inventory.

4. Build System & Documentation​

[MODIFY]​

  • Add VendingCatalog.cpp and VendingCatalog.h to the World Server source list.

5. Specialized Catalogs & Automated Restocking​

  • Catalog Populator(VendingCatalog.h, VendingCatalog.cpp):
    • Implemented PopulateVendingInventory() covering all 18 categories with exact item IDs, counts, refines (+1 to +7), durability, sockets, and Zulies pricing.
  • Wire-Level Shop Display & Purchasing(worldpackets.cpp, player.cpp):
    • CreateSpawnPacket: Streams sitting shop stance (0x02) and the overhead shop title string to all approaching clients.
    • pakShowShop (0x7c4): Streams the bot's complete selling catalog with prices.
    • pakBuyShop (0x7c5): Handles player purchases, Zulies transfer, and infinite auto-restocking (stackables instantly replenish to 999 and gear stays at 1 so stalls never deplete).
  • Database Safety(playerfunctions.cpp:SaveSlot41):
    • Added if ( is_bot ) return; to prevent MySQL queries for bot virtual items.
  • Periodic Overhead Promotional Shouts:
    • Implemented GetVendingPromoMessage() in VendingCatalog.cpp. Vending bots periodically shout authentic promotional messages via CPlayerBot::Say() (0x783) every 60–90 seconds.
  • Immunity & Permanence:
    • Vending bots are marked static (isDynamic = false) to guarantee immunity from dynamic bot pruning, and their HP/MP is auto-restored continuously.


Done and Dusted !




-------
-------


Dynamic Dungeon Instancing, Mail System Upgrades & AIP Opcodes :​

Implemented the core gameplay, instancing, and polish systems outlined in the RosE Resurrected Roadmap for Milestone: Dynamic Dungeon Instancing & Polish:

  1. Dynamic Dungeon Instancing (CDungeonManager): Provide private, party-isolated CMap instances for cave dungeons (Goblin Cave, George's Cave, Oblivion Temple, Forgotten Temple) with dynamic instance allocation (≥200≥200), isolated monster spawns from IFO definitions, party visibility bounds, countdown timers, party wipe auto-teleports, and automatic cleanup when empty.
  2. Mail System Upgrades: Replace the destructive DELETE FROM mail_list WHERE sendtocharid=%u batch wipe with per-message tracking, read flags, Zuly attachments, item parcel delivery, and in-game /mail interaction commands.
  3. Missing Monster AIP Scripting Opcodes: Complete all stubbed AIP conditions and actions (CDT 015 WorldVar, CDT 016 EconomyVar, CDT 023 Game Map Time, CDT 026 Server Channel, Charm stat evaluation in AI_GetAbility, ACT 026 Set WorldVar, ACT 027 Set EconomyVar, ACT 032 Set Zone PvP, ACT 033 Set Zone Regen).
  4. Automatic GitHub Synchronization: Cleanly compile all three server executables (worldserver, loginserver, charserver), restart daemons, update documentation (todo-list.txt, todo-list.html, README.md), and execute mandatory auto-push via ./git_sync.sh.
Grouped by component:

1. Dynamic Dungeon Instancing & Map Architecture​

[NEW]​

  • Declare class CDungeonManager singleton.
  • Map registry of dungeon cave zones:
    • Goblin Cave: Maps 24 (B1), 26 (B2), 28 (B3).
    • George's Cave: Maps 31 (B1), 32 (B2), 33 (B3).
    • Oblivion Temple / Sea of Seeds: Maps 41, 42, 43, 44.
    • Forgotten Temple: Maps 56, 57.
  • Methods:
    • IsDungeonZone(UINT mapId)
    • GetOrCreatePartyInstance(CPlayer* player, UINT baseMapId)
    • CreateInstance(UINT baseMapId, UINT partyId)
    • DestroyInstance(CMap* map)
    • Update() (ticked each second in MainProcess.cpp)
    • HandlePartyWipe(CMap* map)
    • HandleTimeout(CMap* map)
    • GetRemainingTime(CMap* map)

[NEW]​

  • Implementation of instance lifecycle:
    • Clones base map properties, sets is_instance = true, base_zone = baseMapId, party_id = partyId, time_limit_sec = 1800 (30 minutes).
    • Clones IFO spawns and populates initial monster mobs with unique client IDs.
    • Tracks instance expiration countdowns: warnings at 10m, 5m, 1m; collapses instance at 0m and teleports players back to town.
    • Detects full party wipe (all members in instance dead): broadcasts wipe notification, revives players with 20% HP/MP without EXP loss, teleports to town/entrance, and marks instance for teardown.
    • Automatic teardown when PlayerList is empty for >30 seconds, freeing monsters, drops, client IDs, and cleaning MapList.

[MODIFY]​

  • Add instance fields to CMap:
UINT base_zone;
UINT instance_id;
UINT party_id;
clock_t creation_time;
UINT time_limit_sec;
bool is_instance;
bool is_wiped;
clock_t empty_since;


[MODIFY]​

  • Update CMap::~CMap(): Guard shared static lists (RespawnList, TeleGateList, NPCList, MonsterSpawnList) so instanced maps only free their own dynamic objects without corrupting base templates.

[MODIFY]​

  • In CMap::TeleportPlayer:
    • When constructing packet 0x7a8, stream (base_zone != 0 ? base_zone : id) to the client while keeping player->Position->Map = id internally.

[MODIFY]​

  • Expand MapList.Index allocation to MAX_MAP_INDEX = 1000 (up from 122) and initialize to nullzone, safely supporting dynamic instance slots 200..999.

[MODIFY]​

  • Call CDungeonManager::GetInstance()->Update() once per second in the main server loop.

[MODIFY]​

  • In pakGate: Intercept teleports leading into dungeon zones; if the player is in a party, route into their private CMap instance.
  • In pakRestart: Handle respawn in instances and trigger party wipe checks if appropriate.

2. Mail System Upgrades & Parcel Delivery​

[MODIFY]​

  • In packet 0x7e5:
    • Action 0x01 (Read Mails): Query unread mails, format attachment notifications into message string for client memo UI ([Zuly: %llu | Item: %s] ... (Type /mail claim %u to retrieve)), and mark is_read = 1 rather than deleting records from the database.
    • Action 0x03 (Mail Count): Count unread/unclaimed mails WHERE sendtocharid=%u AND (is_read=0 OR is_claimed=0).
    • Action 0x04 (Delete Mail): Handle per-message deletion: DELETE FROM mail_list WHERE id=%u AND sendtocharid=%u.

[MODIFY]​

  • Implement /mail chat command suite:
    • /mail list: Lists pending mails with ID, sender, date, Zuly, and item attachment status.
    • /mail read <id>: Reads mail text.
    • /mail claim <id>: Transfers attached Zulies and item into player's wallet and inventory, and sets is_claimed = 1.
    • /mail send <player> <zuly> [inv_slot] <message>: Sends mail with Zuly and/or item from specified inventory slot to another player.
    • /mail delete <id>: Deletes a specific mail by ID.
    • /mail help: Displays command syntax.

[MODIFY]​

  • Append schema migration for mail_list (is_read, zuly, item_head, item_data, item_name, is_claimed).

3. Missing Monster AIP Scripting Opcodes​

[MODIFY]​

  • Add int WorldVar[256]; and int EconomyVar[256]; to CWorldServer.
  • Add accessor and mutator methods:
    • int GetWorldVar(UINT idx);
    • void SetWorldVar(UINT idx, int val, byte op);
    • int GetEconomyVar(UINT idx);
    • void SetEconomyVar(UINT idx, int val, byte op);

[MODIFY]​

  • AI_GetAbility: Handle case 5 (Charm) by returning player->Attr->Cha for player targets.
  • AICOND(015): Implement WorldVar condition check using GServer->GetWorldVar(data->nVarIDX) and OperateValues.
  • AICOND(016): Implement EconomyVar condition check using GServer->GetEconomyVar(data->nVarIDX) and OperateValues.
  • AICOND(023): Implement Game Map Time check comparing map->ZoneTime between data->ulTime and data->ulEndTime.
  • AICOND(026): Implement Server Channel condition comparing GServer->Config.ServerID between data->nMin and data->nMax.

[MODIFY]​

  • AIACT(026): Implement Set World Variable using GServer->SetWorldVar(data->nVarNo, data->iValue, data->btOp).
  • AIACT(027): Implement Set Economy Variable using GServer->SetEconomyVar(data->nVarNo, data->iValue, data->btOp).
  • AIACT(032): Implement Set Zone PvP flag on map->allowpvp and broadcast packet 0x70f.
  • AIACT(033): Implement Set Zone Regen system flag.

Done and Dusted !




-------
-------

Bug Fixes :

  1. Fix the "Falling from the Sky" Glitch:
    • Correct the entity spawn packet (0x793) state evaluation in player.cpp (fixing a coordinate typo and ensuring stationary characters spawn with CMD_STOP 0x0000 instead of CMD_MOVE 0x0001).
    • Switch movement stopping from 0x79a (GSV_MOVE) to the official 0x770 (GSV_STOP) in PlayerBot.cpp and charfunctions.cpp, preventing client-side altitude resets and bouncing.
  2. Combat & Stats System Corrections:
    • Fix an inverted shield block check in battle.cpp where attackers blocked their own damage while ignoring defender shields.
    • Guard against zero-defense arithmetic anomalies and ensure proper magic defense scaling.
  3. Advanced Player Bot Group & Party AI:
    • Party Formation Offsets: Prevents bots from stacking on top of the leader into a single model blob by distributing them into tactical formation slots (Knight vanguard/flank, Cleric rear support, Scout/Dealer ranged flank).
    • Active Party Buffing: Cleric and Muse bots continuously maintain essential buffs (Hustle Charm, Clobber Charm, Resilience Charm, Battle Charm) on party members.
    • Party Resurrection: High-level Cleric bots detect fallen party members and cast Revive.
    • Tank Taunt & Threat Management: Knights and Soldiers intervene when squishy party members or the leader are attacked.
    • Party Etiquette & Commands: Prevents party bots from sprinting away to snatch loot drops, and introduces /party bot buff, /party bot follow, and /party bot assist.

Done and Dusted !


 
Last edited:
this is unexpected release open source and C++ ?!!
i like you human :tttfg:

#edit do you have discord server for this project i dont know how to set up client side :chomp:
 
Last edited:
I respect you. Your passion is truly impressive.

nothing to it, i love coding... anyway, i have some free time so im fixing up all my favorite games in the private sector.

i am also fixing Vanilla Wow, also exapnding on the playerbot system greatly, and fixing all issues i find... so im working on both games at the same time.

https://forum.ragezone.com/threads/solo-vanilla-wow.1273634/

 
As much as i respect the idea that someone is willing to work on an actual rose emulator in 2026 the fact that you do so without client source will make it painful and ultimately disappointing.

There are simply so much bugs that are not server dependent, especially anything that touches the combat presentation.
Also you'll ultimately always be stuck in the past, no AA, no high resolution, crappy UI...

for about 6 months now, nothing would have been possible without the client source, especially the ability to produce debug logs.

There is an evo source for the client that is going around, you can find it here :
I highly suggest you use that as opposed to a RoseZA client that will never evolve.

Lastly i suggest you join the osrose discord if you ever need help / advices on rose developpment.
Ragezone is pretty much just a dead zone at this point.
 
Last edited:
As much as i respect the idea that someone is willing to work on an actual rose emulator in 2026 the fact that you do so without client source will make it painful and ultimately disappointing.

There are simply so much bugs that are not server dependent, especially anything that touches the combat presentation.
Also you'll ultimately always be stuck in the past, no AA, no high resolution, crappy UI...

for about 6 months now, nothing would have been possible without the client source, especially the ability to produce debug logs.

There is an evo source for the client that is going around, you can find it here :
I highly suggest you use that as opposed to a RoseZA client that will never evolve.

Lastly i suggest you join the osrose discord if you ever need help / advices on rose developpment.
Ragezone is pretty much just a dead zone at this point.

I remember you from back in the day... way way back. respect for the work you do :D

I never said i didnt have a client ... i just said i wont publically work on a client. The thing is i am actually working on games for my linux usersbase, especially on the AI front ( adding ai playerbots and AI npc's into the game to give a more solo expierience ) and as a side effect of that i am also sharing publically so that others can make use of it ( only the server code ). On my linux you can choose any resolution, in fact it auto detects your resolution and sets it for you as you see below :



Screenshot from 2026-10-01 11-17-11 - Rose Resurrected 2026 - RaGEZONE Forums



Screenshot from 2026-10-01 11-17-40 - Rose Resurrected 2026 - RaGEZONE Forums


Screenshot from 2026-10-01 11-17-44 - Rose Resurrected 2026 - RaGEZONE Forums



However, i am always willing to work on newer source, i dont mind contributing to active projects, I work hard and i work fast and i dont sleep, so I am sure i can be of use.... i will take a look at your github, but also i dont see a client listed there, just pieces of a client... are you using the current official rose client and patching it ?
 
As long as you have a hand on the client ( one way or another, injection or source... ) i guess its fine and the future of your project looks better, i was just a little confused from the original post.

I do offer full client sources if you ever want to check it out.

Anyways keeping an eye on your work man, keep up the good work !
 
As long as you have a hand on the client ( one way or another, injection or source... ) i guess its fine and the future of your project looks better, i was just a little confused from the original post.

I do offer full client sources if you ever want to check it out.

Anyways keeping an eye on your work man, keep up the good work !

great, thank you, i will take a look at your project and see how i can contribute :)
 
Back