Guest User

Untitled

a guest
Apr 25th, 2020
22
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.72 KB | None | 0 0
  1. /**
  2. * The Forgotten Server - a free and open-source MMORPG server emulator
  3. * Copyright (C) 2016 Mark Samman <[email protected]>
  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.  
  23. #define NETWORKMESSAGE_MAXSIZE 24590
  24.  
  25. enum MagicEffectClasses : uint8_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. };
  99.  
  100. enum ShootType_t : uint8_t {
  101. CONST_ANI_NONE,
  102.  
  103. CONST_ANI_SPEAR = 1,
  104. CONST_ANI_BOLT = 2,
  105. CONST_ANI_ARROW = 3,
  106. CONST_ANI_FIRE = 4,
  107. CONST_ANI_ENERGY = 5,
  108. CONST_ANI_POISONARROW = 6,
  109. CONST_ANI_BURSTARROW = 7,
  110. CONST_ANI_THROWINGSTAR = 8,
  111. CONST_ANI_THROWINGKNIFE = 9,
  112. CONST_ANI_SMALLSTONE = 10,
  113. CONST_ANI_DEATH = 11,
  114. CONST_ANI_LARGEROCK = 12,
  115. CONST_ANI_SNOWBALL = 13,
  116. CONST_ANI_POWERBOLT = 14,
  117. CONST_ANI_POISON = 15,
  118. CONST_ANI_INFERNALBOLT = 16,
  119. CONST_ANI_HUNTINGSPEAR = 17,
  120. CONST_ANI_ENCHANTEDSPEAR = 18,
  121. CONST_ANI_REDSTAR = 19,
  122. CONST_ANI_GREENSTAR = 20,
  123. CONST_ANI_ROYALSPEAR = 21,
  124. CONST_ANI_SNIPERARROW = 22,
  125. CONST_ANI_ONYXARROW = 23,
  126. CONST_ANI_PIERCINGBOLT = 24,
  127. CONST_ANI_WHIRLWINDSWORD = 25,
  128. CONST_ANI_WHIRLWINDAXE = 26,
  129. CONST_ANI_WHIRLWINDCLUB = 27,
  130. CONST_ANI_ETHEREALSPEAR = 28,
  131. CONST_ANI_ICE = 29,
  132. CONST_ANI_EARTH = 30,
  133. CONST_ANI_HOLY = 31,
  134. CONST_ANI_SUDDENDEATH = 32,
  135. CONST_ANI_FLASHARROW = 33,
  136. CONST_ANI_FLAMMINGARROW = 34,
  137. CONST_ANI_SHIVERARROW = 35,
  138. CONST_ANI_ENERGYBALL = 36,
  139. CONST_ANI_SMALLICE = 37,
  140. CONST_ANI_SMALLHOLY = 38,
  141. CONST_ANI_SMALLEARTH = 39,
  142. CONST_ANI_EARTHARROW = 40,
  143. CONST_ANI_EXPLOSION = 41,
  144. CONST_ANI_CAKE = 42,
  145.  
  146. // for internal use, don't send to client
  147. CONST_ANI_WEAPONTYPE = 0xFE, // 254
  148. };
  149.  
  150. enum SpeakClasses : uint8_t {
  151. TALKTYPE_SAY = 1,
  152. TALKTYPE_WHISPER = 2,
  153. TALKTYPE_YELL = 3,
  154. TALKTYPE_PRIVATE_PN = 4,
  155. TALKTYPE_PRIVATE_NP = 5,
  156. TALKTYPE_PRIVATE = 6,
  157. TALKTYPE_CHANNEL_Y = 7,
  158. TALKTYPE_CHANNEL_W = 8,
  159. TALKTYPE_RVR_CHANNEL = 9,
  160. TALKTYPE_RVR_ANSWER = 10,
  161. TALKTYPE_RVR_CONTINUE = 11,
  162. TALKTYPE_BROADCAST = 12,
  163. TALKTYPE_CHANNEL_R1 = 13, //red - #c text
  164. TALKTYPE_PRIVATE_RED = 14, //@name@text
  165. TALKTYPE_CHANNEL_O = 15, //@name@text
  166. TALKTYPE_CHANNEL_R2 = 17, //#d
  167. TALKTYPE_MONSTER_SAY = 19,
  168. TALKTYPE_MONSTER_YELL = 20,
  169. };
  170.  
  171. enum MessageClasses : uint8_t {
  172. MESSAGE_STATUS_CONSOLE_RED = 18, /*Red message in the console*/
  173. MESSAGE_EVENT_ORANGE = 19, /*Orange message in the console*/
  174. MESSAGE_STATUS_CONSOLE_ORANGE = 20, /*Orange message in the console*/
  175. MESSAGE_STATUS_WARNING = 21, /*Red message in game window and in the console*/
  176. MESSAGE_EVENT_ADVANCE = 22, /*White message in game window and in the console*/
  177. MESSAGE_EVENT_DEFAULT = 23, /*White message at the bottom of the game window and in the console*/
  178. MESSAGE_STATUS_DEFAULT = 24, /*White message at the bottom of the game window and in the console*/
  179. MESSAGE_INFO_DESCR = 25, /*Green message in game window and in the console*/
  180. MESSAGE_STATUS_SMALL = 26, /*White message at the bottom of the game window"*/
  181. MESSAGE_STATUS_CONSOLE_BLUE = 27, /*FIXME Blue message in the console*/
  182. };
  183.  
  184. enum FluidColors_t : uint8_t {
  185. FLUID_EMPTY,
  186. FLUID_BLUE,
  187. FLUID_RED,
  188. FLUID_BROWN,
  189. FLUID_GREEN,
  190. FLUID_YELLOW,
  191. FLUID_WHITE,
  192. FLUID_PURPLE,
  193. };
  194.  
  195. enum FluidTypes_t : uint8_t {
  196. FLUID_NONE = FLUID_EMPTY,
  197. FLUID_WATER = FLUID_BLUE,
  198. FLUID_BLOOD = FLUID_RED,
  199. FLUID_BEER = FLUID_BROWN,
  200. FLUID_SLIME = FLUID_GREEN,
  201. FLUID_LEMONADE = FLUID_YELLOW,
  202. FLUID_MILK = FLUID_WHITE,
  203. FLUID_MANA = FLUID_PURPLE,
  204.  
  205. FLUID_LIFE = FLUID_RED + 8,
  206. FLUID_OIL = FLUID_BROWN + 8,
  207. FLUID_URINE = FLUID_YELLOW + 8,
  208. FLUID_COCONUTMILK = FLUID_WHITE + 8,
  209. FLUID_WINE = FLUID_PURPLE + 8,
  210.  
  211. FLUID_MUD = FLUID_BROWN + 16,
  212. FLUID_FRUITJUICE = FLUID_YELLOW + 16,
  213.  
  214. FLUID_LAVA = FLUID_RED + 24,
  215. FLUID_RUM = FLUID_BROWN + 24,
  216. FLUID_SWAMP = FLUID_GREEN + 24,
  217.  
  218. FLUID_TEA = FLUID_BROWN + 32,
  219.  
  220. FLUID_MEAD = FLUID_BROWN + 40,
  221. };
  222.  
  223. const uint8_t reverseFluidMap[] = {
  224. FLUID_EMPTY,
  225. FLUID_WATER,
  226. FLUID_MANA,
  227. FLUID_BEER,
  228. FLUID_EMPTY,
  229. FLUID_BLOOD,
  230. FLUID_SLIME,
  231. FLUID_EMPTY,
  232. FLUID_LEMONADE,
  233. FLUID_MILK,
  234. };
  235.  
  236. const uint8_t clientToServerFluidMap[] = {
  237. FLUID_EMPTY,
  238. FLUID_WATER,
  239. FLUID_MANA,
  240. FLUID_BEER,
  241. FLUID_MUD,
  242. FLUID_BLOOD,
  243. FLUID_SLIME,
  244. FLUID_RUM,
  245. FLUID_LEMONADE,
  246. FLUID_MILK,
  247. FLUID_WINE,
  248. FLUID_LIFE,
  249. FLUID_URINE,
  250. FLUID_OIL,
  251. FLUID_FRUITJUICE,
  252. FLUID_COCONUTMILK,
  253. FLUID_TEA,
  254. FLUID_MEAD,
  255. };
  256.  
  257. enum ClientFluidTypes_t : uint8_t {
  258. CLIENTFLUID_EMPTY = 0,
  259. CLIENTFLUID_BLUE = 1,
  260. CLIENTFLUID_PURPLE = 2,
  261. CLIENTFLUID_BROWN_1 = 3,
  262. CLIENTFLUID_BROWN_2 = 4,
  263. CLIENTFLUID_RED = 5,
  264. CLIENTFLUID_GREEN = 6,
  265. CLIENTFLUID_BROWN = 7,
  266. CLIENTFLUID_YELLOW = 8,
  267. CLIENTFLUID_WHITE = 9,
  268. };
  269.  
  270. const uint8_t fluidMap[] = {
  271. CLIENTFLUID_EMPTY,
  272. CLIENTFLUID_BLUE,
  273. CLIENTFLUID_RED,
  274. CLIENTFLUID_BROWN_1,
  275. CLIENTFLUID_GREEN,
  276. CLIENTFLUID_YELLOW,
  277. CLIENTFLUID_WHITE,
  278. CLIENTFLUID_PURPLE,
  279. };
  280.  
  281. enum SquareColor_t : uint8_t {
  282. SQ_COLOR_BLACK = 0,
  283. };
  284.  
  285. enum TextColor_t : uint8_t {
  286. TEXTCOLOR_BLUE = 5,
  287. TEXTCOLOR_LIGHTGREEN = 30,
  288. TEXTCOLOR_LIGHTBLUE = 35,
  289. TEXTCOLOR_MAYABLUE = 95,
  290. TEXTCOLOR_DARKRED = 108,
  291. TEXTCOLOR_LIGHTGREY = 129,
  292. TEXTCOLOR_SKYBLUE = 143,
  293. TEXTCOLOR_PURPLE = 155,
  294. TEXTCOLOR_RED = 180,
  295. TEXTCOLOR_ORANGE = 198,
  296. TEXTCOLOR_YELLOW = 210,
  297. TEXTCOLOR_WHITE_EXP = 215,
  298. TEXTCOLOR_NONE = 255,
  299. };
  300.  
  301. enum Icons_t {
  302. ICON_POISON = 1 << 0,
  303. ICON_BURN = 1 << 1,
  304. ICON_ENERGY = 1 << 2,
  305. ICON_DRUNK = 1 << 3,
  306. ICON_MANASHIELD = 1 << 4,
  307. ICON_PARALYZE = 1 << 5,
  308. ICON_HASTE = 1 << 6,
  309. ICON_SWORDS = 1 << 7,
  310. ICON_DROWNING = 1 << 8,
  311. ICON_FREEZING = 1 << 9,
  312. ICON_DAZZLED = 1 << 10,
  313. ICON_CURSED = 1 << 11,
  314. ICON_PARTY_BUFF = 1 << 12,
  315. ICON_REDSWORDS = 1 << 13,
  316. ICON_PIGEON = 1 << 14,
  317. };
  318.  
  319. enum WeaponType_t : uint8_t {
  320. WEAPON_NONE,
  321. WEAPON_SWORD,
  322. WEAPON_CLUB,
  323. WEAPON_AXE,
  324. WEAPON_SHIELD,
  325. WEAPON_DISTANCE,
  326. WEAPON_WAND,
  327. WEAPON_AMMO,
  328. };
  329.  
  330. enum Ammo_t : uint8_t {
  331. AMMO_NONE,
  332. AMMO_BOLT,
  333. AMMO_ARROW,
  334. AMMO_SPEAR,
  335. AMMO_THROWINGSTAR,
  336. AMMO_THROWINGKNIFE,
  337. AMMO_STONE,
  338. AMMO_SNOWBALL,
  339. };
  340.  
  341. enum WeaponAction_t : uint8_t {
  342. WEAPONACTION_NONE,
  343. WEAPONACTION_REMOVECOUNT,
  344. WEAPONACTION_REMOVECHARGE,
  345. WEAPONACTION_MOVE,
  346. };
  347.  
  348. enum WieldInfo_t {
  349. WIELDINFO_LEVEL = 1 << 0,
  350. WIELDINFO_MAGLV = 1 << 1,
  351. WIELDINFO_VOCREQ = 1 << 2,
  352. WIELDINFO_PREMIUM = 1 << 3,
  353. };
  354.  
  355. enum Skulls_t : uint8_t {
  356. SKULL_NONE = 0,
  357. SKULL_YELLOW = 1,
  358. SKULL_GREEN = 2,
  359. SKULL_WHITE = 3,
  360. SKULL_RED = 4,
  361. SKULL_BLACK = 5,
  362. };
  363.  
  364. enum PartyShields_t : uint8_t {
  365. SHIELD_NONE = 0,
  366. SHIELD_WHITEYELLOW = 1,
  367. SHIELD_WHITEBLUE = 2,
  368. SHIELD_BLUE = 3,
  369. SHIELD_YELLOW = 4,
  370. SHIELD_BLUE_SHAREDEXP = 5,
  371. SHIELD_YELLOW_SHAREDEXP = 6,
  372. SHIELD_BLUE_NOSHAREDEXP_BLINK = 7,
  373. SHIELD_YELLOW_NOSHAREDEXP_BLINK = 8,
  374. SHIELD_BLUE_NOSHAREDEXP = 9,
  375. SHIELD_YELLOW_NOSHAREDEXP = 10,
  376. };
  377.  
  378. enum GuildEmblems_t : uint8_t {
  379. GUILDEMBLEM_NONE = 0,
  380. GUILDEMBLEM_ALLY = 1,
  381. GUILDEMBLEM_ENEMY = 2,
  382. GUILDEMBLEM_NEUTRAL = 3
  383. };
  384.  
  385. enum item_t : uint16_t {
  386. ITEM_FIREFIELD_PVP_FULL = 1487,
  387. ITEM_FIREFIELD_PVP_MEDIUM = 1488,
  388. ITEM_FIREFIELD_PVP_SMALL = 1489,
  389. ITEM_FIREFIELD_PERSISTENT_FULL = 1492,
  390. ITEM_FIREFIELD_PERSISTENT_MEDIUM = 1493,
  391. ITEM_FIREFIELD_PERSISTENT_SMALL = 1494,
  392. ITEM_FIREFIELD_NOPVP = 1500,
  393.  
  394. ITEM_POISONFIELD_PVP = 1490,
  395. ITEM_POISONFIELD_PERSISTENT = 1496,
  396. ITEM_POISONFIELD_NOPVP = 1503,
  397.  
  398. ITEM_ENERGYFIELD_PVP = 1491,
  399. ITEM_ENERGYFIELD_PERSISTENT = 1495,
  400. ITEM_ENERGYFIELD_NOPVP = 1504,
  401.  
  402. ITEM_MAGICWALL = 1497,
  403. ITEM_MAGICWALL_PERSISTENT = 1498,
  404. ITEM_MAGICWALL_SAFE = 11098,
  405.  
  406. ITEM_WILDGROWTH = 1499,
  407. ITEM_WILDGROWTH_PERSISTENT = 2721,
  408. ITEM_WILDGROWTH_SAFE = 11099,
  409.  
  410. ITEM_BAG = 1987,
  411.  
  412. ITEM_GOLD_COIN = 2148,
  413. ITEM_PLATINUM_COIN = 2152,
  414. ITEM_CRYSTAL_COIN = 2160,
  415.  
  416. ITEM_DEPOT = 2594,
  417. ITEM_LOCKER = 2589,
  418.  
  419. ITEM_MALE_CORPSE = 3058,
  420. ITEM_FEMALE_CORPSE = 3065,
  421.  
  422. ITEM_FULLSPLASH = 2016,
  423. ITEM_SMALLSPLASH = 2019,
  424.  
  425. ITEM_PARCEL = 2595,
  426. ITEM_LETTER = 2597,
  427. ITEM_LETTER_STAMPED = 2598,
  428. ITEM_LABEL = 2599,
  429.  
  430. ITEM_AMULETOFLOSS = 2173,
  431.  
  432. ITEM_DOCUMENT_RO = 1968, //read-only
  433. };
  434.  
  435. enum PlayerFlags : uint64_t {
  436. PlayerFlag_CannotUseCombat = 1 << 0,
  437. PlayerFlag_CannotAttackPlayer = 1 << 1,
  438. PlayerFlag_CannotAttackMonster = 1 << 2,
  439. PlayerFlag_CannotBeAttacked = 1 << 3,
  440. PlayerFlag_CanConvinceAll = 1 << 4,
  441. PlayerFlag_CanSummonAll = 1 << 5,
  442. PlayerFlag_CanIllusionAll = 1 << 6,
  443. PlayerFlag_CanSenseInvisibility = 1 << 7,
  444. PlayerFlag_IgnoredByMonsters = 1 << 8,
  445. PlayerFlag_NotGainInFight = 1 << 9,
  446. PlayerFlag_HasInfiniteMana = 1 << 10,
  447. PlayerFlag_HasInfiniteSoul = 1 << 11,
  448. PlayerFlag_HasNoExhaustion = 1 << 12,
  449. PlayerFlag_CannotUseSpells = 1 << 13,
  450. PlayerFlag_CannotPickupItem = 1 << 14,
  451. PlayerFlag_CanAlwaysLogin = 1 << 15,
  452. PlayerFlag_CanBroadcast = 1 << 16,
  453. PlayerFlag_CanEditHouses = 1 << 17,
  454. PlayerFlag_CannotBeBanned = 1 << 18,
  455. PlayerFlag_CannotBePushed = 1 << 19,
  456. PlayerFlag_HasInfiniteCapacity = 1 << 20,
  457. PlayerFlag_CanPushAllCreatures = 1 << 21,
  458. PlayerFlag_CanTalkRedPrivate = 1 << 22,
  459. PlayerFlag_CanTalkRedChannel = 1 << 23,
  460. PlayerFlag_TalkOrangeHelpChannel = 1 << 24,
  461. PlayerFlag_NotGainExperience = 1 << 25,
  462. PlayerFlag_NotGainMana = 1 << 26,
  463. PlayerFlag_NotGainHealth = 1 << 27,
  464. PlayerFlag_NotGainSkill = 1 << 28,
  465. PlayerFlag_SetMaxSpeed = 1 << 29,
  466. PlayerFlag_SpecialVIP = 1 << 30,
  467. PlayerFlag_NotGenerateLoot = static_cast<uint64_t>(1) << 31,
  468. PlayerFlag_CanTalkRedChannelAnonymous = static_cast<uint64_t>(1) << 32,
  469. PlayerFlag_IgnoreProtectionZone = static_cast<uint64_t>(1) << 33,
  470. PlayerFlag_IgnoreSpellCheck = static_cast<uint64_t>(1) << 34,
  471. PlayerFlag_IgnoreWeaponCheck = static_cast<uint64_t>(1) << 35,
  472. PlayerFlag_CannotBeMuted = static_cast<uint64_t>(1) << 36,
  473. PlayerFlag_IsAlwaysPremium = static_cast<uint64_t>(1) << 37,
  474. };
  475.  
  476. #define CHANNEL_GUILD 0x00
  477. #define CHANNEL_PARTY 0x01
  478. #define CHANNEL_PRIVATE 0xFFFF
  479.  
  480. //Reserved player storage key ranges
  481. //[10000000 - 20000000]
  482. #define PSTRG_RESERVED_RANGE_START 10000000
  483. #define PSTRG_RESERVED_RANGE_SIZE 10000000
  484. //[1000 - 1500]
  485. #define PSTRG_OUTFITS_RANGE_START (PSTRG_RESERVED_RANGE_START + 1000)
  486. #define PSTRG_OUTFITS_RANGE_SIZE 500
  487.  
  488. #define IS_IN_KEYRANGE(key, range) (key >= PSTRG_##range##_START && ((key - PSTRG_##range##_START) <= PSTRG_##range##_SIZE))
  489.  
  490. #endif
Advertisement
Add Comment
Please, Sign In to add comment