1/**
2 * The Forgotten Server - a free and open-source MMORPG server emulator
3 * Copyright (C) 2019 Mark Samman <mark.samman@gmail.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20#ifndef FS_CONST_H_0A49B5996F074465BF44B90F4F780E8B
21#define FS_CONST_H_0A49B5996F074465BF44B90F4F780E8B
22
23static constexpr int32_t NETWORKMESSAGE_MAXSIZE = 65500;
24
25enum MagicEffectClasses : uint16_t {
26 CONST_ME_NONE,
27
28 CONST_ME_DRAWBLOOD = 1,
29 CONST_ME_LOSEENERGY = 2,
30 CONST_ME_POFF = 3,
31 CONST_ME_BLOCKHIT = 4,
32 CONST_ME_EXPLOSIONAREA = 5,
33 CONST_ME_EXPLOSIONHIT = 6,
34 CONST_ME_FIREAREA = 7,
35 CONST_ME_YELLOW_RINGS = 8,
36 CONST_ME_GREEN_RINGS = 9,
37 CONST_ME_HITAREA = 10,
38 CONST_ME_TELEPORT = 11,
39 CONST_ME_ENERGYHIT = 12,
40 CONST_ME_MAGIC_BLUE = 13,
41 CONST_ME_MAGIC_RED = 14,
42 CONST_ME_MAGIC_GREEN = 15,
43 CONST_ME_HITBYFIRE = 16,
44 CONST_ME_HITBYPOISON = 17,
45 CONST_ME_MORTAREA = 18,
46 CONST_ME_SOUND_GREEN = 19,
47 CONST_ME_SOUND_RED = 20,
48 CONST_ME_POISONAREA = 21,
49 CONST_ME_SOUND_YELLOW = 22,
50 CONST_ME_SOUND_PURPLE = 23,
51 CONST_ME_SOUND_BLUE = 24,
52 CONST_ME_SOUND_WHITE = 25,
53 CONST_ME_BUBBLES = 26,
54 CONST_ME_CRAPS = 27,
55 CONST_ME_GIFT_WRAPS = 28,
56 CONST_ME_FIREWORK_YELLOW = 29,
57 CONST_ME_FIREWORK_RED = 30,
58 CONST_ME_FIREWORK_BLUE = 31,
59 CONST_ME_STUN = 32,
60 CONST_ME_SLEEP = 33,
61 CONST_ME_WATERCREATURE = 34,
62 CONST_ME_GROUNDSHAKER = 35,
63 CONST_ME_HEARTS = 36,
64 CONST_ME_FIREATTACK = 37,
65 CONST_ME_ENERGYAREA = 38,
66 CONST_ME_SMALLCLOUDS = 39,
67 CONST_ME_HOLYDAMAGE = 40,
68 CONST_ME_BIGCLOUDS = 41,
69 CONST_ME_ICEAREA = 42,
70 CONST_ME_ICETORNADO = 43,
71 CONST_ME_ICEATTACK = 44,
72 CONST_ME_STONES = 45,
73 CONST_ME_SMALLPLANTS = 46,
74 CONST_ME_CARNIPHILA = 47,
75 CONST_ME_PURPLEENERGY = 48,
76 CONST_ME_YELLOWENERGY = 49,
77 CONST_ME_HOLYAREA = 50,
78 CONST_ME_BIGPLANTS = 51,
79 CONST_ME_CAKE = 52,
80 CONST_ME_GIANTICE = 53,
81 CONST_ME_WATERSPLASH = 54,
82 CONST_ME_PLANTATTACK = 55,
83 CONST_ME_TUTORIALARROW = 56,
84 CONST_ME_TUTORIALSQUARE = 57,
85 CONST_ME_MIRRORHORIZONTAL = 58,
86 CONST_ME_MIRRORVERTICAL = 59,
87 CONST_ME_SKULLHORIZONTAL = 60,
88 CONST_ME_SKULLVERTICAL = 61,
89 CONST_ME_ASSASSIN = 62,
90 CONST_ME_STEPSHORIZONTAL = 63,
91 CONST_ME_BLOODYSTEPS = 64,
92 CONST_ME_STEPSVERTICAL = 65,
93 CONST_ME_YALAHARIGHOST = 66,
94 CONST_ME_BATS = 67,
95 CONST_ME_SMOKE = 68,
96 CONST_ME_INSECTS = 69,
97 CONST_ME_DRAGONHEAD = 70,
98 CONST_ME_ORCSHAMAN = 71,
99 CONST_ME_ORCSHAMAN_FIRE = 72,
100 CONST_ME_THUNDER = 73,
101 CONST_ME_FERUMBRAS = 74,
102 CONST_ME_CONFETTI_HORIZONTAL = 75,
103 CONST_ME_CONFETTI_VERTICAL = 76,
104 // 77-157 are empty
105 CONST_ME_BLACKSMOKE = 158,
106 // 159-166 are empty
107 CONST_ME_REDSMOKE = 167,
108 CONST_ME_YELLOWSMOKE = 168,
109 CONST_ME_GREENSMOKE = 169,
110 CONST_ME_PURPLESMOKE = 170,
111 CONST_ME_EARLY_THUNDER = 171,
112 CONST_ME_RAGIAZ_BONECAPSULE = 172,
113 CONST_ME_CRITICAL_DAMAGE = 173,
114 // 174 is empty
115 CONST_ME_PLUNGING_FISH = 175,
116};
117
118enum ShootType_t : uint8_t {
119 CONST_ANI_NONE,
120
121 CONST_ANI_SPEAR = 1,
122 CONST_ANI_BOLT = 2,
123 CONST_ANI_ARROW = 3,
124 CONST_ANI_FIRE = 4,
125 CONST_ANI_ENERGY = 5,
126 CONST_ANI_POISONARROW = 6,
127 CONST_ANI_BURSTARROW = 7,
128 CONST_ANI_THROWINGSTAR = 8,
129 CONST_ANI_THROWINGKNIFE = 9,
130 CONST_ANI_SMALLSTONE = 10,
131 CONST_ANI_DEATH = 11,
132 CONST_ANI_LARGEROCK = 12,
133 CONST_ANI_SNOWBALL = 13,
134 CONST_ANI_POWERBOLT = 14,
135 CONST_ANI_POISON = 15,
136 CONST_ANI_INFERNALBOLT = 16,
137 CONST_ANI_HUNTINGSPEAR = 17,
138 CONST_ANI_ENCHANTEDSPEAR = 18,
139 CONST_ANI_REDSTAR = 19,
140 CONST_ANI_GREENSTAR = 20,
141 CONST_ANI_ROYALSPEAR = 21,
142 CONST_ANI_SNIPERARROW = 22,
143 CONST_ANI_ONYXARROW = 23,
144 CONST_ANI_PIERCINGBOLT = 24,
145 CONST_ANI_WHIRLWINDSWORD = 25,
146 CONST_ANI_WHIRLWINDAXE = 26,
147 CONST_ANI_WHIRLWINDCLUB = 27,
148 CONST_ANI_ETHEREALSPEAR = 28,
149 CONST_ANI_ICE = 29,
150 CONST_ANI_EARTH = 30,
151 CONST_ANI_HOLY = 31,
152 CONST_ANI_SUDDENDEATH = 32,
153 CONST_ANI_FLASHARROW = 33,
154 CONST_ANI_FLAMMINGARROW = 34,
155 CONST_ANI_SHIVERARROW = 35,
156 CONST_ANI_ENERGYBALL = 36,
157 CONST_ANI_SMALLICE = 37,
158 CONST_ANI_SMALLHOLY = 38,
159 CONST_ANI_SMALLEARTH = 39,
160 CONST_ANI_EARTHARROW = 40,
161 CONST_ANI_EXPLOSION = 41,
162 CONST_ANI_CAKE = 42,
163
164 CONST_ANI_TARSALARROW = 44,
165 CONST_ANI_VORTEXBOLT = 45,
166
167 CONST_ANI_PRISMATICBOLT = 48,
168 CONST_ANI_CRYSTALLINEARROW = 49,
169 CONST_ANI_DRILLBOLT = 50,
170 CONST_ANI_ENVENOMEDARROW = 51,
171
172 CONST_ANI_GLOOTHSPEAR = 53,
173 CONST_ANI_SIMPLEARROW = 54,
174
175 // for internal use, don't send to client
176 CONST_ANI_WEAPONTYPE = 0xFE, // 254
177};
178
179enum SpeakClasses : uint8_t {
180 TALKTYPE_SAY = 1,
181 TALKTYPE_WHISPER = 2,
182 TALKTYPE_YELL = 3,
183 TALKTYPE_PRIVATE_FROM = 4,
184 TALKTYPE_PRIVATE_TO = 5,
185 TALKTYPE_CHANNEL_Y = 7,
186 TALKTYPE_CHANNEL_O = 8,
187 TALKTYPE_PRIVATE_NP = 10,
188 TALKTYPE_PRIVATE_PN = 12,
189 TALKTYPE_BROADCAST = 13,
190 TALKTYPE_CHANNEL_R1 = 14, // red - #c text
191 TALKTYPE_PRIVATE_RED_FROM = 15, //@name@text
192 TALKTYPE_PRIVATE_RED_TO = 16, //@name@text
193 TALKTYPE_MONSTER_SAY = 36,
194 TALKTYPE_MONSTER_YELL = 37,
195
196 TALKTYPE_CHANNEL_R2 = 0xFF, // #d
197};
198
199enum MessageClasses : uint8_t {
200 MESSAGE_STATUS_CONSOLE_BLUE = 4, /*FIXME Blue message in the console*/
201
202 MESSAGE_STATUS_CONSOLE_RED = 13, /*Red message in the console*/
203
204 MESSAGE_STATUS_DEFAULT =
205 17, /*White message at the bottom of the game window and in the console*/
206 MESSAGE_STATUS_WARNING = 18, /*Red message in game window and in the console*/
207 MESSAGE_EVENT_ADVANCE =
208 19, /*White message in game window and in the console*/
209
210 MESSAGE_STATUS_SMALL = 21, /*White message at the bottom of the game window"*/
211 MESSAGE_INFO_DESCR = 22, /*Green message in game window and in the console*/
212 MESSAGE_DAMAGE_DEALT = 23,
213 MESSAGE_DAMAGE_RECEIVED = 24,
214 MESSAGE_HEALED = 25,
215 MESSAGE_EXPERIENCE = 26,
216 MESSAGE_DAMAGE_OTHERS = 27,
217 MESSAGE_HEALED_OTHERS = 28,
218 MESSAGE_EXPERIENCE_OTHERS = 29,
219 MESSAGE_EVENT_DEFAULT =
220 30, /*White message at the bottom of the game window and in the console*/
221 MESSAGE_LOOT = 31,
222
223 MESSAGE_GUILD = 33, /*White message in channel (+ channelId)*/
224 MESSAGE_PARTY_MANAGEMENT = 34, /*White message in channel (+ channelId)*/
225 MESSAGE_PARTY = 35, /*White message in channel (+ channelId)*/
226 MESSAGE_EVENT_ORANGE = 36, /*Orange message in the console*/
227 MESSAGE_STATUS_CONSOLE_ORANGE = 37, /*Orange message in the console*/
228};
229
230enum FluidColors_t : uint8_t {
231 FLUID_EMPTY,
232 FLUID_BLUE,
233 FLUID_RED,
234 FLUID_BROWN,
235 FLUID_GREEN,
236 FLUID_YELLOW,
237 FLUID_WHITE,
238 FLUID_PURPLE,
239};
240
241enum FluidTypes_t : uint8_t {
242 FLUID_NONE = FLUID_EMPTY,
243 FLUID_WATER = FLUID_BLUE,
244 FLUID_BLOOD = FLUID_RED,
245 FLUID_BEER = FLUID_BROWN,
246 FLUID_SLIME = FLUID_GREEN,
247 FLUID_LEMONADE = FLUID_YELLOW,
248 FLUID_MILK = FLUID_WHITE,
249 FLUID_MANA = FLUID_PURPLE,
250
251 FLUID_LIFE = FLUID_RED + 8,
252 FLUID_OIL = FLUID_BROWN + 8,
253 FLUID_URINE = FLUID_YELLOW + 8,
254 FLUID_COCONUTMILK = FLUID_WHITE + 8,
255 FLUID_WINE = FLUID_PURPLE + 8,
256
257 FLUID_MUD = FLUID_BROWN + 16,
258 FLUID_FRUITJUICE = FLUID_YELLOW + 16,
259
260 FLUID_LAVA = FLUID_RED + 24,
261 FLUID_RUM = FLUID_BROWN + 24,
262 FLUID_SWAMP = FLUID_GREEN + 24,
263
264 FLUID_TEA = FLUID_BROWN + 32,
265
266 FLUID_MEAD = FLUID_BROWN + 40,
267};
268
269const uint8_t reverseFluidMap[] = {
270 FLUID_EMPTY, FLUID_WATER, FLUID_MANA, FLUID_BEER, FLUID_EMPTY,
271 FLUID_BLOOD, FLUID_SLIME, FLUID_EMPTY, FLUID_LEMONADE, FLUID_MILK,
272};
273
274const uint8_t clientToServerFluidMap[] = {
275 FLUID_EMPTY, FLUID_WATER, FLUID_MANA, FLUID_BEER,
276 FLUID_MUD, FLUID_BLOOD, FLUID_SLIME, FLUID_RUM,
277 FLUID_LEMONADE, FLUID_MILK, FLUID_WINE, FLUID_LIFE,
278 FLUID_URINE, FLUID_OIL, FLUID_FRUITJUICE, FLUID_COCONUTMILK,
279 FLUID_TEA, FLUID_MEAD,
280};
281
282enum ClientFluidTypes_t : uint8_t {
283 CLIENTFLUID_EMPTY = 0,
284 CLIENTFLUID_BLUE = 1,
285 CLIENTFLUID_PURPLE = 2,
286 CLIENTFLUID_BROWN_1 = 3,
287 CLIENTFLUID_BROWN_2 = 4,
288 CLIENTFLUID_RED = 5,
289 CLIENTFLUID_GREEN = 6,
290 CLIENTFLUID_BROWN = 7,
291 CLIENTFLUID_YELLOW = 8,
292 CLIENTFLUID_WHITE = 9,
293};
294
295const uint8_t fluidMap[] = {
296 CLIENTFLUID_EMPTY, CLIENTFLUID_BLUE, CLIENTFLUID_RED,
297 CLIENTFLUID_BROWN_1, CLIENTFLUID_GREEN, CLIENTFLUID_YELLOW,
298 CLIENTFLUID_WHITE, CLIENTFLUID_PURPLE,
299};
300
301enum SquareColor_t : uint8_t {
302 SQ_COLOR_BLACK = 0,
303};
304
305enum TextColor_t : uint8_t {
306 TEXTCOLOR_BLUE = 5,
307 TEXTCOLOR_LIGHTGREEN = 30,
308 TEXTCOLOR_LIGHTBLUE = 35,
309 TEXTCOLOR_MAYABLUE = 95,
310 TEXTCOLOR_DARKRED = 108,
311 TEXTCOLOR_LIGHTGREY = 129,
312 TEXTCOLOR_SKYBLUE = 143,
313 TEXTCOLOR_PURPLE = 154,
314 TEXTCOLOR_ELECTRICPURPLE = 155,
315 TEXTCOLOR_RED = 180,
316 TEXTCOLOR_PASTELRED = 194,
317 TEXTCOLOR_ORANGE = 198,
318 TEXTCOLOR_YELLOW = 210,
319 TEXTCOLOR_WHITE_EXP = 215,
320 TEXTCOLOR_NONE = 255,
321};
322
323enum Icons_t {
324 ICON_POISON = 1 << 0,
325 ICON_BURN = 1 << 1,
326 ICON_ENERGY = 1 << 2,
327 ICON_DRUNK = 1 << 3,
328 ICON_MANASHIELD = 1 << 4,
329 ICON_PARALYZE = 1 << 5,
330 ICON_HASTE = 1 << 6,
331 ICON_SWORDS = 1 << 7,
332 ICON_DROWNING = 1 << 8,
333 ICON_FREEZING = 1 << 9,
334 ICON_DAZZLED = 1 << 10,
335 ICON_CURSED = 1 << 11,
336 ICON_PARTY_BUFF = 1 << 12,
337 ICON_REDSWORDS = 1 << 13,
338 ICON_PIGEON = 1 << 14,
339 ICON_BLEEDING = 1 << 15,
340};
341
342enum WeaponType_t : uint8_t {
343 WEAPON_NONE,
344 WEAPON_SWORD,
345 WEAPON_CLUB,
346 WEAPON_AXE,
347 WEAPON_SHIELD,
348 WEAPON_DISTANCE,
349 WEAPON_WAND,
350 WEAPON_AMMO,
351};
352
353enum Ammo_t : uint8_t {
354 AMMO_NONE,
355 AMMO_BOLT,
356 AMMO_ARROW,
357 AMMO_SPEAR,
358 AMMO_THROWINGSTAR,
359 AMMO_THROWINGKNIFE,
360 AMMO_STONE,
361 AMMO_SNOWBALL,
362};
363
364enum WeaponAction_t : uint8_t {
365 WEAPONACTION_NONE,
366 WEAPONACTION_REMOVECOUNT,
367 WEAPONACTION_REMOVECHARGE,
368 WEAPONACTION_MOVE,
369};
370
371enum WieldInfo_t {
372 WIELDINFO_NONE = 0 << 0,
373 WIELDINFO_LEVEL = 1 << 0,
374 WIELDINFO_MAGLV = 1 << 1,
375 WIELDINFO_VOCREQ = 1 << 2,
376 WIELDINFO_PREMIUM = 1 << 3,
377};
378
379enum Skulls_t : uint8_t {
380 SKULL_NONE = 0,
381 SKULL_YELLOW = 1,
382 SKULL_GREEN = 2,
383 SKULL_WHITE = 3,
384 SKULL_RED = 4,
385 SKULL_BLACK = 5,
386 SKULL_ORANGE = 6,
387};
388
389enum PartyShields_t : uint8_t {
390 SHIELD_NONE = 0,
391 SHIELD_WHITEYELLOW = 1,
392 SHIELD_WHITEBLUE = 2,
393 SHIELD_BLUE = 3,
394 SHIELD_YELLOW = 4,
395 SHIELD_BLUE_SHAREDEXP = 5,
396 SHIELD_YELLOW_SHAREDEXP = 6,
397 SHIELD_BLUE_NOSHAREDEXP_BLINK = 7,
398 SHIELD_YELLOW_NOSHAREDEXP_BLINK = 8,
399 SHIELD_BLUE_NOSHAREDEXP = 9,
400 SHIELD_YELLOW_NOSHAREDEXP = 10,
401 SHIELD_GRAY = 11,
402};
403
404enum GuildEmblems_t : uint8_t {
405 GUILDEMBLEM_NONE = 0,
406 GUILDEMBLEM_ALLY = 1,
407 GUILDEMBLEM_ENEMY = 2,
408 GUILDEMBLEM_NEUTRAL = 3,
409 GUILDEMBLEM_MEMBER = 4,
410 GUILDEMBLEM_OTHER = 5,
411};
412
413enum item_t : uint16_t {
414 ITEM_BROWSEFIELD = 460, // for internal use
415
416 ITEM_FIREFIELD_PVP_FULL = 1487,
417 ITEM_FIREFIELD_PVP_MEDIUM = 1488,
418 ITEM_FIREFIELD_PVP_SMALL = 1489,
419 ITEM_FIREFIELD_PERSISTENT_FULL = 1492,
420 ITEM_FIREFIELD_PERSISTENT_MEDIUM = 1493,
421 ITEM_FIREFIELD_PERSISTENT_SMALL = 1494,
422 ITEM_FIREFIELD_NOPVP = 1500,
423
424 ITEM_POISONFIELD_PVP = 1490,
425 ITEM_POISONFIELD_PERSISTENT = 1496,
426 ITEM_POISONFIELD_NOPVP = 1503,
427
428 ITEM_ENERGYFIELD_PVP = 1491,
429 ITEM_ENERGYFIELD_PERSISTENT = 1495,
430 ITEM_ENERGYFIELD_NOPVP = 1504,
431
432 ITEM_MAGICWALL = 1497,
433 ITEM_MAGICWALL_PERSISTENT = 1498,
434 ITEM_MAGICWALL_SAFE = 11098,
435 ITEM_MAGICWALL_NOPVP = 20669,
436
437 ITEM_WILDGROWTH = 1499,
438 ITEM_WILDGROWTH_PERSISTENT = 2721,
439 ITEM_WILDGROWTH_SAFE = 11099,
440 ITEM_WILDGROWTH_NOPVP = 20670,
441
442 ITEM_BAG = 1987,
443 ITEM_SHOPPING_BAG = 23782,
444
445 ITEM_GOLD_COIN = 2148,
446 ITEM_PLATINUM_COIN = 2152,
447 ITEM_CRYSTAL_COIN = 2160,
448 ITEM_STORE_COIN = 24774, // in-game store currency
449
450 ITEM_DEPOT = 2594,
451 ITEM_LOCKER1 = 2589,
452 ITEM_INBOX = 14404,
453 ITEM_MARKET = 14405,
454 ITEM_STORE_INBOX = 26052,
455 ITEM_DEPOT_BOX_I = 25453,
456 ITEM_DEPOT_BOX_II = 25454,
457 ITEM_DEPOT_BOX_III = 25455,
458 ITEM_DEPOT_BOX_IV = 25456,
459 ITEM_DEPOT_BOX_V = 25457,
460 ITEM_DEPOT_BOX_VI = 25458,
461 ITEM_DEPOT_BOX_VII = 25459,
462 ITEM_DEPOT_BOX_VIII = 25460,
463 ITEM_DEPOT_BOX_IX = 25461,
464 ITEM_DEPOT_BOX_X = 25462,
465 ITEM_DEPOT_BOX_XI = 25463,
466 ITEM_DEPOT_BOX_XII = 25464,
467 ITEM_DEPOT_BOX_XIII = 25465,
468 ITEM_DEPOT_BOX_XIV = 25466,
469 ITEM_DEPOT_BOX_XV = 25467,
470 ITEM_DEPOT_BOX_XVI = 25468,
471 ITEM_DEPOT_BOX_XVII = 25469,
472
473 ITEM_MALE_CORPSE = 3058,
474 ITEM_FEMALE_CORPSE = 3065,
475
476 ITEM_FULLSPLASH = 2016,
477 ITEM_SMALLSPLASH = 2019,
478
479 ITEM_PARCEL = 2595,
480 ITEM_LETTER = 2597,
481 ITEM_LETTER_STAMPED = 2598,
482 ITEM_LABEL = 2599,
483
484 ITEM_AMULETOFLOSS = 2173,
485
486 ITEM_DOCUMENT_RO = 1968, // read-only
487};
488
489enum PlayerFlags : uint64_t {
490 PlayerFlag_CannotUseCombat = 1 << 0,
491 PlayerFlag_CannotAttackPlayer = 1 << 1,
492 PlayerFlag_CannotAttackMonster = 1 << 2,
493 PlayerFlag_CannotBeAttacked = 1 << 3,
494 PlayerFlag_CanConvinceAll = 1 << 4,
495 PlayerFlag_CanSummonAll = 1 << 5,
496 PlayerFlag_CanIllusionAll = 1 << 6,
497 PlayerFlag_CanSenseInvisibility = 1 << 7,
498 PlayerFlag_IgnoredByMonsters = 1 << 8,
499 PlayerFlag_NotGainInFight = 1 << 9,
500 PlayerFlag_HasInfiniteMana = 1 << 10,
501 PlayerFlag_HasInfiniteSoul = 1 << 11,
502 PlayerFlag_HasNoExhaustion = 1 << 12,
503 PlayerFlag_CannotUseSpells = 1 << 13,
504 PlayerFlag_CannotPickupItem = 1 << 14,
505 PlayerFlag_CanAlwaysLogin = 1 << 15,
506 PlayerFlag_CanBroadcast = 1 << 16,
507 PlayerFlag_CanEditHouses = 1 << 17,
508 PlayerFlag_CannotBeBanned = 1 << 18,
509 PlayerFlag_CannotBePushed = 1 << 19,
510 PlayerFlag_HasInfiniteCapacity = 1 << 20,
511 PlayerFlag_CanPushAllCreatures = 1 << 21,
512 PlayerFlag_CanTalkRedPrivate = 1 << 22,
513 PlayerFlag_CanTalkRedChannel = 1 << 23,
514 PlayerFlag_TalkOrangeHelpChannel = 1 << 24,
515 PlayerFlag_NotGainExperience = 1 << 25,
516 PlayerFlag_NotGainMana = 1 << 26,
517 PlayerFlag_NotGainHealth = 1 << 27,
518 PlayerFlag_NotGainSkill = 1 << 28,
519 PlayerFlag_SetMaxSpeed = 1 << 29,
520 PlayerFlag_SpecialVIP = 1 << 30,
521 PlayerFlag_NotGenerateLoot = static_cast<uint64_t>(1) << 31,
522 PlayerFlag_CanTalkRedChannelAnonymous = static_cast<uint64_t>(1) << 32,
523 PlayerFlag_IgnoreProtectionZone = static_cast<uint64_t>(1) << 33,
524 PlayerFlag_IgnoreSpellCheck = static_cast<uint64_t>(1) << 34,
525 PlayerFlag_IgnoreWeaponCheck = static_cast<uint64_t>(1) << 35,
526 PlayerFlag_CannotBeMuted = static_cast<uint64_t>(1) << 36,
527 PlayerFlag_IsAlwaysPremium = static_cast<uint64_t>(1) << 37,
528};
529
530enum ReloadTypes_t : uint8_t {
531 RELOAD_TYPE_ALL,
532 RELOAD_TYPE_ACTIONS,
533 RELOAD_TYPE_AURAS,
534 RELOAD_TYPE_EFFECTS,
535 RELOAD_TYPE_CHAT,
536 RELOAD_TYPE_CONFIG,
537 RELOAD_TYPE_CREATURESCRIPTS,
538 RELOAD_TYPE_EVENTS,
539 RELOAD_TYPE_GLOBAL,
540 RELOAD_TYPE_GLOBALEVENTS,
541 RELOAD_TYPE_ITEMS,
542 RELOAD_TYPE_MONSTERS,
543 RELOAD_TYPE_MOUNTS,
544 RELOAD_TYPE_MOVEMENTS,
545 RELOAD_TYPE_NPCS,
546 RELOAD_TYPE_QUESTS,
547 RELOAD_TYPE_RAIDS,
548 RELOAD_TYPE_SCRIPTS,
549 RELOAD_TYPE_SHADERS,
550 RELOAD_TYPE_SPELLS,
551 RELOAD_TYPE_TALKACTIONS,
552 RELOAD_TYPE_RUNEEFFECTS,
553 RELOAD_TYPE_OUTFITS,
554 RELOAD_TYPE_WEAPONS,
555 RELOAD_TYPE_WINGS,
556};
557
558// OTCv8 features (from src/client/const.h)
559enum GameFeature : uint8_t {
560 GameProtocolChecksum = 1,
561 GameAccountNames = 2,
562 GameChallengeOnLogin = 3,
563 GamePenalityOnDeath = 4,
564 GameNameOnNpcTrade = 5,
565 GameDoubleFreeCapacity = 6,
566 GameDoubleExperience = 7,
567 GameTotalCapacity = 8,
568 GameSkillsBase = 9,
569 GamePlayerRegenerationTime = 10,
570 GameChannelPlayerList = 11,
571 GamePlayerMounts = 12,
572 GameEnvironmentEffect = 13,
573 GameCreatureEmblems = 14,
574 GameItemAnimationPhase = 15,
575 GameMagicEffectU16 = 16,
576 GamePlayerMarket = 17,
577 GameSpritesU32 = 18,
578 GameTileAddThingWithStackpos = 19,
579 GameOfflineTrainingTime = 20,
580 GamePurseSlot = 21,
581 GameFormatCreatureName = 22,
582 GameSpellList = 23,
583 GameClientPing = 24,
584 GameExtendedClientPing = 25,
585 GameDoubleHealth = 28,
586 GameDoubleSkills = 29,
587 GameChangeMapAwareRange = 30,
588 GameMapMovePosition = 31,
589 GameAttackSeq = 32,
590 GameBlueNpcNameColor = 33,
591 GameDiagonalAnimatedText = 34,
592 GameLoginPending = 35,
593 GameNewSpeedLaw = 36,
594 GameForceFirstAutoWalkStep = 37,
595 GameMinimapRemove = 38,
596 GameDoubleShopSellAmount = 39,
597 GameContainerPagination = 40,
598 GameThingMarks = 41,
599 GameLooktypeU16 = 42,
600 GamePlayerStamina = 43,
601 GamePlayerAddons = 44,
602 GameMessageStatements = 45,
603 GameMessageLevel = 46,
604 GameNewFluids = 47,
605 GamePlayerStateU16 = 48,
606 GameNewOutfitProtocol = 49,
607 GamePVPMode = 50,
608 GameWritableDate = 51,
609 GameAdditionalVipInfo = 52,
610 GameBaseSkillU16 = 53,
611 GameCreatureIcons = 54,
612 GameHideNpcNames = 55,
613 GameSpritesAlphaChannel = 56,
614 GamePremiumExpiration = 57,
615 GameBrowseField = 58,
616 GameEnhancedAnimations = 59,
617 GameOGLInformation = 60,
618 GameMessageSizeCheck = 61,
619 GamePreviewState = 62,
620 GameLoginPacketEncryption = 63,
621 GameClientVersion = 64,
622 GameContentRevision = 65,
623 GameExperienceBonus = 66,
624 GameAuthenticator = 67,
625 GameUnjustifiedPoints = 68,
626 GameSessionKey = 69,
627 GameDeathType = 70,
628 GameIdleAnimations = 71,
629 GameKeepUnawareTiles = 72,
630 GameIngameStore = 73,
631 GameIngameStoreHighlights = 74,
632 GameIngameStoreServiceType = 75,
633 GameAdditionalSkills = 76,
634 GameDistanceEffectU16 = 77,
635 GamePrey = 78,
636 GameDoubleMagicLevel = 79,
637
638 GameExtendedOpcode = 80,
639 GameMinimapLimitedToSingleFloor = 81,
640 GameSendWorldName = 82,
641
642 GameDoubleLevel = 83,
643 GameDoubleSoul = 84,
644 GameDoublePlayerGoodsMoney = 85,
645 GameCreatureWalkthrough = 86,
646 GameDoubleTradeMoney = 87,
647 GameSequencedPackets = 88,
648 GameTibia12Protocol = 89,
649
650 // 90-99 otclientv8 features
651 GameNewWalking = 90,
652 GameSlowerManualWalking = 91,
653
654 GameItemTooltip = 93,
655
656 GameBot = 95,
657 GameBiggerMapCache = 96,
658 GameForceLight = 97,
659 GameNoDebug = 98,
660 GameBotProtection = 99,
661
662 // Custom features for customer
663 GameFasterAnimations = 101,
664 GameCenteredOutfits = 102,
665 GameSendIdentifiers = 103,
666 GameWingsAndAura = 104,
667 GamePlayerStateU32 = 105,
668 GameOutfitShaders = 106,
669
670 // advanced features
671 GamePacketSizeU32 = 110,
672 GamePacketCompression = 111,
673
674 LastGameFeature = 120
675};
676
677static constexpr int32_t CHANNEL_GUILD = 0x00;
678static constexpr int32_t CHANNEL_PARTY = 0x01;
679static constexpr int32_t CHANNEL_PRIVATE = 0xFFFF;
680
681// Reserved player storage key ranges;
682//[10000000 - 20000000];
683static constexpr int32_t PSTRG_RESERVED_RANGE_START = 10000000;
684static constexpr int32_t PSTRG_RESERVED_RANGE_SIZE = 10000000;
685//[1000 - 1500];
686static constexpr int32_t PSTRG_OUTFITS_RANGE_START =
687 (PSTRG_RESERVED_RANGE_START + 1000);
688static constexpr int32_t PSTRG_OUTFITS_RANGE_SIZE = 500;
689//[2001 - 2011];
690static constexpr int32_t PSTRG_MOUNTS_RANGE_START =
691 (PSTRG_RESERVED_RANGE_START + 2001);
692static constexpr int32_t PSTRG_MOUNTS_RANGE_SIZE = 10;
693static constexpr int32_t PSTRG_MOUNTS_CURRENTMOUNT =
694 (PSTRG_MOUNTS_RANGE_START + 10);
695//[2012 - 2022];
696static constexpr int32_t PSTRG_WINGS_RANGE_START =
697 (PSTRG_RESERVED_RANGE_START + 2012);
698static constexpr int32_t PSTRG_WINGS_RANGE_SIZE = 10;
699static constexpr int32_t PSTRG_WINGS_CURRENTWINGS =
700 (PSTRG_WINGS_RANGE_START + 10);
701//[2023 - 2033];
702static constexpr int32_t PSTRG_AURAS_RANGE_START =
703 (PSTRG_RESERVED_RANGE_START + 2023);
704static constexpr int32_t PSTRG_AURAS_RANGE_SIZE = 10;
705static constexpr int32_t PSTRG_AURAS_CURRENTAURA =
706 (PSTRG_AURAS_RANGE_START + 10);
707//[2034 - 2044];
708static constexpr int32_t PSTRG_SHADERS_RANGE_START =
709 (PSTRG_RESERVED_RANGE_START + 2034);
710static constexpr int32_t PSTRG_SHADERS_RANGE_SIZE = 10;
711static constexpr int32_t PSTRG_SHADERS_CURRENTSHADER =
712 (PSTRG_SHADERS_RANGE_START + 10);
713//[2045 - 2055];
714static constexpr int32_t PSTRG_EFFECTS_RANGE_START =
715 (PSTRG_RESERVED_RANGE_START + 2045);
716static constexpr int32_t PSTRG_EFFECTS_RANGE_SIZE = 10;
717static constexpr int32_t PSTRG_EFFECTS_CURRENTEFFECT =
718 (PSTRG_EFFECTS_RANGE_START + 10);
719
720#define IS_IN_KEYRANGE(key, range) \
721 (key >= PSTRG_##range##_START && \
722 ((key - PSTRG_##range##_START) <= PSTRG_##range##_SIZE))
723
724#endif
725