From e691d0504aa66d6cbf5c6617505c8ae20749db8b Mon Sep 17 00:00:00 2001 From: Mordred Admin Date: Tue, 8 Aug 2017 13:53:47 +0200 Subject: [PATCH] Initial commit of the sapphire server --- CMakeLists.txt | 22 + CMakeSettings.json | 37 + LICENSE.md | 662 +++++++ README.md | 43 + bin/config/settings_lobby.xml | 27 + bin/config/settings_rest.xml | 26 + bin/config/settings_zone.xml | 22 + bin/libmysql.dll | Bin 0 -> 2359296 bytes .../chai/CmnDefCutSceneReplay.chai_outdated | 61 + bin/scripts/chai/aetheryte/Aethernet.chai | 57 + bin/scripts/chai/aetheryte/Aetheryte.chai | 71 + bin/scripts/chai/global.inc | 226 +++ bin/scripts/chai/opening/OpeningGridania.chai | 97 + bin/scripts/chai/opening/OpeningLimsa.chai | 108 ++ bin/scripts/chai/opening/OpeningUldah.chai | 98 + bin/scripts/chai/player_events.chai | 11 + bin/scripts/chai/quest/ManFst001.chai | 124 ++ bin/scripts/chai/quest/ManFst002.chai | 261 +++ bin/scripts/chai/quest/ManFst003.chai | 259 +++ .../chai/quest/ManFst003.chai_generated | 246 +++ bin/scripts/chai/quest/ManFst004.chai | 258 +++ bin/scripts/chai/quest/ManSea001.chai | 201 ++ bin/scripts/chai/quest/ManWil001.chai | 167 ++ .../chai/quest/ManWil001.chai_generated | 214 ++ bin/scripts/chai/quest/SubFst000.chai | 176 ++ bin/scripts/chai/quest/SubFst001.chai | 125 ++ bin/scripts/chai/quest/SubFst002.chai | 107 + bin/scripts/chai/quest/SubFst003.chai | 114 ++ bin/scripts/chai/quest/SubFst004.chai | 150 ++ bin/scripts/chai/quest/SubFst007.chai | 133 ++ bin/scripts/chai/quest/SubFst010.chai | 82 + bin/scripts/chai/quest/SubFst011.chai | 100 + bin/scripts/chai/quest/SubFst013.chai | 235 +++ bin/scripts/chai/quest/SubFst015.chai | 261 +++ bin/scripts/chai/quest/SubFst019.chai | 89 + bin/web/createUser.html | 73 + bin/web/css/global.css | 158 ++ bin/web/css/reset.css | 48 + bin/web/headlines.xml | 1722 +++++++++++++++++ bin/web/icon-01.png | Bin 0 -> 16051 bytes bin/web/index.html | 30 + bin/web/login.html | 75 + bin/web/news.xml | 162 ++ bin/web/sapphire_logo.png | Bin 0 -> 352784 bytes bin/zlib1.dll | Bin 0 -> 65024 bytes sql/accounts.sql | 54 + sql/battlenpc.sql | 1318 +++++++++++++ sql/charabase.sql | 101 + sql/characlass.sql | 100 + sql/charadetail.sql | 115 ++ sql/charaglobalitem.sql | 77 + sql/charainfoblacklist.sql | 53 + sql/charainfofriendlist.sql | 54 + sql/charainfolinkshell.sql | 53 + sql/charainfosearch.sql | 54 + sql/charaitemcrystal.sql | 74 + sql/charaitemcurrency.sql | 68 + sql/charaitemgearset.sql | 70 + sql/charaiteminventory.sql | 81 + sql/charaquest.sql | 309 +++ sql/discoveryinfo.sql | 148 ++ sql/export.sh | 16 + sql/import.sh | 29 + sql/infolinkshell.sql | 57 + sql/uniqueiddata.sql | 505 +++++ sql/update.sql | 27 + sql/zonemapping.sql | 525 +++++ sql/zonepositions.sql | 165 ++ sql/zoneservers.sql | 51 + src/servers/CMakeLists.txt | 16 + src/servers/Server_Common/Acceptor.cpp | 130 ++ src/servers/Server_Common/Acceptor.h | 78 + src/servers/Server_Common/CMakeLists.txt | 76 + .../Server_Common/ChaiscriptStdLib.cpp | 16 + src/servers/Server_Common/ChaiscriptStdLib.h | 19 + src/servers/Server_Common/Common.h | 958 +++++++++ src/servers/Server_Common/CommonNetwork.h | 318 +++ src/servers/Server_Common/Connection.cpp | 210 ++ src/servers/Server_Common/Connection.h | 144 ++ src/servers/Server_Common/Database.cpp | 411 ++++ src/servers/Server_Common/Database.h | 242 +++ src/servers/Server_Common/ExdData.cpp | 672 +++++++ src/servers/Server_Common/ExdData.h | 329 ++++ src/servers/Server_Common/Forwards.h | 38 + src/servers/Server_Common/GamePacket.cpp | 111 ++ src/servers/Server_Common/GamePacket.h | 92 + src/servers/Server_Common/GamePacketNew.h | 234 +++ src/servers/Server_Common/Hive.cpp | 61 + src/servers/Server_Common/Hive.h | 54 + src/servers/Server_Common/LockedQueue.h | 124 ++ src/servers/Server_Common/Logger.cpp | 88 + src/servers/Server_Common/Logger.h | 51 + src/servers/Server_Common/PacketContainer.cpp | 79 + src/servers/Server_Common/PacketContainer.h | 38 + src/servers/Server_Common/ServerPacketDef.h | 1365 +++++++++++++ src/servers/Server_Common/Util.cpp | 42 + src/servers/Server_Common/Util.h | 20 + src/servers/Server_Common/UtilMath.cpp | 71 + src/servers/Server_Common/UtilMath.h | 38 + src/servers/Server_Common/UtilNetwork.cpp | 35 + src/servers/Server_Common/UtilNetwork.h | 18 + src/servers/Server_Common/XMLConfig.cpp | 35 + src/servers/Server_Common/XMLConfig.h | 73 + src/servers/Server_Common/base64.cpp | 123 ++ src/servers/Server_Common/base64.h | 11 + src/servers/Server_Common/md5.cpp | 256 +++ src/servers/Server_Common/md5.h | 51 + src/servers/Server_Lobby/CMakeLists.txt | 87 + src/servers/Server_Lobby/Forwards.h | 33 + src/servers/Server_Lobby/GameConnection.cpp | 511 +++++ src/servers/Server_Lobby/GameConnection.h | 87 + .../Server_Lobby/LobbyPacketContainer.cpp | 59 + .../Server_Lobby/LobbyPacketContainer.h | 45 + src/servers/Server_Lobby/LobbySession.cpp | 15 + src/servers/Server_Lobby/LobbySession.h | 62 + src/servers/Server_Lobby/RestConnector.cpp | 343 ++++ src/servers/Server_Lobby/RestConnector.h | 44 + src/servers/Server_Lobby/ServerLobby.cpp | 137 ++ src/servers/Server_Lobby/ServerLobby.h | 55 + src/servers/Server_Lobby/blowfish.cpp | 258 +++ src/servers/Server_Lobby/blowfish.h | 72 + src/servers/Server_Lobby/blowfish.h2 | 267 +++ src/servers/Server_Lobby/client_http.hpp | 418 ++++ src/servers/Server_Lobby/mainLobbyServer.cpp | 12 + src/servers/Server_REST/CMakeLists.txt | 86 + src/servers/Server_REST/Forwards.h | 102 + src/servers/Server_REST/LoginSession.cpp | 12 + src/servers/Server_REST/LoginSession.h | 59 + src/servers/Server_REST/PlayerMinimal.cpp | 423 ++++ src/servers/Server_REST/PlayerMinimal.h | 171 ++ src/servers/Server_REST/SapphireAPI.cpp | 294 +++ src/servers/Server_REST/SapphireAPI.h | 52 + src/servers/Server_REST/Session.cpp | 37 + src/servers/Server_REST/Session.h | 40 + src/servers/Server_REST/client_http.hpp | 403 ++++ src/servers/Server_REST/main.cpp | 603 ++++++ src/servers/Server_REST/server_http.hpp | 462 +++++ src/servers/Server_Zone/Action.cpp | 85 + src/servers/Server_Zone/Action.h | 60 + src/servers/Server_Zone/ActionCast.cpp | 107 + src/servers/Server_Zone/ActionCast.h | 28 + src/servers/Server_Zone/ActionTeleport.cpp | 114 ++ src/servers/Server_Zone/ActionTeleport.h | 30 + src/servers/Server_Zone/Actor.cpp | 600 ++++++ src/servers/Server_Zone/Actor.h | 303 +++ .../Server_Zone/ActorControlPacket142.h | 49 + .../Server_Zone/ActorControlPacket143.h | 52 + .../Server_Zone/ActorControlPacket144.h | 50 + src/servers/Server_Zone/ActorSpawnPacket.h | 91 + src/servers/Server_Zone/BattleNpc.cpp | 574 ++++++ src/servers/Server_Zone/BattleNpc.h | 113 ++ src/servers/Server_Zone/BattleNpcTemplate.cpp | 37 + src/servers/Server_Zone/BattleNpcTemplate.h | 38 + src/servers/Server_Zone/CMakeLists.txt | 87 + src/servers/Server_Zone/Cell.cpp | 171 ++ src/servers/Server_Zone/Cell.h | 128 ++ src/servers/Server_Zone/CellHandler.h | 178 ++ src/servers/Server_Zone/CharaPc.cpp | 561 ++++++ src/servers/Server_Zone/CharaPc.h | 299 +++ src/servers/Server_Zone/ChatPacket.h | 41 + src/servers/Server_Zone/Event.cpp | 73 + src/servers/Server_Zone/Event.h | 78 + src/servers/Server_Zone/EventAction.cpp | 141 ++ src/servers/Server_Zone/EventAction.h | 37 + src/servers/Server_Zone/EventFinishPacket.h | 44 + src/servers/Server_Zone/EventHelper.cpp | 77 + src/servers/Server_Zone/EventHelper.h | 16 + src/servers/Server_Zone/EventItemAction.cpp | 122 ++ src/servers/Server_Zone/EventItemAction.h | 35 + src/servers/Server_Zone/EventPlayPacket.h | 55 + src/servers/Server_Zone/EventStartPacket.h | 50 + src/servers/Server_Zone/Forwards.h | 75 + src/servers/Server_Zone/GameCommand.h | 67 + .../Server_Zone/GameCommandHandler.cpp | 511 +++++ src/servers/Server_Zone/GameCommandHandler.h | 45 + src/servers/Server_Zone/GameConnection.cpp | 401 ++++ src/servers/Server_Zone/GameConnection.h | 113 ++ src/servers/Server_Zone/Globals.h | 18 + src/servers/Server_Zone/InitUIPacket.h | 87 + src/servers/Server_Zone/Inventory.cpp | 883 +++++++++ src/servers/Server_Zone/Inventory.h | 196 ++ src/servers/Server_Zone/Item.cpp | 105 + src/servers/Server_Zone/Item.h | 66 + src/servers/Server_Zone/ItemContainer.cpp | 99 + src/servers/Server_Zone/ItemContainer.h | 48 + src/servers/Server_Zone/ModelEquipPacket.h | 44 + src/servers/Server_Zone/MoveActorPacket.h | 51 + src/servers/Server_Zone/PacketHandlers.cpp | 1134 +++++++++++ src/servers/Server_Zone/PacketHandlers2.cpp | 227 +++ src/servers/Server_Zone/PingPacket.h | 38 + src/servers/Server_Zone/Player.cpp | 1436 ++++++++++++++ src/servers/Server_Zone/Player.h | 591 ++++++ src/servers/Server_Zone/PlayerEvent.cpp | 312 +++ src/servers/Server_Zone/PlayerInventory.cpp | 217 +++ src/servers/Server_Zone/PlayerQuest.cpp | 1185 ++++++++++++ src/servers/Server_Zone/PlayerSpawnPacket.h | 101 + src/servers/Server_Zone/PlayerSql.cpp | 437 +++++ .../Server_Zone/PlayerStateFlagsPacket.h | 58 + src/servers/Server_Zone/QuestMessagePacket.h | 42 + src/servers/Server_Zone/ScriptManager.cpp | 396 ++++ src/servers/Server_Zone/ScriptManager.h | 65 + src/servers/Server_Zone/ScriptManagerInit.cpp | 199 ++ src/servers/Server_Zone/ServerNoticePacket.h | 38 + src/servers/Server_Zone/ServerZone.cpp | 367 ++++ src/servers/Server_Zone/ServerZone.h | 69 + src/servers/Server_Zone/Session.cpp | 93 + src/servers/Server_Zone/Session.h | 51 + src/servers/Server_Zone/StatusEffect.cpp | 129 ++ src/servers/Server_Zone/StatusEffect.h | 51 + .../Server_Zone/StatusEffectContainer.cpp | 151 ++ .../Server_Zone/StatusEffectContainer.h | 44 + src/servers/Server_Zone/UpdateHpMpTpPacket.h | 39 + src/servers/Server_Zone/Zone.cpp | 800 ++++++++ src/servers/Server_Zone/Zone.h | 117 ++ src/servers/Server_Zone/ZoneMgr.cpp | 146 ++ src/servers/Server_Zone/ZoneMgr.h | 39 + src/servers/Server_Zone/ZonePosition.cpp | 43 + src/servers/Server_Zone/ZonePosition.h | 33 + src/servers/Server_Zone/mainGameServer.cpp | 24 + src/tools/Script/ce_dump_vfs_path_357.lua | 231 +++ src/tools/Script/ce_dump_vfs_path_sbbench.lua | 141 ++ src/tools/pcb_reader/CMakeLists.txt | 23 + src/tools/pcb_reader/main.cpp | 258 +++ src/tools/pcb_reader/pcb.h | 69 + src/tools/quest_parser/CMakeLists.txt | 91 + src/tools/quest_parser/main.cpp | 337 ++++ src/tools/quest_parser/unluac_2015_06_13.jar | Bin 0 -> 325159 bytes 227 files changed, 40373 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 CMakeSettings.json create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 bin/config/settings_lobby.xml create mode 100644 bin/config/settings_rest.xml create mode 100644 bin/config/settings_zone.xml create mode 100644 bin/libmysql.dll create mode 100644 bin/scripts/chai/CmnDefCutSceneReplay.chai_outdated create mode 100644 bin/scripts/chai/aetheryte/Aethernet.chai create mode 100644 bin/scripts/chai/aetheryte/Aetheryte.chai create mode 100644 bin/scripts/chai/global.inc create mode 100644 bin/scripts/chai/opening/OpeningGridania.chai create mode 100644 bin/scripts/chai/opening/OpeningLimsa.chai create mode 100644 bin/scripts/chai/opening/OpeningUldah.chai create mode 100644 bin/scripts/chai/player_events.chai create mode 100644 bin/scripts/chai/quest/ManFst001.chai create mode 100644 bin/scripts/chai/quest/ManFst002.chai create mode 100644 bin/scripts/chai/quest/ManFst003.chai create mode 100644 bin/scripts/chai/quest/ManFst003.chai_generated create mode 100644 bin/scripts/chai/quest/ManFst004.chai create mode 100644 bin/scripts/chai/quest/ManSea001.chai create mode 100644 bin/scripts/chai/quest/ManWil001.chai create mode 100644 bin/scripts/chai/quest/ManWil001.chai_generated create mode 100644 bin/scripts/chai/quest/SubFst000.chai create mode 100644 bin/scripts/chai/quest/SubFst001.chai create mode 100644 bin/scripts/chai/quest/SubFst002.chai create mode 100644 bin/scripts/chai/quest/SubFst003.chai create mode 100644 bin/scripts/chai/quest/SubFst004.chai create mode 100644 bin/scripts/chai/quest/SubFst007.chai create mode 100644 bin/scripts/chai/quest/SubFst010.chai create mode 100644 bin/scripts/chai/quest/SubFst011.chai create mode 100644 bin/scripts/chai/quest/SubFst013.chai create mode 100644 bin/scripts/chai/quest/SubFst015.chai create mode 100644 bin/scripts/chai/quest/SubFst019.chai create mode 100644 bin/web/createUser.html create mode 100644 bin/web/css/global.css create mode 100644 bin/web/css/reset.css create mode 100644 bin/web/headlines.xml create mode 100644 bin/web/icon-01.png create mode 100644 bin/web/index.html create mode 100644 bin/web/login.html create mode 100644 bin/web/news.xml create mode 100644 bin/web/sapphire_logo.png create mode 100644 bin/zlib1.dll create mode 100644 sql/accounts.sql create mode 100644 sql/battlenpc.sql create mode 100644 sql/charabase.sql create mode 100644 sql/characlass.sql create mode 100644 sql/charadetail.sql create mode 100644 sql/charaglobalitem.sql create mode 100644 sql/charainfoblacklist.sql create mode 100644 sql/charainfofriendlist.sql create mode 100644 sql/charainfolinkshell.sql create mode 100644 sql/charainfosearch.sql create mode 100644 sql/charaitemcrystal.sql create mode 100644 sql/charaitemcurrency.sql create mode 100644 sql/charaitemgearset.sql create mode 100644 sql/charaiteminventory.sql create mode 100644 sql/charaquest.sql create mode 100644 sql/discoveryinfo.sql create mode 100644 sql/export.sh create mode 100644 sql/import.sh create mode 100644 sql/infolinkshell.sql create mode 100644 sql/uniqueiddata.sql create mode 100644 sql/update.sql create mode 100644 sql/zonemapping.sql create mode 100644 sql/zonepositions.sql create mode 100644 sql/zoneservers.sql create mode 100644 src/servers/CMakeLists.txt create mode 100644 src/servers/Server_Common/Acceptor.cpp create mode 100644 src/servers/Server_Common/Acceptor.h create mode 100644 src/servers/Server_Common/CMakeLists.txt create mode 100644 src/servers/Server_Common/ChaiscriptStdLib.cpp create mode 100644 src/servers/Server_Common/ChaiscriptStdLib.h create mode 100644 src/servers/Server_Common/Common.h create mode 100644 src/servers/Server_Common/CommonNetwork.h create mode 100644 src/servers/Server_Common/Connection.cpp create mode 100644 src/servers/Server_Common/Connection.h create mode 100644 src/servers/Server_Common/Database.cpp create mode 100644 src/servers/Server_Common/Database.h create mode 100644 src/servers/Server_Common/ExdData.cpp create mode 100644 src/servers/Server_Common/ExdData.h create mode 100644 src/servers/Server_Common/Forwards.h create mode 100644 src/servers/Server_Common/GamePacket.cpp create mode 100644 src/servers/Server_Common/GamePacket.h create mode 100644 src/servers/Server_Common/GamePacketNew.h create mode 100644 src/servers/Server_Common/Hive.cpp create mode 100644 src/servers/Server_Common/Hive.h create mode 100644 src/servers/Server_Common/LockedQueue.h create mode 100644 src/servers/Server_Common/Logger.cpp create mode 100644 src/servers/Server_Common/Logger.h create mode 100644 src/servers/Server_Common/PacketContainer.cpp create mode 100644 src/servers/Server_Common/PacketContainer.h create mode 100644 src/servers/Server_Common/ServerPacketDef.h create mode 100644 src/servers/Server_Common/Util.cpp create mode 100644 src/servers/Server_Common/Util.h create mode 100644 src/servers/Server_Common/UtilMath.cpp create mode 100644 src/servers/Server_Common/UtilMath.h create mode 100644 src/servers/Server_Common/UtilNetwork.cpp create mode 100644 src/servers/Server_Common/UtilNetwork.h create mode 100644 src/servers/Server_Common/XMLConfig.cpp create mode 100644 src/servers/Server_Common/XMLConfig.h create mode 100644 src/servers/Server_Common/base64.cpp create mode 100644 src/servers/Server_Common/base64.h create mode 100644 src/servers/Server_Common/md5.cpp create mode 100644 src/servers/Server_Common/md5.h create mode 100644 src/servers/Server_Lobby/CMakeLists.txt create mode 100644 src/servers/Server_Lobby/Forwards.h create mode 100644 src/servers/Server_Lobby/GameConnection.cpp create mode 100644 src/servers/Server_Lobby/GameConnection.h create mode 100644 src/servers/Server_Lobby/LobbyPacketContainer.cpp create mode 100644 src/servers/Server_Lobby/LobbyPacketContainer.h create mode 100644 src/servers/Server_Lobby/LobbySession.cpp create mode 100644 src/servers/Server_Lobby/LobbySession.h create mode 100644 src/servers/Server_Lobby/RestConnector.cpp create mode 100644 src/servers/Server_Lobby/RestConnector.h create mode 100644 src/servers/Server_Lobby/ServerLobby.cpp create mode 100644 src/servers/Server_Lobby/ServerLobby.h create mode 100644 src/servers/Server_Lobby/blowfish.cpp create mode 100644 src/servers/Server_Lobby/blowfish.h create mode 100644 src/servers/Server_Lobby/blowfish.h2 create mode 100644 src/servers/Server_Lobby/client_http.hpp create mode 100644 src/servers/Server_Lobby/mainLobbyServer.cpp create mode 100644 src/servers/Server_REST/CMakeLists.txt create mode 100644 src/servers/Server_REST/Forwards.h create mode 100644 src/servers/Server_REST/LoginSession.cpp create mode 100644 src/servers/Server_REST/LoginSession.h create mode 100644 src/servers/Server_REST/PlayerMinimal.cpp create mode 100644 src/servers/Server_REST/PlayerMinimal.h create mode 100644 src/servers/Server_REST/SapphireAPI.cpp create mode 100644 src/servers/Server_REST/SapphireAPI.h create mode 100644 src/servers/Server_REST/Session.cpp create mode 100644 src/servers/Server_REST/Session.h create mode 100644 src/servers/Server_REST/client_http.hpp create mode 100644 src/servers/Server_REST/main.cpp create mode 100644 src/servers/Server_REST/server_http.hpp create mode 100644 src/servers/Server_Zone/Action.cpp create mode 100644 src/servers/Server_Zone/Action.h create mode 100644 src/servers/Server_Zone/ActionCast.cpp create mode 100644 src/servers/Server_Zone/ActionCast.h create mode 100644 src/servers/Server_Zone/ActionTeleport.cpp create mode 100644 src/servers/Server_Zone/ActionTeleport.h create mode 100644 src/servers/Server_Zone/Actor.cpp create mode 100644 src/servers/Server_Zone/Actor.h create mode 100644 src/servers/Server_Zone/ActorControlPacket142.h create mode 100644 src/servers/Server_Zone/ActorControlPacket143.h create mode 100644 src/servers/Server_Zone/ActorControlPacket144.h create mode 100644 src/servers/Server_Zone/ActorSpawnPacket.h create mode 100644 src/servers/Server_Zone/BattleNpc.cpp create mode 100644 src/servers/Server_Zone/BattleNpc.h create mode 100644 src/servers/Server_Zone/BattleNpcTemplate.cpp create mode 100644 src/servers/Server_Zone/BattleNpcTemplate.h create mode 100644 src/servers/Server_Zone/CMakeLists.txt create mode 100644 src/servers/Server_Zone/Cell.cpp create mode 100644 src/servers/Server_Zone/Cell.h create mode 100644 src/servers/Server_Zone/CellHandler.h create mode 100644 src/servers/Server_Zone/CharaPc.cpp create mode 100644 src/servers/Server_Zone/CharaPc.h create mode 100644 src/servers/Server_Zone/ChatPacket.h create mode 100644 src/servers/Server_Zone/Event.cpp create mode 100644 src/servers/Server_Zone/Event.h create mode 100644 src/servers/Server_Zone/EventAction.cpp create mode 100644 src/servers/Server_Zone/EventAction.h create mode 100644 src/servers/Server_Zone/EventFinishPacket.h create mode 100644 src/servers/Server_Zone/EventHelper.cpp create mode 100644 src/servers/Server_Zone/EventHelper.h create mode 100644 src/servers/Server_Zone/EventItemAction.cpp create mode 100644 src/servers/Server_Zone/EventItemAction.h create mode 100644 src/servers/Server_Zone/EventPlayPacket.h create mode 100644 src/servers/Server_Zone/EventStartPacket.h create mode 100644 src/servers/Server_Zone/Forwards.h create mode 100644 src/servers/Server_Zone/GameCommand.h create mode 100644 src/servers/Server_Zone/GameCommandHandler.cpp create mode 100644 src/servers/Server_Zone/GameCommandHandler.h create mode 100644 src/servers/Server_Zone/GameConnection.cpp create mode 100644 src/servers/Server_Zone/GameConnection.h create mode 100644 src/servers/Server_Zone/Globals.h create mode 100644 src/servers/Server_Zone/InitUIPacket.h create mode 100644 src/servers/Server_Zone/Inventory.cpp create mode 100644 src/servers/Server_Zone/Inventory.h create mode 100644 src/servers/Server_Zone/Item.cpp create mode 100644 src/servers/Server_Zone/Item.h create mode 100644 src/servers/Server_Zone/ItemContainer.cpp create mode 100644 src/servers/Server_Zone/ItemContainer.h create mode 100644 src/servers/Server_Zone/ModelEquipPacket.h create mode 100644 src/servers/Server_Zone/MoveActorPacket.h create mode 100644 src/servers/Server_Zone/PacketHandlers.cpp create mode 100644 src/servers/Server_Zone/PacketHandlers2.cpp create mode 100644 src/servers/Server_Zone/PingPacket.h create mode 100644 src/servers/Server_Zone/Player.cpp create mode 100644 src/servers/Server_Zone/Player.h create mode 100644 src/servers/Server_Zone/PlayerEvent.cpp create mode 100644 src/servers/Server_Zone/PlayerInventory.cpp create mode 100644 src/servers/Server_Zone/PlayerQuest.cpp create mode 100644 src/servers/Server_Zone/PlayerSpawnPacket.h create mode 100644 src/servers/Server_Zone/PlayerSql.cpp create mode 100644 src/servers/Server_Zone/PlayerStateFlagsPacket.h create mode 100644 src/servers/Server_Zone/QuestMessagePacket.h create mode 100644 src/servers/Server_Zone/ScriptManager.cpp create mode 100644 src/servers/Server_Zone/ScriptManager.h create mode 100644 src/servers/Server_Zone/ScriptManagerInit.cpp create mode 100644 src/servers/Server_Zone/ServerNoticePacket.h create mode 100644 src/servers/Server_Zone/ServerZone.cpp create mode 100644 src/servers/Server_Zone/ServerZone.h create mode 100644 src/servers/Server_Zone/Session.cpp create mode 100644 src/servers/Server_Zone/Session.h create mode 100644 src/servers/Server_Zone/StatusEffect.cpp create mode 100644 src/servers/Server_Zone/StatusEffect.h create mode 100644 src/servers/Server_Zone/StatusEffectContainer.cpp create mode 100644 src/servers/Server_Zone/StatusEffectContainer.h create mode 100644 src/servers/Server_Zone/UpdateHpMpTpPacket.h create mode 100644 src/servers/Server_Zone/Zone.cpp create mode 100644 src/servers/Server_Zone/Zone.h create mode 100644 src/servers/Server_Zone/ZoneMgr.cpp create mode 100644 src/servers/Server_Zone/ZoneMgr.h create mode 100644 src/servers/Server_Zone/ZonePosition.cpp create mode 100644 src/servers/Server_Zone/ZonePosition.h create mode 100644 src/servers/Server_Zone/mainGameServer.cpp create mode 100644 src/tools/Script/ce_dump_vfs_path_357.lua create mode 100644 src/tools/Script/ce_dump_vfs_path_sbbench.lua create mode 100644 src/tools/pcb_reader/CMakeLists.txt create mode 100644 src/tools/pcb_reader/main.cpp create mode 100644 src/tools/pcb_reader/pcb.h create mode 100644 src/tools/quest_parser/CMakeLists.txt create mode 100644 src/tools/quest_parser/main.cpp create mode 100644 src/tools/quest_parser/unluac_2015_06_13.jar diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..bf07950c --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 2.6) +project (Sapphire) + +set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/bin) + +set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}) +set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}) + +set(PROJECT_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include) + +# boost stuff +if("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xMSVC") + set(Boost_COMPILER "-vc140") +endif() +set(SAPPHIRE_BOOST_VER 1.60.0) +set(SAPPHIRE_BOOST_FOLDER_NAME boost_1_60_0) + +include_directories("${PROJECT_INCLUDE_DIR}") +include_directories("${PROJECT_SOURCE_DIR}") + +add_subdirectory("src/servers") +add_subdirectory("src/libraries/sapphire/datReader") diff --git a/CMakeSettings.json b/CMakeSettings.json new file mode 100644 index 00000000..441c9d43 --- /dev/null +++ b/CMakeSettings.json @@ -0,0 +1,37 @@ +{ + // See https://go.microsoft.com//fwlink//?linkid=834763 for more information about this file. + "configurations": [ + { + "name": "x86-Debug", + "generator": "Visual Studio 14 2015", + "configurationType" : "Debug", + "buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "-m -v:minimal" + }, + { + "name": "x86-Release", + "generator": "Visual Studio 14 2015", + "configurationType": "Release", + "buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "-m -v:minimal" + }, + { + "name": "x64-Debug", + "generator": "Visual Studio 14 2015 Win64", + "configurationType" : "Debug", + "buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "-m -v:minimal" + }, + { + "name": "x64-Release", + "generator": "Visual Studio 14 2015 Win64", + "configurationType": "Release", + "buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "-m -v:minimal" + } + ] +} \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..a871fcfd --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,662 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. + diff --git a/README.md b/README.md new file mode 100644 index 00000000..e8ff2cc7 --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +# Sapphire - FINAL FANTASY XIV Server Emulator +[![Discord Server](https://img.shields.io/badge/discord-Sapphire-7289DA.svg)](https://discord.gg/KfrZCkx) + +![FFXIV Sapphire](http://i.imgur.com/I4bj1tR.png) + +Sapphire is a FINAL FANTASY XIV 4.0+ Server Emulator currently in development. + +## Features + +* Fully working base world servers, including character creation, chat, player interaction, etc. +* Basic action/battle system +* Teleports, discovery +* NPCs, enemies +* Support for most Quest types(instanced content planned, to be added later) +* Content scripting via ChaiScript +* Retail GM commands working + +## Dependencies + Compiling +Sapphire requires the following software: + +| *Name* | *Windows* | *Linux* | +| ------ | --------- | ------- | +| CMake 2.6+ and C++14 capable compiler | [Visual Studio 2017](https://www.visualstudio.com/) | Your favorite C++14 capable compiler | +| Boost 1.63.0 | [Win32 precompiled binaries](https://sourceforge.net/projects/boost/files/boost-binaries/1.63.0/boost_1_63_0-msvc-14.0-32.exe/download) | Boost libraries from your distribution's package manager | +| MySQL Server 5.7 | [Official Site](https://dev.mysql.com/downloads/mysql/) | MySQL server from your distribution's package manager | +| C# Compiler(used for various tools) | [Visual Studio 2017](https://www.visualstudio.com/) \| [Mono](http://www.mono-project.com/) | [Mono](http://www.mono-project.com/) from your distribution's package manager | + +**Windows** +Set the environment variables ``BOOST_ROOT_DIR`` and ``BOOST_LIB_DIR`` to ``[boost main folder]`` and ``[boost main folder]/lib32-msvc-14.0`` respectively **or** copy your boost installation into the project's ``src/lib`` folder. +* In *Visual Studio 2017*: Open the project via ``File`` > ``Open`` > ``Folder`` and wait, till CMake automatically finishes cache generation. Right click any CMakeLists.txt and select build to build a application. +To configure debug startup parameters, select ``Debug and Launch settings``, the application you want to set up parameters for, and add a ``args`` json array containing your launch parameters in ``configurations``. +If Visual Studio fails to generate a CMake Cache or does not show options to build, make sure that the newest version of it is installed and all environment variables are set correctly. Keep in mind that generating a cache can take a while on some machines. +* In *Visual Studio 2015*: Generate a Visual Studio project via CMake: ``cmake -G "Visual Studio 14 2015"`` and open it as a normal solution in Visual Studio. + +**Linux** +Generate a cache with CMake and use your favorite C++14 capable compiler to compile those wonderful lines of code into binaries with ``make``. +Sapphire is **not** currently configured to compile in 64bit. Make sure that all libraries have their ``:i386`` versions installed. + +## Links + +* [Sapphire on YouTube](https://www.youtube.com/channel/UCJKYuovoGsq7PxSAfrNJKbw) + +Final Fantasy XIV © 2010-2017 SQUARE ENIX CO., LTD. All Rights Reserved. We are not affiliated with SQUARE ENIX CO., LTD. in any way. diff --git a/bin/config/settings_lobby.xml b/bin/config/settings_lobby.xml new file mode 100644 index 00000000..5cccee53 --- /dev/null +++ b/bin/config/settings_lobby.xml @@ -0,0 +1,27 @@ + + + + 54994 + 54998 + + 127.0.0.1 + + C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack\\ffxiv + + 127.0.0.1 + + 54992 + + 127.0.0.1:8080 + + default + + + 127.0.0.1 + 3306 + root + + sapphire + + + \ No newline at end of file diff --git a/bin/config/settings_rest.xml b/bin/config/settings_rest.xml new file mode 100644 index 00000000..d881dda5 --- /dev/null +++ b/bin/config/settings_rest.xml @@ -0,0 +1,26 @@ + + + + 54994 + 54998 + + 127.0.0.1 + + C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack\\ffxiv + + 127.0.0.1 + + 127.0.0.1 + + default + + 8080 + + 127.0.0.1 + 3306 + root + + sapphire + + + \ No newline at end of file diff --git a/bin/config/settings_zone.xml b/bin/config/settings_zone.xml new file mode 100644 index 00000000..8259be1d --- /dev/null +++ b/bin/config/settings_zone.xml @@ -0,0 +1,22 @@ + + + + + 100 + + 54992 + + 127.0.0.1 + + C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack\\ffxiv + + + 127.0.0.1 + 3306 + root + + sapphire + + + + \ No newline at end of file diff --git a/bin/libmysql.dll b/bin/libmysql.dll new file mode 100644 index 0000000000000000000000000000000000000000..479cefdae16a8539b20143de05600169d6bd36cc GIT binary patch literal 2359296 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

U(D~abM)t$wEk3!{%pd>CRu|5 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 T;UG0@VnT0ud-R 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 +QI+Mez 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

*ia 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�P73rPVmh4@2 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%0AG9ZFJ^YbH;&*t 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⁡ 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%0DX`?L?5GtG)_zDC|W_s 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 z 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

76oqQj2A!fIIXy$Xs5LIbx-Y|c{S%lel5Sn z5$>f+>C5RW=%XA*<35dmdy7)We8wr}MAo~=0MR<2>f9;3WxeiU&)lNc+i{ zG9OtNrBFT9v)p@k;M2h8VISh_B-Br&r@S}ZEHD-EOWbF_pkHP65hrMT^e*C8nhaJcRy#@v+L~M_k8g)2kbK=pYxO8d8(5zFrr}DaR_xG1USxrHaFIOs_sGnE^uomGHah=Umd?B26}tm>d5T@;Z*j+F+%#x7>FKT!yBRx} z&DrBv99|#(qo6E4OQ?`0OG9L#a;lN2D zX-d+u)cTpqOikA38SRU6=Wa?op8KFQjon3&q}t_IQs}D7W7>N~dUO4PBbhNS>0LAH zYv0j_GP^O=%xKmSwvxSs*Nk6BaMb;iWUc&z{Iw!bDS`fX)c5d=30x7_H>hQ}UwA}J zBUj?PiCUjb+W_tm8yUx=B0u8hn$3z66bp8JtLDe#&GP z(&>$ucR119Pj07#D$z@i46?5G|{~j7gly+)>BbGJneq%QECi=!Z&wqenCTV6{#v*xikv%j!sb8d5*b7P_ZO}QC77JmUhM#vR;h;l`DJ??wF_Xw9HNoGqnO4>@< zvT5=n#RbI@<#2Uv%~;JFjgQtrSEM_lmwNZ~(fjoCo$EUwBrViCe01cE=sGcNVBFs4hpUv&de+fay%wZAQLtKeqt8leQFP*OVRXI`@;?m zQ}xkq@miL0s?ZR6u5_BRZo%@>ouO<^19~xYHzz>+K$fpks-?Pn0f&RSh7?65#?DGj z%DS8#o@ZOKLcLs*<@Fc+EPWUwjxmh=f%A%Un|ImmvEYdCkkBM#il&QeOL|GpOFPNx zDf_9#qCeEz)eqEjwF<8&uV&ukgC<9mM|_BG7t}Q4 zE7?a2|1S3P%A${8b8vIu zI|v+v4(<*jhaQf79j7@=$Lnv!_1P6(Id~oM-ReCmaC`9Ckn-?h5sl-2j(?OeGr266 z=^a$CmEMd{aI;AFOj@mb1R79JYI`N&d4$ts497z4$(1rPlJxt8eM*IH~I4$pB zUax|?iMvJpr5|O(>E}4Yz9Ry<1!w~fgwzW22(J~Pj(8DqBeHqalIWo^h4JT- zvXUpKc%;8h?~*wplbacoDbK!^{ac7D6(dJ)T?eVji~a8%$Z z8Y0;z`=XL--L&I;HUtKRC?hu|2WD-`voGlH_J;qZcxW$zc&cckFZ6mEz>N)y4@|t5 zalM$AwkCJDcnISr<4;CCp1u23(L>Q5DP7)AxmrC{^GsK&5BGWL^K;1NkS<}8hdO6*O9U^!lXe4eQGEz)WXqdS#S6S#&

!x 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%0AlurG0{ZqJ4^en%&p#Zx6Od*dy)H_E>wIJ<-m$ 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�M`$MGW=wQ#H) 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

s!{H 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 L!4>%bYz6)YzP+Tv literal 0 HcmV?d00001 diff --git a/bin/scripts/chai/CmnDefCutSceneReplay.chai_outdated b/bin/scripts/chai/CmnDefCutSceneReplay.chai_outdated new file mode 100644 index 00000000..4bddaa63 --- /dev/null +++ b/bin/scripts/chai/CmnDefCutSceneReplay.chai_outdated @@ -0,0 +1,61 @@ +// This is an automatically generated chai script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, change its extension to .chai + + +// Quest Script: SubFst004_00027 +// Quest Name: Preserving the Past +// Quest ID: 65563 +// Start NPC: 1000194 +// End NPC: 1000789 + +class CmnDefCutSceneReplayDef +{ + // Basic quest information + var quest_name + var quest_id + + // These are the quest vars / flags used in this quest + // GetQuestUI8AL + // GetQuestUI8BH + + // Available Scenes in this quest, not necessarly all are used + attr onScene00000; + + // Quest rewards + var RewardExpFactor; + var RewardItem; + var RewardItemCount; + + // Entities found in the script data of the quest + // some of these may be useful + var ACTOR0; + var ACTOR1; + var ACTOR2; + var ITEM0; + + def CmnDefCutSceneReplayDef() + { + + } + + def Scene00000( player, eventId, flags, unk, unk1 ) + { + player.eventPlay(eventId, 0, 0x2000, unk, 1, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + player.eventFinish(eventId, 1); + } ); + } + +}; + + +def CmnDefCutSceneReplay_START(player, actorId, eventId) +{ + var quest = CmnDefCutSceneReplay(); + var actor = mapActor( actorId ); + + player.eventStart( actorId, eventId, 1, 0, 0 ); + CmnDefCutSceneReplay.Scene00000( player, eventId, 0, 0, 0 ); +} diff --git a/bin/scripts/chai/aetheryte/Aethernet.chai b/bin/scripts/chai/aetheryte/Aethernet.chai new file mode 100644 index 00000000..db86ed39 --- /dev/null +++ b/bin/scripts/chai/aetheryte/Aethernet.chai @@ -0,0 +1,57 @@ +//Aethernet - Aetheryte + +class AethernetDef +{ + + def AethernetDef() + { + this.AetheryteBaseId = 0x50000; + this.AETHERYTE_MENU_AETHERNET = 1; + this.AETHERYTE_MENU_HOUSING = 2; + this.AETHERYTE_MENU_HOME_POINT = 3; + this.AETHERYTE_MENU_FAVORITE_POINT = 4; + this.AETHERYTE_MENU_FAVORITE_POINT_SECURITY_TOKEN = 5; + } + + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + + if( player.isAetheryteRegistered( eventId & 0xFFFF ) ) + { + player.eventPlay( eventId, 2, NONE, + fun ( player, eventId, param1, param2, param3 ) + { + var aetherId = eventId & 0xFFFF; + + if ( param1 == 256 ) // aethernet + { + //player.setTeleporting( true ); + player.teleport( param2, 2 ); + } + } ); + } + else + { + var ACTION_ATTUNE = 0x13; + player.eventActionStart( eventId, + ACTION_ATTUNE, + // callback function for finished casting + fun ( player, eventId, additional ) + { + + var aetherId = eventId & 0xFFFF; + player.aetheryteRegister( aetherId ); + player.eventPlay( eventId, 3, 0, 0, 0); + + }, + // callback for interrupted action. + fun ( player, eventId, additional ){}, + 0); + player.unlock(); + + } + + } +} +GLOBAL Aethernet = AethernetDef(); \ No newline at end of file diff --git a/bin/scripts/chai/aetheryte/Aetheryte.chai b/bin/scripts/chai/aetheryte/Aetheryte.chai new file mode 100644 index 00000000..5c48eec7 --- /dev/null +++ b/bin/scripts/chai/aetheryte/Aetheryte.chai @@ -0,0 +1,71 @@ +//Aethernet - Aetheryte + +class AetheryteDef +{ + + def AetheryteDef() + { + this.AetheryteBaseId = 0x50000; + this.AETHERYTE_MENU_AETHERNET = 1; + this.AETHERYTE_MENU_HOUSING = 2; + this.AETHERYTE_MENU_HOME_POINT = 3; + this.AETHERYTE_MENU_FAVORITE_POINT = 4; + this.AETHERYTE_MENU_FAVORITE_POINT_SECURITY_TOKEN = 5; + } + + def onTalk( eventId, player, actorId ) + { + if( player.isAetheryteRegistered( eventId & 0xFFFF ) ) + { + player.eventPlay( eventId, 0, 1, + fun ( player, eventId, param1, param2, param3 ) + { + var aetherId = eventId & 0xFFFF; + + if ( param1 == 256 ) // set homepoint + { + player.setHomepoint( aetherId ); + player.questMessage( eventId, 2, 0xEA, 0, 0); + } + else if ( param1 == 512 && param2 == 4 ) // aethernet + { + player.setTeleporting( true ); + player.teleport( param3, 2 ); + } + + } ); + } + else + { + var ACTION_ATTUNE = 0x13; + player.eventActionStart(eventId, + ACTION_ATTUNE, + // callback function for finished casting + fun ( player, eventId, additional ) + { + var aetherId = eventId & 0xFFFF; + player.aetheryteRegister(aetherId); + + // check if teleport is already unlocked + if( player.isActionLearned( 4 ) ) + { + player.questMessage( eventId, 0, 2, 0, 0); + } + else + { + player.questMessage( eventId, 0, 1, 1, 0); + player.learnAction( 4 ); + } + }, + // callback for interrupted action. + fun ( player, eventId, additional ) + { + }, + 0); + player.unlock(); + } + + } +} + +GLOBAL Aetheryte = AetheryteDef(); \ No newline at end of file diff --git a/bin/scripts/chai/global.inc b/bin/scripts/chai/global.inc new file mode 100644 index 00000000..4ec015ea --- /dev/null +++ b/bin/scripts/chai/global.inc @@ -0,0 +1,226 @@ +///////////////////////////////////////////////////////////////////// +// Quest sequence +///////////////////////////////////////////////////////////////////// +GLOBAL SEQ_COMPLETE = 0xFF + +///////////////////////////////////////////////////////////////////// +// SCENE_FLAGS +///////////////////////////////////////////////////////////////////// +GLOBAL SET_EOBJ_BASE = 0xF8400EF3 +GLOBAL SET_INVIS_BASE = 0xF8400FFF +GLOBAL SET_BASE = 0xF8400EFB +GLOBAL INVIS_COMPANION = 0x80000000 +GLOBAL INVIS_ALLIANCE_BUDDY = 0x40000000 +GLOBAL INVIS_ALLIANCE_PC = 0x20000000 +GLOBAL INVIS_AOE = 0x08000000 +GLOBAL DISABLE_CANCEL_EMOTE = 0x04000000 +GLOBAL LOCK_HOTBAR = 0x02000000 +GLOBAL LOCK_HUD = 0x01000000 +GLOBAL ROLLBACK_HIDE_UI = 0x00800000 +GLOBAL DISABLE_STEALTH = 0x00400000 +GLOBAL HIDE_FESTIVAL = 0x00200000 +GLOBAL DISABLE_SKIP = 0x00080000 +GLOBAL SILENT_ENTER_TERRI_ALL = 0x00038000 +GLOBAL SILENT_ENTER_TERRI_SE = 0x00020000 +GLOBAL SILENT_ENTER_TERRI_BGM = 0x00010000 +GLOBAL SILENT_ENTER_TERRI_ENV = 0x00008000 +GLOBAL INVINCIBLE = 0x00004000 +GLOBAL HIDE_HOTBAR = 0x00002000 +GLOBAL AUTO_LOC_CAMERA = 0x00001000 +GLOBAL INVIS_ALL = 0xF80003FC +GLOBAL HIDE_UI = 0x00000800 +GLOBAL CONDITION_CUTSCENE = 0x00000400 +GLOBAL INVIS_TREASURE = 0x00000200 +GLOBAL INVIS_AETHERYTE = 0x00000100 +GLOBAL INVIS_GATHERING_POINT = 0x00000080 +GLOBAL INVIS_PARTY_BUDDY = 0x10000000 +GLOBAL INVIS_PARTY_PC = 0x00000040 +GLOBAL INVIS_OTHER_PC = 0x00000020 +GLOBAL INVIS_BNPC = 0x00000010 +GLOBAL INVIS_EOBJ = 0x00000008 +GLOBAL INVIS_ENPC = 0x00000004 +GLOBAL FADE_OUT = 0x00000002 +GLOBAL NO_DEFAULT_CAMERA = 0x00000001 +GLOBAL NONE = 0x00000000 + +///////////////////////////////////////////////////////////////////// +// Event Types +///////////////////////////////////////////////////////////////////// +GLOBAL EVENT_TALK = 1 +GLOBAL EVENT_EMOTE = 2 +GLOBAL EVENT_DISTANCE_BELOW = 3 +GLOBAL EVENT_DISTANCE_OVER = 4 +GLOBAL EVENT_BATTLE_REWARD = 5 +GLOBAL EVENT_CRAFT = 6 +GLOBAL EVENT_NEST = 7 +GLOBAL EVENT_EVENT_ITEM = 8 +GLOBAL EVENT_DROP = 9 +GLOBAL EVENT_WITHIN_RANGE = 10 +GLOBAL EVENT_OUTSIDE_RANGE = 11 +GLOBAL EVENT_GAME_START = 12 +GLOBAL EVENT_GAME_PROGRESS = 13 +GLOBAL EVENT_ENTER_TERRITORY = 15 +GLOBAL EVENT_GAME_COME_BACK = 17 +GLOBAL EVENT_ACTION_RESULT = 18 +GLOBAL EVENT_MATERIA_CRAFT = 19 +GLOBAL EVENT_FISHING = 20 +GLOBAL EVENT_UI = 21 +GLOBAL EVENT_HOUSING = 22 +GLOBAL EVENT_SAY = 23 +GLOBAL EVENT_TABLE_GAME = 24 + +///////////////////////////////////////////////////////////////////// +// Event finish states +///////////////////////////////////////////////////////////////////// +GLOBAL UNLOCK = 1 +GLOBAL KEEPLOCK = 0 + +///////////////////////////////////////////////////////////////////// +// Possible Event Types +///////////////////////////////////////////////////////////////////// + +GLOBAL ACTOR_EVENT_ON_CREATE = 1 +GLOBAL ACTOR_EVENT_ON_SPAWN = 2 +GLOBAL ACTOR_EVENT_ON_DESPAWN = 3 +GLOBAL ACTOR_EVENT_ON_AI_TICK = 4 +GLOBAL ACTOR_EVENT_ON_TALK_DEFAULT = 5 + +GLOBAL MOB_EVENT_ON_DEATH = 1 + +GLOBAL REGION_EVENT_ON_CREATE= 1 +GLOBAL REGION_EVENT_ON_ENTER = 2 +GLOBAL REGION_EVENT_ON_LEAVE = 3 + +GLOBAL PLAYER_EVENT_ON_FIRST_ENTER_WORLD = 1 +GLOBAL PLAYER_EVENT_ON_ENTER_WORLD = 2 +GLOBAL PLAYER_EVENT_ON_DEATH = 3 +GLOBAL PLAYER_EVENT_ON_LOGIN = 4 +GLOBAL PLAYER_EVENT_ON_LOGOUT = 5 + +// End Event Types + +GLOBAL SLOT_MAINH = 0 +GLOBAL SLOT_OFFH = 1 +GLOBAL SLOT_HEAD = 2 +GLOBAL SLOT_BODY = 3 +GLOBAL SLOT_GLOVES = 4 +GLOBAL SLOT_WAIST = 5 +GLOBAL SLOT_LEGS = 6 +GLOBAL SLOT_FEET = 7 + +GLOBAL GENDER_MALE = 0 +GLOBAL GENDER_FEMALE = 1 + +GLOBAL ACTION_EVENT_START = 1 +GLOBAL ACTION_EVENT_RETURN = 2 +GLOBAL ACTION_EVENT_TRADE_RETURN = 3 +GLOBAL ACTION_ERANGE_EVENT_START = 4 +GLOBAL ACTION_EVENT_EMOTE = 5 + +GLOBAL ACTION_RETURN = 0x26 +GLOBAL ACTION_TELEPORT = 0x29 + +GLOBAL EVENTACTION_ATTUNE = 0x13 + +GLOBAL CLASS_GLA = 1 +GLOBAL CLASS_PUG = 2 +GLOBAL CLASS_MRD = 3 +GLOBAL CLASS_LNC = 4 +GLOBAL CLASS_ARC = 5 +GLOBAL CLASS_CON = 6 +GLOBAL CLASS_THM = 7 +GLOBAL CLASS_CRP = 8 +GLOBAL CLASS_BSM = 9 +GLOBAL CLASS_ARM = 10 +GLOBAL CLASS_GLD = 11 +GLOBAL CLASS_TAN = 12 +GLOBAL CLASS_WVR = 13 +GLOBAL CLASS_ALC = 14 +GLOBAL CLASS_CUL = 15 +GLOBAL CLASS_MIN = 16 +GLOBAL CLASS_BOT = 17 +GLOBAL CLASS_FSH = 18 +GLOBAL CLASS_PLD = 19 +GLOBAL CLASS_MNK = 20 +GLOBAL CLASS_WAR = 21 +GLOBAL CLASS_DRG = 22 +GLOBAL CLASS_BRD = 23 +GLOBAL CLASS_WHM = 24 +GLOBAL CLASS_BLM = 25 +GLOBAL CLASS_ACN = 26 +GLOBAL CLASS_SMN = 27 +GLOBAL CLASS_SCH = 28 +GLOBAL CLASS_ROG = 29 +GLOBAL CLASS_NIN = 30 +GLOBAL CLASS_MCH = 31 +GLOBAL CLASS_DRK = 32 +GLOBAL CLASS_AST = 33 + +/////////////////////////////////////////////////////////////// +// Inventory Enums +/////////////////////////////////////////////////////////////// +GLOBAL INVENTORY_BAG0 = 0 +GLOBAL INVENTORY_BAG1 = 1 +GLOBAL INVENTORY_BAG2 = 2 +GLOBAL INVENTORY_BAG3 = 3 + +GLOBAL INVENTORY_GEARSET0 = 1000 +GLOBAL INVENTORY_GEARSET1 = 1001 + +GLOBAL INVENTORY_CURRENCY = 2000 +GLOBAL INVENTORY_CRYSTAL = 2001 +//GLOBAL INVENTORY_UNKNOWN_0 = 2003 +GLOBAL INVENTORY_KEYITEM = 2004 +GLOBAL INVENTORY_DAMAGEDGEAR = 2007 +//GLOBAL INVENTORY_UNKNOWN_1 = 2008 + +GLOBAL INVENTORY_ARMORYOFF = 3200 +GLOBAL INVENTORY_ARMORYHEAD = 3201 +GLOBAL INVENTORY_ARMORYBODY = 3202 +GLOBAL INVENTORY_ARMORYHAND = 3203 +GLOBAL INVENTORY_ARMORYWAIST = 3204 +GLOBAL INVENTORY_ARMORYLEGS = 3205 +GLOBAL INVENTORY_ARMORYFEET = 3206 +GLOBAL INVENTORY_ARMOTYNECK = 3207 +GLOBAL INVENTORY_ARMORYEAR = 3208 +GLOBAL INVENTORY_ARMORYWRIST = 3209 +GLOBAL INVENTORY_ARMORYRING = 3300 + +GLOBAL INVENTORY_ARMORYSOULCRYSTAL = 3400 +GLOBAL INVENTORY_ARMORYMAIN = 3500 + +GLOBAL INVENTORY_RETAINERBAG0 = 10000 +GLOBAL INVENTORY_RETAINERBAG1 = 10001 +GLOBAL INVENTORY_RETAINERBAG2 = 10002 +GLOBAL INVENTORY_RETAINERBAG3 = 10003 +GLOBAL INVENTORY_RETAINERBAG4 = 10004 +GLOBAL INVENTORY_RETAINERBAG5 = 10005 +GLOBAL INVENTORY_RETAINERBAG6 = 10006 +GLOBAL INVENTORY_RETAINEREQUIPPEDGEAR = 11000 +GLOBAL INVENTORY_RETAINERGIL = 12000 +GLOBAL INVENTORY_RETAINERCRYSTAL = 12001 +GLOBAL INVENTORY_RETAINERMARKET = 12002 + +GLOBAL INVENTORY_FREECOMPANYBAG0 = 20000 +GLOBAL INVENTORY_FREECOMPANYBAG1 = 20001 +GLOBAL INVENTORY_FREECOMPANYBAG2 = 20002 +GLOBAL INVENTORY_FREECOMPANYGIL = 22000 +GLOBAL INVENTORY_FREECOMPANYCRYSTAL = 22001 + +//////////////////////////////////////////////////////////// +// Currency types +//////////////////////////////////////////////////////////// +GLOBAL CURRENCY_GIL = 0X01 +GLOBAL CURRENCY_STORMSEAL = 0X02 +GLOBAL CURRENCY_SERPENTSEAL = 0X03 +GLOBAL CURRENCY_FLAMESEAL = 0X04 +GLOBAL CURRENCY_TOMESTONEPHILO = 0X05 +GLOBAL CURRENCY_TOMESTONEMYTHO = 0X06 +GLOBAL CURRENCY_WOLFMARK = 0X07 +GLOBAL CURRENCY_TOMESTONESOLD = 0X08 +GLOBAL CURRENCY_ALLIEDSEAL = 0X09 +GLOBAL CURRENCY_TOMESTONEPOET = 0X0A +GLOBAL CURRENCY_MGP = 0X0B +GLOBAL CURRENCY_TOMESTONELAW = 0X0C +GLOBAL CURRENCY_TOMESTONEESO = 0X0D +GLOBAL CURRENCY_TOMESTONELORE = 0X0E diff --git a/bin/scripts/chai/opening/OpeningGridania.chai b/bin/scripts/chai/opening/OpeningGridania.chai new file mode 100644 index 00000000..9dac7aed --- /dev/null +++ b/bin/scripts/chai/opening/OpeningGridania.chai @@ -0,0 +1,97 @@ +// Opening Script: OpeningGridania +// Quest Name: OpeningGridania +// Quest ID: 1245186 + +class OpeningGridaniaDef +{ + + def OpeningGridaniaDef() + { + this.id = 1245186; + this.name = "OpeningGridania"; + + this.ERANGE_HOWTO_ANN_AND_QUEST = 2117539; + this.ERANGE_HOWTO_QUEST_REWARD = 2366417; + this.ERANGE_SEQ_1_CLOSED_1 = 2351918; + this.POS_SEQ_1_CLOSED_RETURN_1 = 2351921; + this.ERANGE_SEQ_1_CLOSED_2 = 2351919; + this.POS_SEQ_1_CLOSED_RETURN_2 = 2351921; + this.ERANGE_ALWAYS_CLOSED_1 = 2280846; + this.POS_ALWAYS_CLOSED_RETURN_1 = 2320804; + this.ENPC_ALWAYS_CLOSED_1 = 2367988; + this.ERANGE_ALWAYS_CLOSED_3 = 2280851; + this.POS_ALWAYS_CLOSED_RETURN_3 = 2320811; + this.ENPC_ALWAYS_CLOSED_3 = 2563491; + this.BGM_MUSIC_ZONE_FST_TWN = 1003; + this.NCUT_FST_1 = 3; + this.NCUT_FST_2 = 53; + this.NCUT_FST_3 = 226; + this.ENPC_QUEST_OFFER = 1985150; + this.NCUT_LIGHT_ALL = 2; + this.NCUT_LIGHT_FST_1 = 147; + this.NCUT_LIGHT_FST_2 = 146; + } + + def Scene00000( player ) + { + player.eventPlay( this.id, 0, 0x2001, 0, 1, + fun( player, eventId, param1, param2, param3 ) + { + player.setFirstLogin( false ); + OpeningGridania.Scene00001( player ); + } ); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, 0x2001, 1, 0x32 ); + } + + def Scene00020( player ) + { + player.eventPlay( this.id, 20, 0x2001, 0, 1 ); + } + + def Scene00030( player ) + { + player.eventPlay( this.id, 30, 0x2001, 0, 0 ); + } + + def Scene00040( player ) + { + player.eventPlay( this.id, 40, 1, 2, 1, + fun( player, eventId, param1, param2, param3 ) + { + if( player.hasQuest( ManFst001.id ) ) + { + // update the instance boundaries + OpeningGridania.Scene00030( player ); + } + } ); + } + + ////////////////////////////// EVENT HANDLERS ////////////////////////////////// + + def onEnterTerritory( eventId, player, param1, param2) + { + if( player.isFirstLogin() == true ) + { + this.Scene00000( player ); + } + else + { + this.Scene00040( player ); + } + } + + def onWithinRange( eventId, player, param1, x, y, z) + { + if( this.ERANGE_ALWAYS_CLOSED_3 == param1 ) + { + this.Scene00020( player ); + } + } + +}; + +GLOBAL OpeningGridania = OpeningGridaniaDef(); diff --git a/bin/scripts/chai/opening/OpeningLimsa.chai b/bin/scripts/chai/opening/OpeningLimsa.chai new file mode 100644 index 00000000..d97977dc --- /dev/null +++ b/bin/scripts/chai/opening/OpeningLimsa.chai @@ -0,0 +1,108 @@ +// Opening Script: OpeningLimsaLominsa +// Quest Name: OpeningLimsaLominsa +// Quest ID: 1245185 + +class OpeningLimsaLominsaDef +{ + + def OpeningLimsaLominsaDef() + { + this.id = 1245185; + this.name = "OpeningLimsaLominsa"; + + this.ERANGE_HOWTO_ANN_AND_QUEST = 4101831 + this.ERANGE_HOWTO_QUEST_REWARD = 4102066 + this.ERANGE_SEQ_1_CLOSED_1 = 4101785 + this.POS_SEQ_1_CLOSED_RETURN_1 = 4101797 + this.ERANGE_ALWAYS_CLOSED_1 = 4101744 + this.POS_ALWAYS_CLOSED_RETURN_1 = 4101761 + this.ENPC_ALWAYS_CLOSED_1 = 4102038 + this.ERANGE_ALWAYS_CLOSED_2 = 4101746 + this.POS_ALWAYS_CLOSED_RETURN_2 = 4101763 + this.ENPC_ALWAYS_CLOSED_2 = 4102036 + this.ERANGE_ALWAYS_CLOSED_3 = 4101967 + this.POS_ALWAYS_CLOSED_RETURN_3 = 4101982 + this.ENPC_ALWAYS_CLOSED_3 = 4102033 + this.ERANGE_ALWAYS_CLOSED_4 = 4101970 + this.POS_ALWAYS_CLOSED_RETURN_4 = 4101984 + this.ENPC_ALWAYS_CLOSED_4 = 4102031 + this.ERANGE_ALWAYS_CLOSED_5 = 4101973 + this.POS_ALWAYS_CLOSED_RETURN_5 = 4101985 + this.ENPC_ALWAYS_CLOSED_5 = 4102007 + this.ERANGE_ALWAYS_CLOSED_6 = 4101979 + this.POS_ALWAYS_CLOSED_RETURN_6 = 4101988 + this.ENPC_ALWAYS_CLOSED_6 = 2367400 + this.BGM_MUSIC_ZONE_SEA_TWN = 1020 + this.NCUT_SEA_1 = 200 + this.NCUT_SEA_2 = 132 + this.NCUT_SEA_3 = 201 + this.ENPC_QUEST_OFFER = 4102039 + this.NCUT_LIGHT_ALL = 2 + this.NCUT_LIGHT_SEA_1 = 147 + this.NCUT_LIGHT_SEA_2 = 138 + } + + def Scene00000( player ) + { + player.eventPlay( this.id, 0, 0x04AC05, 0, 1, + fun( player, eventId, param1, param2, param3 ) + { + player.setFirstLogin( false ); + OpeningLimsaLominsa.Scene00001( player ); + } ); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, 0x2001, 1, 0x32 ); + } + + def Scene00020( player ) + { + player.eventPlay( this.id, 20, 0x2001, 0, 1 ); + } + + def Scene00030( player ) + { + player.eventPlay( this.id, 30, 0x2001, 0, 0 ); + } + + def Scene00040( player ) + { + player.eventPlay( this.id, 40, 1, 2, 1, + fun( player, eventId, param1, param2, param3 ) + { + player.eventFinish( eventId, UNLOCK ); + if( player.hasQuest( ManSea001.id ) ) + { + // update the instance boundaries + OpeningLimsaLominsa.Scene00030( player ); + } + } ); + } + + ////////////////////////////// EVENT HANDLERS ////////////////////////////////// + + def onEnterTerritory( eventId, player, param1, param2) + { + // if( player.isFirstLogin() == true ) + // { + this.Scene00000( player ); + // } + //else + // { + // this.Scene00040( player ); + // } + } + + def onWithinRange( eventId, player, param1, x, y, z) + { + if( this.ERANGE_SEQ_1_CLOSED_1 == param1 ) + { + this.Scene00020( player ); + } + } + +}; + +GLOBAL OpeningLimsaLominsa = OpeningLimsaLominsaDef(); diff --git a/bin/scripts/chai/opening/OpeningUldah.chai b/bin/scripts/chai/opening/OpeningUldah.chai new file mode 100644 index 00000000..da6b24be --- /dev/null +++ b/bin/scripts/chai/opening/OpeningUldah.chai @@ -0,0 +1,98 @@ +// Opening Script: OpeningUldah +// Quest Name: OpeningUldah +// Quest ID: 1245187 + +class OpeningUldahDef +{ + + def OpeningUldahDef() + { + this.id = 1245187; + this.name = "OpeningUldah"; + + this.ERANGE_HOWTO_ANN_AND_QUEST = 4101650; + this.ERANGE_HOWTO_QUEST_REWARD = 4102883; + this.ERANGE_SEQ_1_CLOSED_1 = 4101587; + this.POS_SEQ_1_CLOSED_RETURN_1 = 4101691; + this.ERANGE_ALWAYS_CLOSED_1 = 4101537; + this.POS_ALWAYS_CLOSED_RETURN_1 = 4101685; + this.ENPC_ALWAYS_CLOSED_1 = 4101796; + this.ERANGE_ALWAYS_CLOSED_2 = 4101525; + this.POS_ALWAYS_CLOSED_RETURN_2 = 4101680; + this.ENPC_ALWAYS_CLOSED_2 = 4101789; + this.ERANGE_ALWAYS_CLOSED_3 = 4101535; + this.POS_ALWAYS_CLOSED_RETURN_3 = 4101681; + this.ENPC_ALWAYS_CLOSED_3 = 4101787; + this.BGM_MUSIC_ZONE_WIL_TWN = 1035; + this.NCUT_WIL_1 = 186; + this.NCUT_WIL_2 = 139; + this.NCUT_WIL_3 = 187; + this.ENPC_QUEST_OFFER = 3969639; + this.NCUT_LIGHT_ALL = 2; + this.NCUT_LIGHT_WIL_1 = 147; + this.NCUT_LIGHT_WIL_2 = 145; + } + + def Scene00000( player ) + { + player.eventPlay( this.id, 0, 0x2001, 0, 1, + fun( player, eventId, param1, param2, param3 ) + { + player.setFirstLogin( false ); + OpeningUldah.Scene00001( player ); + } ); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, 0x2001, 1, 0x32 ); + } + + def Scene00020( player ) + { + player.eventPlay( this.id, 20, 0x2001, 0, 1 ); + } + + def Scene00030( player ) + { + player.eventPlay( this.id, 30, 0x2001, 0, 0 ); + } + + def Scene00040( player ) + { + player.eventPlay( this.id, 40, 1, 2, 1, + fun( player, eventId, param1, param2, param3 ) + { + if( player.hasQuest( ManWil001.id ) ) + { + // update the instance boundaries + OpeningUldah.Scene00030( player ); + } + } ); + } + + ////////////////////////////// EVENT HANDLERS ////////////////////////////////// + + def onEnterTerritory( eventId, player, param1, param2) + { + if( player.isFirstLogin() == true ) + { + this.Scene00000( player ); + } + else + { + this.Scene00040( player ); + } + } + + def onOutsideRange( eventId, player, param1, x, y, z) + { + if( this.ERANGE_SEQ_1_CLOSED_1 == param1 ) + { + this.Scene00020( player ); + } + } + +}; + +GLOBAL OpeningUldah = OpeningUldahDef(); diff --git a/bin/scripts/chai/player_events.chai b/bin/scripts/chai/player_events.chai new file mode 100644 index 00000000..c6877101 --- /dev/null +++ b/bin/scripts/chai/player_events.chai @@ -0,0 +1,11 @@ + +def onFirstEnterWorld(player) +{ + var name = player.getName(); + var race = player.getRace(); + var gender = player.getGender(); + //var class = player.getClass(); + + + return name; +} diff --git a/bin/scripts/chai/quest/ManFst001.chai b/bin/scripts/chai/quest/ManFst001.chai new file mode 100644 index 00000000..d8ea1ebf --- /dev/null +++ b/bin/scripts/chai/quest/ManFst001.chai @@ -0,0 +1,124 @@ +// Quest Script: ManFst001_00039 +// Quest Name: Coming to Gridania +// Quest ID: 65575 +// Start NPC: 1001148 +// End NPC: 1001140 + +class ManFst001Def +{ + ////////////////////////////////////////////////////////////////////// + // default ctor + def ManFst001Def() + { + // Basic quest information + this.name = "Coming to Gridania"; + this.id = 65575; + // These are the quest vars / flags used in this quest + // GetQuestUI8AL + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_FINISH = 255; + + // Quest rewards + this.RewardExpFactor = 50; + this.RewardGil = 103; + + // Entities found in the script data of the quest + // some of these may be useful + this.ACTOR0 = 1001148; + this.ACTOR1 = 1001140; + this.CUT_EVENT = 29; + this.EOBJECT0 = 2001659; + this.EOBJECT1 = 2001660; + this.EOBJECT7 = 2616477; + this.EVENT_ACTION_SEARCH = 1; + this.HOWTO_QUEST_ACCEPT = 12; + this.HOWTO_QUEST_ANNOUNCE = 2; + this.HOWTO_REWARD = 11; + this.HOWTO_TODO = 3; + this.OPENING_EVENT_HANDLER = 1245186; + this.SEQ_2_ACTOR1 = 2; + + } + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( this.id, 0, 0x2000/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // accept quest + { + ManFst001.Scene00001( player ); + } + }); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, 0xF8482EFB/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + ManFst001.Scene00002( player ); + }); + } + + def Scene00002( player ) + { + player.eventPlay( this.id, 2, NONE, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + player.questUpdate( ManFst001.id, ManFst001.SEQ_FINISH );// add quest to player. + + // this is an external event, so we do need to start it here + //player.eventStart( player.getId(), ManFst001.OPENING_EVENT_HANDLER, 7, 0, 0 ); // update the instance boundaries, call to the opening event + player.eventPlay( ManFst001.OPENING_EVENT_HANDLER, 0x1E, 0x2001, 0, 0 ); + }); + } + + def Scene00004( player ) + { + player.eventPlay( this.id, 4, 0x2c02, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + ManFst001.Scene00005( player ); + }); + } + + def Scene00005( player ) + { + player.eventPlay( this.id, 5, 0x20/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // clicked finish button + { + player.gainExp( 50 ); + player.addCurrency( 1, ManFst001.RewardGil ); + player.questFinish( ManFst001.id ); + } + }); + } + + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + + if( actor == this.ACTOR0 ) + { + this.Scene00000( player ); + } + else if( actor == this.ACTOR1 ) + { + this.Scene00004( player ); + } + + // Script content to be added here.... + } +}; + +GLOBAL ManFst001 = ManFst001Def(); + + diff --git a/bin/scripts/chai/quest/ManFst002.chai b/bin/scripts/chai/quest/ManFst002.chai new file mode 100644 index 00000000..6dda96a1 --- /dev/null +++ b/bin/scripts/chai/quest/ManFst002.chai @@ -0,0 +1,261 @@ +// Quest Script: ManFst002_00124 +// Quest Name: Close to Home +// Quest ID: 65660 +// Start NPC: 1001140 +// End NPC: 1000100 + +class ManFst002Def +{ + + ////////////////////////////////////////////////////////////////////// + // default ctor + def ManFst002Def() + { + // Basic quest information + this.name = "Close to Home"; + this.id = 65621; + + // These are the quest vars / flags used in this quest + // GetQuestBitFlag8 + // GetQuestUI8AL -- attube to Aetheryte + // GetQuestUI8BH -- visit class guild + // GetQuestUI8BL -- Listen to Parsement in the market check mark + // GetQuestUI8CH -- recieve Key item + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_1 = 1; + this.SEQ_FINISH = 255; + //this.SEQ_OFFER = ?; + + // Quest rewards + this.RewardExpFactor = 100; + this.RewardGil = 107; + + // Entities found in the script data of the quest + // some of these may be useful + this.ACTOR0 = 1001140; + this.ACTOR1 = 2; + this.ACTOR2 = 1000251; + this.ACTOR20 = 1000159; + this.ACTOR3 = 1000768; + this.ACTOR4 = 1000100; + this.BIND_ACTOR0 = 6229224; + this.HOW_TO_DESION = 13; + this.HOW_TO_MAP_AND_NAVI = 4; + this.ITEM0 = 2000074; + this.LOC_ACTOR0 = 1003159; + this.LOC_MARKER_01 = 2153091; + this.LOC_MARKER_02 = 2153104; + this.LOC_MARKER_03 = 2153111; + this.LOC_MARKER_04 = 2154539; + this.LOC_MARKER_05 = 2154540; + this.LOC_MARKER_06 = 2154541; + this.LOC_MARKER_07 = 2210446; + this.LOC_MARKER_08 = 2210454; + this.LOC_MARKER_09 = 2210461; + this.LOC_MOTION0 = 799; + this.POPRANGE0 = 2280858; + this.REWARD_DESION = 1; + this.SEQ_0_ACTOR0 = 0; + this.SEQ_0_ACTOR0_LQ = 50; + this.SEQ_1_ACTOR0 = 4; + this.SEQ_1_ACTOR1 = 1; + this.SEQ_1_ACTOR1_WAIT = 51; + this.SEQ_1_ACTOR2 = 2; + this.SEQ_1_ACTOR3 = 3; + this.SEQ_1_ACTOR3_NPCTRADENO = 99; + this.SEQ_1_ACTOR3_NPCTRADEOK = 100; + this.SEQ_2_ACTOR4 = 5; + this.TERRITORYTYPE0 = 132; + this.UNLOCK_DESION = 14; + + } + + def checkQuestCompletion( player, varIdx ) + { + + if (varIdx == 3) + { + player.questMessage(this.id, 1, 0, 0, 0 ); + } + else if (varIdx == 2) + { + player.questMessage(this.id, 2, 0, 0, 0 ); + } + else + { + player.questMessage(this.id, 0, 0, 0, 0 ); + } + + var QUEST_VAR_ATTUNE = player.getQuestUI8AL( this.id ); + var QUEST_VAR_CLASS = player.getQuestUI8BH( this.id ); + var QUEST_VAR_TRADE = player.getQuestUI8BL( this.id ); + + if ( QUEST_VAR_ATTUNE == 1 && QUEST_VAR_CLASS == 1 && QUEST_VAR_TRADE == 1 ) + { + player.questUpdate( this.id, this.SEQ_FINISH ); + } + } + + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( this.id, 0, 0x2000/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // accept quest + { + ManFst002.Scene00050( player ); + } + }); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, 0x0EFB/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + player.setQuestUI8AL( ManFst002.id, 1 ); + ManFst002.checkQuestCompletion( player, 0 ); + }); + } + + def Scene00002( player ) + { + player.eventPlay( this.id, 2, 0, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + player.setQuestUI8BH( ManFst002.id, 1 ); + ManFst002.checkQuestCompletion( player, 3 ); + }); + } + + def Scene00003( player ) + { + player.eventPlay( this.id, 3, NONE/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + if ( param2 == 1 ) + { + ManFst002.Scene00100( player ); + } + else + { + ManFst002.Scene00099( player ); + } + }); + } + + def Scene00004( player ) + { + player.eventPlay( this.id, 4, 0, 0, 0 ); + } + + def Scene00005( player ) + { + player.eventPlay( this.id, 5, FADE_OUT | CONDITION_CUTSCENE | HIDE_UI, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // finish quest + { + if( player.giveQuestRewards( ManFst002.id, 0 ) ) + { + player.questFinish( ManFst002.id ); + } + } + }); + } + + def Scene00050( player ) + { + player.eventPlay( this.id, 50, FADE_OUT | CONDITION_CUTSCENE | HIDE_UI, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + // accepting quest "close to home" + player.questUpdate( ManFst002.id, 1 ); + player.setQuestUI8CH( ManFst002.id, 1 ); // receive key item + // event is done, need to teleport to real zone. + player.setZone( 132 ); + //player.setZone(183); back to starting griania for debug purpose + }); + } + + def Scene00051( player ) + { + player.eventPlay( this.id, 51, 0, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + ManFst002.Scene00001( player ); + }); + } + + def Scene00099( player ) + { + player.eventPlay( this.id, 99, 0, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + ManFst002.Scene00004( player ); + }); + } + + def Scene00100( player ) + { + player.eventPlay( this.id, 100, 0x0EFB, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + player.setQuestUI8CH( ManFst002.id, 0 ); // remove key item, since we have just traded it + player.setQuestUI8BL( ManFst002.id, 1 ); + ManFst002.checkQuestCompletion(player, 2 ); + }); + } + + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + + if( actor == this.ACTOR0 ) + { + this.Scene00000( player ); + } + else if( actor == this.ACTOR1 ) + { + + // starting the eventaction 0x13 ( attuning ) + player.eventActionStart( 0x050002, 0x13, + fun( player, eventId, additional ) + { + player.questMessage( 0x050002, 0, 1, 0, 0 ); + player.aetheryteRegister( 2 ); + player.learnAction( 1 ); + ManFst002.Scene00051( player ); + }, + fun( player, eventId, additional ) + { + player.eventFinish( 0x050002, 0 ); + player.eventFinish( additional, 0 ); + }, + 0x050002 ); + } + else if( actor == this.ACTOR2 ) + { + this.Scene00002( player ); + } + else if( actor == this.ACTOR3 ) + { + this.Scene00003( player ); + } + else if( actor == this.ACTOR4 ) + { + this.Scene00005( player ); + } + + } + +}; + +GLOBAL ManFst002 = ManFst002Def(); + diff --git a/bin/scripts/chai/quest/ManFst003.chai b/bin/scripts/chai/quest/ManFst003.chai new file mode 100644 index 00000000..dfdde4a0 --- /dev/null +++ b/bin/scripts/chai/quest/ManFst003.chai @@ -0,0 +1,259 @@ +// This is an automatically generated chai script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, change its extension to .chai +// and move it to the correct folder in bin/scripts/chai/quest + +// Quest Script: ManFst003_00123 +// Quest Name: Close to Home +// Quest ID: 65659 +// Start NPC: 1001140 +// End NPC: 1000100 + +class ManFst003Def +{ + def ManFst003Def() + { + // Basic quest information + this.name = "Close to Home"; + this.id = 65659; + + // Quest vars / flags used + // GetQuestBitFlag8 + // GetQuestUI8AL + // GetQuestUI8BH + // GetQuestUI8BL + // GetQuestUI8CH + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_1 = 1; + this.SEQ_FINISH = 255; + + // Quest rewards + this.RewardExpFactor = 100; + this.RewardGil = 107; + + // Entities found in the script data of the quest + this.ACTOR0 = 1001140; + this.ACTOR1 = 2; + this.ACTOR2 = 1000197; + this.ACTOR20 = 1000159; + this.ACTOR3 = 1000768; + this.ACTOR4 = 1000100; + this.BIND_ACTOR0 = 6229224; + this.ITEM0 = 2000119; + this.LOC_ACTOR0 = 1003159; + this.LOC_MARKER_01 = 2153091; + this.LOC_MARKER_02 = 2153104; + this.LOC_MARKER_03 = 2153111; + this.LOC_MARKER_04 = 2154539; + this.LOC_MARKER_05 = 2154540; + this.LOC_MARKER_06 = 2154541; + this.LOC_MARKER_07 = 2210446; + this.LOC_MARKER_08 = 2210454; + this.LOC_MARKER_09 = 2210461; + this.LOC_MOTION0 = 799; + this.POPRANGE0 = 2280858; + this.REWARD_DESION = 1; + this.SEQ_0_ACTOR0 = 0; + this.SEQ_0_ACTOR0_LQ = 50; + this.SEQ_1_ACTOR0 = 4; + this.SEQ_1_ACTOR1 = 1; + this.SEQ_1_ACTOR1_WAIT = 51; + this.SEQ_1_ACTOR2 = 2; + this.SEQ_1_ACTOR3 = 3; + this.SEQ_1_ACTOR3_NPCTRADENO = 99; + this.SEQ_1_ACTOR3_NPCTRADEOK = 100; + this.SEQ_2_ACTOR4 = 5; + this.TERRITORYTYPE0 = 132; + this.UNLOCK_DESION = 14; + + } + + def checkQuestCompletion( player, varIdx ) + { + + print( varIdx ); + if (varIdx == 3) + { + player.questMessage(this.id, 1, 0, 0, 0 ); + } + else if (varIdx == 2) + { + player.questMessage(this.id, 2, 0, 0, 0 ); + } + else + { + player.questMessage(this.id, 0, 0, 0, 0 ); + } + + var QUEST_VAR_ATTUNE = player.getQuestUI8AL( this.id ); + var QUEST_VAR_CLASS = player.getQuestUI8BH( this.id ); + var QUEST_VAR_TRADE = player.getQuestUI8BL( this.id ); + + if ( QUEST_VAR_ATTUNE == 1 && QUEST_VAR_CLASS == 1 && QUEST_VAR_TRADE == 1 ) + { + player.questUpdate( this.id, this.SEQ_FINISH ); + } + } + + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( this.id, 0, 0x2000/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // accept quest + { + ManFst003.Scene00050( player ); + } + }); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, 0x0EFB/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + player.setQuestUI8AL( ManFst004.id, 1 ); + ManFst003.checkQuestCompletion( player, 1 ); + }); + } + + def Scene00002( player ) + { + player.eventPlay( this.id, 2, 0, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + player.setQuestUI8BH( ManFst004.id, 1 ); + ManFst003.checkQuestCompletion( player, 3 ); + }); + } + + def Scene00003( player ) + { + player.eventPlay( this.id, 3, NONE/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + if ( param2 == 1 ) + { + ManFst003.Scene00100( player ); + } + else + { + ManFst003.Scene00099( player ); + } + }); + } + + def Scene00004( player ) + { + player.eventPlay( this.id, 4, 0, 0, 0 ); + } + + def Scene00005( player ) + { + player.eventPlay( this.id, 5, FADE_OUT | CONDITION_CUTSCENE | HIDE_UI, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // finish quest + { + if( player.giveQuestRewards( ManFst003.id, 0 ) ) + { + player.questFinish( ManFst003.id ); + } + } + + }); + } + + def Scene00050( player ) + { + player.eventPlay( this.id, 50, FADE_OUT | CONDITION_CUTSCENE | HIDE_UI, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + // accepting quest "close to home" + player.questUpdate( ManFst003.id, 1 ); + player.setQuestUI8CH( ManFst003.id, 1 ); // receive key item + // event is done, need to teleport to real zone. + player.setZone( 132 ); + //player.setZone(183); back to starting griania for debug purpose + }); + } + + def Scene00051( player ) + { + player.eventPlay( this.id, 51, 0, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + ManFst003.Scene00001( player ); + }); + } + + def Scene00099( player ) + { + player.eventPlay( this.id, 99, 0, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + ManFst003.Scene00004( player ); + }); + } + + def Scene00100( player ) + { + player.eventPlay( this.id, 100, 0x0EFB, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + player.setQuestUI8CH( ManFst004.id, 0 ); // remove key item, since we have just traded it + player.setQuestUI8BL( ManFst004.id, 1 ); + ManFst003.checkQuestCompletion(player, 2 ); + }); + } + + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + + if( actor == this.ACTOR0 ) + { + this.Scene00000( player ); + } + else if( actor == this.ACTOR1 ) + { + // starting the Aetheryte eventaction + // player.eventStart( actorId, 0x050002, 7, 0, 0); + // starting the eventaction 0x13 ( attuning ) + player.eventActionStart( 0x050002, 0x13, + fun( player, eventId, additional ) + { + + player.questMessage( 0x050002, 0, 1, 0, 0 ); + player.aetheryteRegister( 2 ); + player.learnAction( 1 ); + ManFst003.Scene00051( player ); + }, + fun( player, eventId, additional ) {}, + eventId ); + } + else if( actor == this.ACTOR2 ) + { + this.Scene00002( player ); + } + else if( actor == this.ACTOR3 ) + { + this.Scene00003( player ); + } + else if( actor == this.ACTOR4 ) + { + this.Scene00005( player ); + } + + } + +}; + +GLOBAL ManFst003 = ManFst003Def(); + diff --git a/bin/scripts/chai/quest/ManFst003.chai_generated b/bin/scripts/chai/quest/ManFst003.chai_generated new file mode 100644 index 00000000..e893e598 --- /dev/null +++ b/bin/scripts/chai/quest/ManFst003.chai_generated @@ -0,0 +1,246 @@ +// This is an automatically generated chai script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, change its extension to .chai + + +// Quest Script: ManFst003_00123 +// Quest Name: Close to Home +// Quest ID: 65659 +// Start NPC: 1001140 +// End NPC: 1000100 + +class ManFst003 +{ + var name; + var id; + var SEQ_0; + var SEQ_1; + var SEQ_FINISH; + var SEQ_OFFER; + var RewardExpFactor; + var RewardGil; + var ACTOR0; + var SEQ_0_ACTOR0; + var ITEM0; + var ACTOR1; + var SEQ_1_ACTOR1; + var ACTOR2; + var SEQ_1_ACTOR2; + var ACTOR3; + var SEQ_1_ACTOR3; + var SEQ_1_ACTOR3_NPCTRADEOK; + var SEQ_1_ACTOR3_NPCTRADENO; + var SEQ_1_ACTOR0; + var ACTOR4; + var SEQ_2_ACTOR4; + var TERRITORYTYPE0; + var POPRANGE0; + var LOC_MARKER_01; + var LOC_MARKER_02; + var LOC_MARKER_03; + var LOC_MARKER_04; + var LOC_MARKER_05; + var LOC_MARKER_06; + var LOC_MARKER_07; + var LOC_MARKER_08; + var LOC_MARKER_09; + var SEQ_0_ACTOR0_LQ; + var UNLOCK_DESION; + var REWARD_DESION; + var HOW_TO_MAP_AND_NAVI; + var HOW_TO_DESION; + var ACTOR20; + var SEQ_1_ACTOR1_WAIT; + var LOC_ACTOR0; + var BIND_ACTOR0; + var LOC_MOTION0; + + ////////////////////////////////////////////////////////////////////// + // default ctor + def ManFst003() + { + // Basic quest information + this.name = "Close to Home"; + this.id = 65659; + // These are the quest vars / flags used in this quest + // GetQuestBitFlag8 + // GetQuestUI8AL + // GetQuestUI8BH + // GetQuestUI8BL + // GetQuestUI8CH + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_1 = 1; + this.SEQ_FINISH = 255; + //this.SEQ_OFFER = ?; + + // Quest rewards + this.RewardExpFactor = 100; + this.RewardGil = 107; + + // Entities found in the script data of the quest + // some of these may be useful + this.ACTOR0 = 1001140; + this.ACTOR1 = 2; + this.ACTOR2 = 1000197; + this.ACTOR20 = 1000159; + this.ACTOR3 = 1000768; + this.ACTOR4 = 1000100; + this.BIND_ACTOR0 = 6229224; + this.HOW_TO_DESION = 13; + this.HOW_TO_MAP_AND_NAVI = 4; + this.ITEM0 = 2000119; + this.LOC_ACTOR0 = 1003159; + this.LOC_MARKER_01 = 2153091; + this.LOC_MARKER_02 = 2153104; + this.LOC_MARKER_03 = 2153111; + this.LOC_MARKER_04 = 2154539; + this.LOC_MARKER_05 = 2154540; + this.LOC_MARKER_06 = 2154541; + this.LOC_MARKER_07 = 2210446; + this.LOC_MARKER_08 = 2210454; + this.LOC_MARKER_09 = 2210461; + this.LOC_MOTION0 = 799; + this.POPRANGE0 = 2280858; + this.REWARD_DESION = 1; + this.SEQ_0_ACTOR0 = 0; + this.SEQ_0_ACTOR0_LQ = 50; + this.SEQ_1_ACTOR0 = 4; + this.SEQ_1_ACTOR1 = 1; + this.SEQ_1_ACTOR1_WAIT = 51; + this.SEQ_1_ACTOR2 = 2; + this.SEQ_1_ACTOR3 = 3; + this.SEQ_1_ACTOR3_NPCTRADENO = 99; + this.SEQ_1_ACTOR3_NPCTRADEOK = 100; + this.SEQ_2_ACTOR4 = 5; + this.TERRITORYTYPE0 = 132; + this.UNLOCK_DESION = 14; + + } + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player, eventId ) + { + player.eventPlay( eventId, 0, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest = ManFst003(); + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00001( player, eventId ) + { + player.eventPlay( eventId, 1, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest = ManFst003(); + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00002( player, eventId ) + { + player.eventPlay( eventId, 2, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest = ManFst003(); + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00003( player, eventId ) + { + player.eventPlay( eventId, 3, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest = ManFst003(); + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00004( player, eventId ) + { + player.eventPlay( eventId, 4, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest = ManFst003(); + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00005( player, eventId ) + { + player.eventPlay( eventId, 5, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest = ManFst003(); + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00050( player, eventId ) + { + player.eventPlay( eventId, 50, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest = ManFst003(); + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00051( player, eventId ) + { + player.eventPlay( eventId, 51, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest = ManFst003(); + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00099( player, eventId ) + { + player.eventPlay( eventId, 99, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest = ManFst003(); + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00100( player, eventId ) + { + player.eventPlay( eventId, 100, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest = ManFst003(); + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + +}; + +////////////////////////////////////////////////////////////////////// +// Entry function for this quest +def ManFst003_START(player, actorId, eventId) +{ + var quest = ManFst003(); + var actor = mapActor( actorId ); + + // Script content to be added here.... +} + diff --git a/bin/scripts/chai/quest/ManFst004.chai b/bin/scripts/chai/quest/ManFst004.chai new file mode 100644 index 00000000..a36effde --- /dev/null +++ b/bin/scripts/chai/quest/ManFst004.chai @@ -0,0 +1,258 @@ +// Quest Script: ManFst004_00124 +// Quest Name: Close to Home +// Quest ID: 65660 +// Start NPC: 1001140 +// End NPC: 1000100 + +class ManFst004Def +{ + + ////////////////////////////////////////////////////////////////////// + // default ctor + def ManFst004Def() + { + // Basic quest information + this.name = "Close to Home"; + this.id = 65660; + + // These are the quest vars / flags used in this quest + // GetQuestBitFlag8 + // GetQuestUI8AL -- attube to Aetheryte + // GetQuestUI8BH -- visit class guild + // GetQuestUI8BL -- Listen to Parsement in the market check mark + // GetQuestUI8CH -- recieve Key item + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_1 = 1; + this.SEQ_FINISH = 255; + //this.SEQ_OFFER = ?; + + // Quest rewards + this.RewardExpFactor = 100; + this.RewardGil = 107; + + // Entities found in the script data of the quest + // some of these may be useful + this.ACTOR0 = 1001140; + this.ACTOR1 = 2; + this.ACTOR2 = 1000323; + this.ACTOR20 = 1000159; + this.ACTOR3 = 1000768; + this.ACTOR4 = 1000100; + this.BIND_ACTOR0 = 6229224; + this.ITEM0 = 2000120; + this.LOC_ACTOR0 = 1003159; + this.LOC_MARKER_01 = 2153091; + this.LOC_MARKER_02 = 2153104; + this.LOC_MARKER_03 = 2153111; + this.LOC_MARKER_04 = 2154539; + this.LOC_MARKER_05 = 2154540; + this.LOC_MARKER_06 = 2154541; + this.LOC_MARKER_07 = 2210446; + this.LOC_MARKER_08 = 2210454; + this.LOC_MARKER_09 = 2210461; + this.LOC_MOTION0 = 799; + this.POPRANGE0 = 2280858; + this.REWARD_DESION = 1; + this.SEQ_0_ACTOR0 = 0; + this.SEQ_0_ACTOR0_LQ = 50; + this.SEQ_1_ACTOR0 = 4; + this.SEQ_1_ACTOR1 = 1; + this.SEQ_1_ACTOR1_WAIT = 51; + this.SEQ_1_ACTOR2 = 2; + this.SEQ_1_ACTOR3 = 3; + this.SEQ_1_ACTOR3_NPCTRADENO = 99; + this.SEQ_1_ACTOR3_NPCTRADEOK = 100; + this.SEQ_2_ACTOR4 = 5; + this.TERRITORYTYPE0 = 132; + this.UNLOCK_DESION = 14; + + } + + def checkQuestCompletion( player, varIdx ) + { + + if (varIdx == 3) + { + player.questMessage(this.id, 1, 0, 0, 0 ); + } + else if (varIdx == 2) + { + player.questMessage(this.id, 2, 0, 0, 0 ); + } + else + { + player.questMessage(this.id, 0, 0, 0, 0 ); + } + + var QUEST_VAR_ATTUNE = player.getQuestUI8AL( this.id ); + var QUEST_VAR_CLASS = player.getQuestUI8BH( this.id ); + var QUEST_VAR_TRADE = player.getQuestUI8BL( this.id ); + + if ( QUEST_VAR_ATTUNE == 1 && QUEST_VAR_CLASS == 1 && QUEST_VAR_TRADE == 1 ) + { + player.questUpdate( this.id, this.SEQ_FINISH ); + } + } + + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( this.id, 0, 0x2000/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // accept quest + { + ManFst004.Scene00050( player ); + } + }); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, 0x0EFB/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + player.setQuestUI8AL( ManFst004.id, 1 ); + ManFst004.checkQuestCompletion( player, 0 ); + }); + } + + def Scene00002( player ) + { + player.eventPlay( this.id, 2, 0, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + player.setQuestUI8BH( ManFst004.id, 1 ); + ManFst004.checkQuestCompletion( player, 3 ); + }); + } + + def Scene00003( player ) + { + player.eventPlay( this.id, 3, NONE/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + if ( param2 == 1 ) + { + ManFst004.Scene00100( player ); + } + else + { + ManFst004.Scene00099( player ); + } + }); + } + + def Scene00004( player ) + { + player.eventPlay( this.id, 4, 0, 0, 0 ); + } + + def Scene00005( player ) + { + player.eventPlay( this.id, 5, FADE_OUT | CONDITION_CUTSCENE | HIDE_UI, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // finish quest + { + if( player.giveQuestRewards( ManFst004.id, 0 ) ) + { + player.questFinish( ManFst004.id ); + } + } + + }); + } + + def Scene00050( player ) + { + player.eventPlay( this.id, 50, FADE_OUT | CONDITION_CUTSCENE | HIDE_UI, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + // accepting quest "close to home" + player.questUpdate( ManFst004.id, 1 ); + player.setQuestUI8CH( ManFst004.id, 1 ); // receive key item + // event is done, need to teleport to real zone. + player.setZone( 132 ); + //player.setZone(183); back to starting griania for debug purpose + }); + } + + def Scene00051( player ) + { + player.eventPlay( this.id, 51, 0, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + ManFst004.Scene00001( player ); + }); + } + + def Scene00099( player ) + { + player.eventPlay( this.id, 99, 0, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + ManFst004.Scene00004( player ); + }); + } + + def Scene00100( player ) + { + player.eventPlay( this.id, 100, 0x0EFB, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + player.setQuestUI8CH( ManFst004.id, 0 ); // remove key item, since we have just traded it + player.setQuestUI8BL( ManFst004.id, 1 ); + ManFst004.checkQuestCompletion(player, 2 ); + }); + } + + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + + if( actor == this.ACTOR0 ) + { + this.Scene00000( player ); + } + else if( actor == this.ACTOR1 ) + { + // starting the Aetheryte eventaction + // player.eventStart( actorId, 0x050002, 7, 0, 0); + // starting the eventaction 0x13 ( attuning ) + player.eventActionStart( 0x050002, 0x13, + fun( player, eventId, additional ) + { + + player.questMessage( 0x050002, 0, 1, 0, 0 ); + player.aetheryteRegister( 2 ); + player.learnAction( 1 ); + ManFst004.Scene00051( player ); + }, + fun( player, eventId, additional ) {}, + eventId ); + } + else if( actor == this.ACTOR2 ) + { + this.Scene00002( player ); + } + else if( actor == this.ACTOR3 ) + { + this.Scene00003( player ); + } + else if( actor == this.ACTOR4 ) + { + this.Scene00005( player ); + } + + } + +}; + +GLOBAL ManFst004 = ManFst004Def(); + diff --git a/bin/scripts/chai/quest/ManSea001.chai b/bin/scripts/chai/quest/ManSea001.chai new file mode 100644 index 00000000..75f742d9 --- /dev/null +++ b/bin/scripts/chai/quest/ManSea001.chai @@ -0,0 +1,201 @@ +// This is an automatically generated chai script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, change its extension to .chai +// and move it to the correct folder in bin/scripts/chai/quest + +// Quest Script: ManSea001_00107 +// Quest Name: Coming to Limsa Lominsa +// Quest ID: 65643 +// Start NPC: 1001028 +// End NPC: 1002697 + +class ManSea001Def +{ + def ManSea001Def() + { + // Basic quest information + this.name = "Coming to Limsa Lominsa"; + this.id = 65643; + + // Quest vars / flags used + // GetQuestBitFlag8 + // GetQuestUI8AL + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_1 = 1; + this.SEQ_FINISH = 255; + + // Quest rewards + this.RewardExpFactor = 50; + this.RewardGil = 103; + + // Entities found in the script data of the quest + this.ACTOR0 = 1001028; + this.ACTOR1 = 1002732; + this.ACTOR2 = 1002697; + this.CUT_EVENT = 202; + this.EOBJECT0 = 2001679; + this.EOBJECT1 = 2001680; + this.EVENT_ACTION_SEARCH = 1; + this.LOC_ACTOR0 = 1002732; + this.LOC_POS_ACTOR0 = 4107186; + this.OPENING_EVENT_HANDLER = 1245185; + this.POPRANGE0 = 4127803; + this.TERRITORYTYPE0 = 181; + + } + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( this.id, 0, HIDE_HOTBAR, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) + { + ManSea001.Scene00001( player ); + } + }); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, HIDE_HOTBAR, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + ManSea001.Scene00002( player ); + }); + } + + def Scene00002( player ) + { + player.eventPlay( this.id, 2, HIDE_HOTBAR, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + ManSea001.Scene00003( player ); + }); + } + + def Scene00003( player ) + { + player.eventPlay( this.id, 3, NONE, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + player.questUpdate( ManSea001.id, 0x01 ); // add quest to player. + + // update the instance boundaries, call to the opening event + //player.eventPlay( ManSea001.OPENING_EVENT_HANDLER, 0x1E, HIDE_HOTBAR, 1, 0); + }); + } + + def Scene00004( player ) + { + player.eventPlay( this.id, 4, NONE, 0, 0 ); + } + + def Scene00005( player ) + { + player.eventPlay( this.id, 5, HIDE_HOTBAR, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + ManSea001.Scene00006( player ); + }); + } + + def Scene00006( player ) + { + player.eventPlay( this.id, 6, NONE, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) + { + player.questUpdate( ManSea001.id, ManSea001.SEQ_FINISH ); + player.prepareZoning( player.getZoneId(), true ); + player.changePos( 9, 40, 14, 2 ); + } + }); + } + + def Scene00007( player ) + { + player.eventPlay( this.id, 7, NONE, 0, 0 ); + } + + def Scene00008( player ) + { + player.eventPlay( this.id, 8, NONE, 0, 0 ); + } + + def Scene00009( player ) + { + player.eventPlay( this.id, 9, NONE, 0, 0 ); + } + + def Scene00010( player ) + { + player.eventPlay( this.id, 10, NONE, 0, 0 ); + } + + def Scene00011( player ) + { + player.eventPlay( this.id, 11, NONE, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + ManSea001.Scene00012( player ); + }); + } + + def Scene00012( player ) + { + player.eventPlay( this.id, 12, NONE, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) + { + if( player.giveQuestRewards( ManSea001.id, 0 ) ) + { + player.questFinish( ManSea001.id ); + } + } + }); + } + + def Scene00013( player ) + { + player.eventPlay( this.id, 13, NONE, 0, 0 ); + } + + ////////////////////////////////////////////////////////////////////// + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + switch( actor ) + { + case( this.ACTOR0 ) + { + this.Scene00000( player ); + break; + } + case( this.ACTOR1 ) + { + this.Scene00005( player ); + break; + } + case( this.ACTOR2 ) + { + this.Scene00011( player ); + break; + } + default + { + + } + } + } + +}; + +GLOBAL ManSea001 = ManSea001Def(); diff --git a/bin/scripts/chai/quest/ManWil001.chai b/bin/scripts/chai/quest/ManWil001.chai new file mode 100644 index 00000000..1799e45a --- /dev/null +++ b/bin/scripts/chai/quest/ManWil001.chai @@ -0,0 +1,167 @@ +// This is an automatically generated chai script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, change its extension to .chai +// and move it to the correct folder in bin/scripts/chai/quest + +// Quest Script: ManWil001_00594 +// Quest Name: Coming to Ul'dah +// Quest ID: 66130 +// Start NPC: 1003987 +// End NPC: 1003988 + +class ManWil001Def +{ + ////////////////////////////////////////////////////////////////////// + // default ctor + def ManWil001Def() + { + // Basic quest information + this.name = "Coming to Ul'dah"; + this.id = 66130; + + // Quest vars / flags used + // GetQuestUI8AL + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_FINISH = 255; + + // Quest rewards + this.RewardExpFactor = 50; + this.RewardGil = 103; + + // Entities found in the script data of the quest + this.ACTOR0 = 1003987; + this.ACTOR1 = 1003988; + this.ACTOR20 = 1001285; + this.CUT_EVENT = 188; + this.EOBJECT0 = 2001681; + this.EOBJECT1 = 2001682; + this.EOBJECT2 = 2001683; + this.EOBJECT3 = 2001706; + this.EVENT_ACTION_SEARCH = 1; + this.OPENING_EVENT_HANDLER = 1245187; + + } + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( this.id, 0, 0, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // accept quest + { + ManWil001.Scene00001( player ); + } + }); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, 0, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + ManWil001.Scene00002( player ); + }); + } + + def Scene00002( player ) + { + player.eventPlay( this.id, 2, 0, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + player.questUpdate( ManWil001.id, ManWil001Obj.SEQ_FINISH );// add quest to player. + player.eventPlay( ManWil001.OPENING_EVENT_HANDLER, 0x1E, 0x2001, 0, 0 ); + }); + } + + def Scene00003( player ) + { + player.eventPlay( this.id, 3, 0, 0, 0 ); + } + + def Scene00004( player ) + { + player.eventPlay( this.id, 4, 0, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + ManWil001.Scene00005( player ); + }); + } + + def Scene00005( player ) + { + player.eventPlay( this.id, 5, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // clicked finish button + { + player.gainExp( 50 ); + player.addCurrency( 1, ManWil001.RewardGil ); + player.questFinish( ManWil001.id ); + } + }); + } + + def Scene00006( player ) + { + player.eventPlay( this.id, 6, 0, 0, 0 ); + } + + def Scene00007( player ) + { + player.eventPlay( this.id, 7, 0, 0, 0 ); + } + + def Scene00008( player ) + { + player.eventPlay( this.id, 8, 0, 0, 0 ); + } + + def Scene00009( player ) + { + player.eventPlay( this.id, 9, 0, 0, 0 ); + } + + def Scene00010( player ) + { + player.eventPlay( this.id, 10, 0, 0, 0 ); + } + + def Scene00011( player ) + { + player.eventPlay( this.id, 11, 0, 0, 0 ); + } + + def Scene00012( player ) + { + player.eventPlay( this.id, 12, 0, 0, 0 ); + } + + def Scene00013( player ) + { + player.eventPlay( this.id, 13, 0, 0, 0 ); + } + + ////////////////////////////////////////////////////////////////////// + // Entry function for this quest + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + + if( actor == this.ACTOR0 ) + { + this.Scene00000( player ); + } + else if( actor == this.ACTOR1 ) + { + this.Scene00004( player ); + } + } + +}; + +GLOBAL ManWil001 = ManWil001Def(); diff --git a/bin/scripts/chai/quest/ManWil001.chai_generated b/bin/scripts/chai/quest/ManWil001.chai_generated new file mode 100644 index 00000000..2c101bd5 --- /dev/null +++ b/bin/scripts/chai/quest/ManWil001.chai_generated @@ -0,0 +1,214 @@ +// This is an automatically generated chai script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, change its extension to .chai +// and move it to the correct folder in bin/scripts/chai/quest + +// Quest Script: ManWil001_00594 +// Quest Name: Coming to Ul'dah +// Quest ID: 66130 +// Start NPC: 1003987 +// End NPC: 1003988 + +class ManWil001 +{ + ////////////////////////////////////////////////////////////////////// + // default ctor + def ManWil001() + { + // Basic quest information + this.name = "Coming to Ul'dah"; + this.id = 66130; + + // Quest vars / flags used + // GetQuestUI8AL + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_FINISH = 255; + + // Quest rewards + this.RewardExpFactor = 50; + this.RewardGil = 103; + + // Entities found in the script data of the quest + this.ACTOR0 = 1003987; + this.ACTOR1 = 1003988; + this.ACTOR20 = 1001285; + this.CUT_EVENT = 188; + this.EOBJECT0 = 2001681; + this.EOBJECT1 = 2001682; + this.EOBJECT2 = 2001683; + this.EOBJECT3 = 2001706; + this.EVENT_ACTION_SEARCH = 1; + this.OPENING_EVENT_HANDLER = 1245187; + + } + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( this.id, 0, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest := ManWil001Obj; + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest := ManWil001Obj; + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00002( player ) + { + player.eventPlay( this.id, 2, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest := ManWil001Obj; + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00003( player ) + { + player.eventPlay( this.id, 3, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest := ManWil001Obj; + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00004( player ) + { + player.eventPlay( this.id, 4, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest := ManWil001Obj; + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00005( player ) + { + player.eventPlay( this.id, 5, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest := ManWil001Obj; + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00006( player ) + { + player.eventPlay( this.id, 6, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest := ManWil001Obj; + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00007( player ) + { + player.eventPlay( this.id, 7, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest := ManWil001Obj; + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00008( player ) + { + player.eventPlay( this.id, 8, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest := ManWil001Obj; + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00009( player ) + { + player.eventPlay( this.id, 9, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest := ManWil001Obj; + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00010( player ) + { + player.eventPlay( this.id, 10, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest := ManWil001Obj; + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00011( player ) + { + player.eventPlay( this.id, 11, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest := ManWil001Obj; + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00012( player ) + { + player.eventPlay( this.id, 12, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest := ManWil001Obj; + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + def Scene00013( player ) + { + player.eventPlay( this.id, 13, 0/*flags*/, 0/*unk*/, 0/*unk*/, + fun( player, eventId, subEvent, param1, param2, param3 ) + { + var quest := ManWil001Obj; + // Callback area for this scene, called when the scene finishes + // Add logic here!!! + }); + } + + ////////////////////////////////////////////////////////////////////// + // Entry function for this quest + def eventHandlerNpc( player, actorId, eventId ) + { + var actor = mapActor( actorId ); + // Script content to be added here.... + } + +}; + +GLOBAL ManWil001Obj = ManWil001(); diff --git a/bin/scripts/chai/quest/SubFst000.chai b/bin/scripts/chai/quest/SubFst000.chai new file mode 100644 index 00000000..07f42a89 --- /dev/null +++ b/bin/scripts/chai/quest/SubFst000.chai @@ -0,0 +1,176 @@ +// This is an automatically generated chai script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, change its extension to .chai +// and move it to the correct folder in bin/scripts/chai/quest + +// Quest Script: SubFst000_00020 +// Quest Name: Incense and Sensibility +// Quest ID: 65556 +// Start NPC: 1000786 +// End NPC: 1000705 + +class SubFst000Def +{ + def SubFst000Def() + { + // Basic quest information + this.name = "Incense and Sensibility"; + this.id = 65556; + + // Quest vars / flags used + // GetQuestBitFlag8 + // GetQuestUI8AL + // GetQuestUI8BH + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_1 = 1; + this.SEQ_2 = 2; + this.SEQ_FINISH = 255; + + // Quest rewards + this.RewardExpFactor = 50; + this.RewardItemOptional = [4551, 4555]; + this.RewardItemOptionalCount = [3, 3]; + + // Entities found in the script data of the quest + this.ACTOR0 = 1000786; + this.ACTOR1 = 1000705; + this.EOBJECT0 = 2000070; + this.EOBJECT1 = 2000071; + this.ITEM0 = 2000101; + this.SEQ_0_ACTOR0 = 0; + this.SEQ_1_ACTOR1 = 1; + this.SEQ_2_EOBJECT0 = 2; + this.SEQ_2_EOBJECT0_USEITEMNO = 99; + this.SEQ_2_EOBJECT0_USEITEMOK = 100; + this.SEQ_2_EOBJECT1 = 3; + this.SEQ_2_EOBJECT1_USEITEMNO = 97; + this.SEQ_2_EOBJECT1_USEITEMOK = 98; + this.SEQ_3_ACTOR1 = 4; + + } + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( this.id, 0, NONE, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) + { + player.questUpdate( SubFst000.id, 1 ); + } + }); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, NONE, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + player.setQuestUI8BH( SubFst000.id, 2 ); + player.questUpdate( SubFst000.id, SubFst000.SEQ_2 );// add quest to player. + }); + } + + def Scene00002( player ) + { + player.eventPlay( this.id, 2, NONE, 0, 0 ); + } + + def Scene00003( player ) + { + player.eventPlay( this.id, 3, NONE, 0, 0 ); + } + + def Scene00004( player ) + { + player.eventPlay( this.id, 4, NONE, 0, 0 ); + } + + def Scene00097( player ) + { + player.eventPlay( this.id, 97, NONE, 0, 0 ); + } + + def Scene00098( player ) + { + player.eventPlay( this.id, 98, NONE, 0, 0 ); + } + + def Scene00099( player ) + { + player.eventPlay( this.id, 99, NONE, 0, 0 ); + } + + def Scene00100( player ) + { + player.eventPlay( this.id, 100, NONE, 0, 0 ); + } + + ////////////////////////////////////////////////////////////////////// + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + + switch( actor ) + { + case( this.ACTOR0 ) + { + this.Scene00000( player ); + break; + } + case( this.ACTOR1 ) + { + this.Scene00001( player ); + break; + } + default + { + } + } + } + + def onEventItem( eventId, player, eventItemId, castTime, targetId ) + { + if( eventItemId == this.ITEM0 ) + { + player.eventItemActionStart( this.id, eventItemId, + // callback function for finished action + fun ( player, eventId, additional ) + { + var actor = mapActor( additional ); + + var censers = player.getQuestUI8AL( eventId ); + + player.questMessage( eventId, 1, 2, censers + 1, 2 ); + + if ( censers == 2 ) + { + player.questUpdate( eventId, SubFst000.SEQ_FINISH ); + } + else if( actor == SubFst000.EOBJECT0 ) + { + player.setQuestUI8AL(eventId, 4 ); + } + else if( actor == SubFst000.EOBJECT1 ) + { + player.setQuestUI8AL(eventId, 8 ); + } + SubFst000.Scene00100( player ); + + player.setQuestUI8AL( eventId, 0, censers + 1 ); + + }, + // callback for interrupted action. + fun ( player, eventId, additional ) {}, + targetId ); + } + } + +}; + +GLOBAL SubFst000 = SubFst000Def(); diff --git a/bin/scripts/chai/quest/SubFst001.chai b/bin/scripts/chai/quest/SubFst001.chai new file mode 100644 index 00000000..b75364d6 --- /dev/null +++ b/bin/scripts/chai/quest/SubFst001.chai @@ -0,0 +1,125 @@ +// This is an automatically generated chai script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, change its extension to .chai +// and move it to the correct folder in bin/scripts/chai/quest + +// Quest Script: SubFst001_00024 +// Quest Name: Coarse Correspondence +// Quest ID: 65560 +// Start NPC: 1000206 +// End NPC: 1000233 + +class SubFst001Def +{ + def SubFst001Def() + { + // Basic quest information + this.name = "Coarse Correspondence"; + this.id = 65560; + + // Quest vars / flags used + // GetQuestUI8AL + // GetQuestUI8BH + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_FINISH = 255; + + // Quest rewards + this.RewardExpFactor = 50; + this.RewardGil = 103; + + // Entities found in the script data of the quest + this.ACTOR0 = 1000206; + this.ACTOR1 = 1000233; + this.ITEM0 = 2000079; + this.SEQ_0_ACTOR0 = 0; + this.SEQ_1_ACTOR1 = 1; + this.SEQ_1_ACTOR1_NPCTRADENO = 99; + this.SEQ_1_ACTOR1_NPCTRADEOK = 100; + + } + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( SubFst001.id, 0, NONE, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) + { + player.setQuestUI8AL( SubFst001.id, 1 ); + player.setQuestUI8BH( SubFst001.id, 1 ); + player.questUpdate( SubFst001.id, SubFst001.SEQ_FINISH ); + } + } ); + } + + def Scene00001( player ) + { + player.eventPlay( SubFst001.id, 1, NONE, + fun( player, eventId, param1, param2, param3 ) + { + } ); + } + + def Scene00099( player ) + { + player.eventPlay( SubFst001.id, 99, NONE, + fun( player, eventId, param1, param2, param3 ) + { + + } ); + } + + def Scene00100( player ) + { + player.eventPlay( SubFst001.id, 100, NONE, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) + { + if( player.giveQuestRewards( SubFst001.id, 0 ) ) + { + player.questFinish( SubFst001.id ); + } + } + } ); + } + + ////////////////////////////////////////////////////////////////////// + // Event Handlers + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + + if( actor == SubFst001.ACTOR0 ) + { + if( !player.hasQuest( SubFst001.id ) ) + { + SubFst001.Scene00000( player ); + } + else + { + SubFst001.Scene00001( player ); + } + } + else if( actor == SubFst001.ACTOR1 ) + { + if( !player.hasQuest( SubFst001.id ) ) + { + // todo: what should this event do? + SubFst001.Scene00099( player ); + } + else + { + SubFst001.Scene00100( player ); + } + } + } + +}; + +GLOBAL SubFst001 = SubFst001Def(); diff --git a/bin/scripts/chai/quest/SubFst002.chai b/bin/scripts/chai/quest/SubFst002.chai new file mode 100644 index 00000000..ec14cda4 --- /dev/null +++ b/bin/scripts/chai/quest/SubFst002.chai @@ -0,0 +1,107 @@ +// This is an automatically generated chai script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, change its extension to .chai +// and move it to the correct folder in bin/scripts/chai/quest + +// Quest Script: SubFst002_00025 +// Quest Name: Quarrels with Squirrels +// Quest ID: 65561 +// Start NPC: 1000263 +// End NPC: 1000263 + +class SubFst002Def +{ + def SubFst002Def() + { + // Basic quest information + this.name = "Quarrels with Squirrels"; + this.id = 65561; + + // Quest vars / flags used + // GetQuestUI8AL + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_1 = 1; + this.SEQ_FINISH = 255; + + // Quest rewards + this.RewardExpFactor = 100; + this.RewardItemOptional = [3762, 3764, 5823]; + this.RewardItemOptionalCount = [1, 1, 3]; + + // Entities found in the script data of the quest + this.ACTOR0 = 1000263; + this.ENEMY0 = 37; + this.SEQ_0_ACTOR0 = 0; + this.SEQ_2_ACTOR0 = 1; + + } + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( this.id, 0, NONE, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // accept quest + { + player.questUpdate( SubFst002.id, SubFst002.SEQ_1 ); + } + } ); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, NONE, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // finish quest + { + if( player.giveQuestRewards( SubFst002.id, 0 ) ) + { + player.questFinish( SubFst002.id ); + } + } + } ); + } + + ////////////////////////////////////////////////////////////////////// + // Event Handlers + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + + if( !player.hasQuest( SubFst002.id ) ) + { + SubFst002.Scene00000( player ); + } + + if( actor == SubFst002.ACTOR0 && player.questGetSeq( SubFst002.id ) == SubFst002.SEQ_FINISH ) + { + SubFst002.Scene00001( player ); + } + } + + def onBnpcKill_37( player ) + { + var currentKC = player.getQuestUI8AL(SubFst002.id); + currentKC = currentKC + 1; + + player.questMessage( SubFst002.id, 0, 2, currentKC, 6 ); + + if( currentKC >= 6 ) + { + player.questUpdate( SubFst002.id, SubFst002.SEQ_FINISH ); + } + else + { + player.setQuestUI8AL( SubFst002.id, currentKC ); + } + } + +}; + +GLOBAL SubFst002 = SubFst002Def(); diff --git a/bin/scripts/chai/quest/SubFst003.chai b/bin/scripts/chai/quest/SubFst003.chai new file mode 100644 index 00000000..88a133c5 --- /dev/null +++ b/bin/scripts/chai/quest/SubFst003.chai @@ -0,0 +1,114 @@ +// This is an automatically generated chai script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, change its extension to .chai +// and move it to the correct folder in bin/scripts/chai/quest + +// Quest Script: SubFst003_00026 +// Quest Name: Once Bitten, Twice Shy +// Quest ID: 65562 +// Start NPC: 1000297 +// End NPC: 1000315 + +class SubFst003Def +{ + def SubFst003Def() + { + // Basic quest information + this.name = "Once Bitten, Twice Shy"; + this.id = 65562; + + // Quest vars / flags used + // GetQuestUI8AL + // GetQuestUI8BH + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_FINISH = 255; + + // Quest rewards + this.RewardExpFactor = 50; + this.RewardGil = 118; + + // Entities found in the script data of the quest + this.ACTOR0 = 1000297; + this.ACTOR1 = 1000315; + this.ITEM0 = 2000028; + this.SEQ_0_ACTOR0 = 0; + this.SEQ_1_ACTOR1 = 1; + this.SEQ_1_ACTOR1_NPCTRADENO = 99; + this.SEQ_1_ACTOR1_NPCTRADEOK = 100; + + } + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( this.id, 0, NONE, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // accept quest + { + player.questUpdate( SubFst003.id, SubFst003.SEQ_FINISH ); + player.setQuestUI8AL( SubFst003.id, 1 ); + player.setQuestUI8BH( SubFst003.id, 1 ); + } + } ); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, NONE, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // gave back items + { + SubFst003.Scene00100( player ); + } + } ); + } + + def Scene00099( player ) + { + player.eventPlay( this.id, 99, NONE, + fun( player, eventId, param1, param2, param3 ) + { + } ); + } + + def Scene00100( player ) + { + player.eventPlay( this.id, 100, NONE, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // finish quest + { + if( player.giveQuestRewards( SubFst003.id, 0 ) ) + { + player.questFinish( SubFst003.id ); + } + } + } ); + } + + ////////////////////////////////////////////////////////////////////// + // Event Handlers + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + + if( !player.hasQuest( SubFst003.id ) ) + { + SubFst003.Scene00000( player ); + } + + if( actor == SubFst003.ACTOR1 && player.questGetSeq( SubFst003.id ) == SubFst003.SEQ_FINISH ) + { + SubFst003.Scene00001( player ); + } + } + +}; + +GLOBAL SubFst003 = SubFst003Def(); diff --git a/bin/scripts/chai/quest/SubFst004.chai b/bin/scripts/chai/quest/SubFst004.chai new file mode 100644 index 00000000..7dfdacd2 --- /dev/null +++ b/bin/scripts/chai/quest/SubFst004.chai @@ -0,0 +1,150 @@ +// Quest Script: SubFst004_00027 +// Quest Name: Preserving the Past +// Quest ID: 65563 +// Start NPC: 1000194 +// End NPC: 1000789 + +class SubFst004Def +{ + def SubFst004Def() + { + // Basic quest information + this.name = "Preserving the Past"; + this.id = 65563; + + // Quest vars / flags used + // GetQuestUI8AL + // GetQuestUI8BH + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_1 = 1; + this.SEQ_FINISH = 255; + + // Quest rewards + this.RewardExpFactor = 50; + this.RewardItem = [5594]; + this.RewardItemCount = [10]; + + // Entities found in the script data of the quest + this.ACTOR0 = 1000194; + this.ACTOR1 = 1000686; + this.ACTOR2 = 1000789; + this.ITEM0 = 2000024; + this.SEQ_0_ACTOR0 = 0; + this.SEQ_1_ACTOR1 = 1; + this.SEQ_2_ACTOR2 = 2; + this.SEQ_2_ACTOR2_NPCTRADENO = 99; + this.SEQ_2_ACTOR2_NPCTRADEOK = 100; + + } + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( this.id, 0, NONE, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // accept quest + { + + player.questUpdate( SubFst004.id, SubFst004.SEQ_1 ); + } + } ); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, NONE, + fun( player, eventId, param1, param2, param3 ) + { + player.setQuestUI8AL( SubFst004.id, 1 ); + player.setQuestUI8BH( SubFst004.id, 1 ); + //player.questMessage( SubFst004.id, 0, 2, 1, 1 ); + player.questMessage( SubFst004.id, 0, 1, 21002, 0 ); + player.questUpdate( SubFst004.id, SubFst004.SEQ_FINISH ); + } ); + } + + def Scene00002( player ) + { + player.eventPlay( this.id, 2, NONE, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) + { + SubFst004.Scene00100( player ); + } + } ); + } + + def Scene00099( player ) + { + player.eventPlay( this.id, 99, NONE, + fun( player, eventId, param1, param2, param3 ) + {} ); + } + + def Scene00100( player ) + { + player.eventPlay( this.id, 100, NONE, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) + { + if( player.giveQuestRewards( SubFst004.id, 0 ) ) + { + player.questFinish( SubFst004.id ); + } + } + } ); + } + + ////////////////////////////////////////////////////////////////////// + // Event Handlers + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + + if( actor == SubFst004.ACTOR0 ) + { + if( !player.hasQuest( SubFst004.id ) ) + { + SubFst004.Scene00000( player ); + } + else + { + SubFst004.Scene00001( player ); + } + } + else if( actor == SubFst004.ACTOR1 ) + { + if( !player.hasQuest( SubFst004.id ) ) + { + // todo: what should this event do? + SubFst004.Scene00099( player ); + } + else + { + SubFst004.Scene00001( player ); + } + } + else if( actor == SubFst004.ACTOR2 ) + { + if( !player.hasQuest( SubFst004.id ) ) + { + // todo: what should this event do? + SubFst004.Scene00099( player ); + } + else + { + SubFst004.Scene00002( player ); + } + } + } + +}; + +GLOBAL SubFst004 = SubFst004Def(); diff --git a/bin/scripts/chai/quest/SubFst007.chai b/bin/scripts/chai/quest/SubFst007.chai new file mode 100644 index 00000000..3c336bcd --- /dev/null +++ b/bin/scripts/chai/quest/SubFst007.chai @@ -0,0 +1,133 @@ +// This is an automatically generated chai script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, change its extension to .chai +// and move it to the correct folder in bin/scripts/chai/quest + +// Quest Script: SubFst007_00031 +// Quest Name: Essential Oil +// Quest ID: 65567 +// Start NPC: 1000705 +// End NPC: 1000705 + +class SubFst007Def +{ + def SubFst007Def() + { + // Basic quest information + this.name = "Essential Oil"; + this.id = 65567; + + // Quest vars / flags used + // GetQuestUI8AL + // GetQuestUI8BH + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_1 = 1; + this.SEQ_FINISH = 255; + + // Quest rewards + this.RewardExpFactor = 100; + this.RewardItemOptional = [3530, 3531, 5823]; + this.RewardItemOptionalCount = [1, 1, 3]; + + // Entities found in the script data of the quest + this.ACTOR0 = 1000705; + this.ENEMY0 = 49; + this.ITEM0 = 2000098; + this.SEQ_0_ACTOR0 = 0; + this.SEQ_2_ACTOR0 = 1; + this.SEQ_2_ACTOR0_NPCTRADENO = 99; + this.SEQ_2_ACTOR0_NPCTRADEOK = 100; + + } + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( this.id, 0, NONE, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // accept quest + { + player.questUpdate( SubFst007.id, SubFst007.SEQ_1 ); + } + } ); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, NONE, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // gave back items + { + SubFst007.Scene00100( player ); + } + } ); + } + + def Scene00099( player ) //unused + { + player.eventPlay( this.id, 99, NONE, + fun( player, eventId, param1, param2, param3 ) + {} ); + } + + def Scene00100( player ) + { + player.eventPlay( this.id, 100, NONE, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // finish quest + { + if( player.giveQuestRewards( SubFst007.id, 0 ) ) + { + player.questFinish( SubFst007.id ); + } + } + } ); + } + + ////////////////////////////////////////////////////////////////////// + // Event Handlers + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + + if( !player.hasQuest( SubFst007.id ) ) + { + SubFst007.Scene00000( player ); + } + + if( player.questGetSeq( SubFst007.id ) == SubFst007.SEQ_FINISH ) + { + SubFst007.Scene00001( player ); + } + } + + def onBnpcKill_49( player ) + { + var currentKC = player.getQuestUI8AL(SubFst007.id); + currentKC = currentKC + 1; + + player.questMessage( SubFst007.id, 0, 2, currentKC, 6 ); + player.tryAddItem( 2000098, 1 ); + + if( currentKC >= 6 ) + { + player.questUpdate( SubFst007.id, SubFst007.SEQ_FINISH ); + player.setQuestUI8BH( SubFst007.id, currentKC ); + } + else + { + player.setQuestUI8AL( SubFst007.id, currentKC ); + player.setQuestUI8BH( SubFst007.id, currentKC ); + } + } + +}; + +GLOBAL SubFst007 = SubFst007Def(); diff --git a/bin/scripts/chai/quest/SubFst010.chai b/bin/scripts/chai/quest/SubFst010.chai new file mode 100644 index 00000000..fb0f4758 --- /dev/null +++ b/bin/scripts/chai/quest/SubFst010.chai @@ -0,0 +1,82 @@ +// Quest Script: SubFst010_00001 +// Quest Name: A Good Adventurer Is Hard to Find +// Quest ID: 65537 +// Start NPC: 1000146 +// End NPC: 1000195 + +class SubFst010Def +{ + def SubFst010Def() + { + // Basic quest information + this.name = "A Good Adventurer Is Hard to Find"; + this.id = 65537; + + // Quest vars / flags used + // GetQuestUI8AL + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_FINISH = 255; + + // Quest rewards + this.RewardExpFactor = 50; + this.RewardItem = [4551]; + this.RewardItemCount = [2]; + + // Entities found in the script data of the quest + this.ACTOR0 = 1000146; + this.ACTOR1 = 1000195; + this.SEQ_0_ACTOR0 = 0; + this.SEQ_1_ACTOR1 = 1; + + } + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( this.id, 0, NONE, + fun( player, eventid, param1, param2, param3 ) + { + if( param2 == 1 ) // accept quest + { + player.questUpdate( SubFst010.id, SubFst010.SEQ_FINISH ); + } + }); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, NONE, + fun( player, eventid, param1, param2, param3 ) + { + if( param2 == 1 ) // finish quest + { + if( player.giveQuestRewards( SubFst010.id, 0 ) ) + { + player.questFinish( SubFst010.id ); + } + } + }); + } + + ////////////////////////////////////////////////////////////////////// + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + + if( actor == this.ACTOR0 ) + { + this.Scene00000( player ); + } + else if( actor == this.ACTOR1 ) + { + this.Scene00001( player ); + } + } + +}; + +GLOBAL SubFst010 = SubFst010Def(); diff --git a/bin/scripts/chai/quest/SubFst011.chai b/bin/scripts/chai/quest/SubFst011.chai new file mode 100644 index 00000000..56f616e4 --- /dev/null +++ b/bin/scripts/chai/quest/SubFst011.chai @@ -0,0 +1,100 @@ +// Quest Script: SubFst011_00037 +// Quest Name: Population Control +// Quest ID: 65573 +// Start NPC: 1000195 +// End NPC: 1000195 + +class SubFst011Def +{ + def SubFst011Def() + { + // Basic quest information + this.name = "Population Control"; + this.id = 65573; + + // Quest vars / flags used + // GetQuestUI8AL + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_1 = 1; + this.SEQ_FINISH = 255; + + // Quest rewards + this.RewardExpFactor = 100; + this.RewardItemOptional = [2653, 2655, 5823]; + this.RewardItemOptionalCount = [1, 1, 3]; + + // Entities found in the script data of the quest + this.ACTOR0 = 1000195; + this.ENEMY0 = 47; + this.SEQ_0_ACTOR0 = 0; + this.SEQ_2_ACTOR0 = 1; + + } + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( this.id, 0, NONE, + fun( player, eventid, param1, param2, param3 ) + { + if( param2 == 1 ) // accept quest + { + player.questUpdate( SubFst011.id, SubFst011.SEQ_1 ); + } + }); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, NONE, + fun( player, eventid, param1, param2, param3 ) + { + if( param2 == 1 ) // accept quest + { + if( player.giveQuestRewards( SubFst011.id, 0 ) ) + { + player.questFinish( SubFst011.id ); + } + } + }); + } + + ////////////////////////////////////////////////////////////////////// + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + + if( player.hasQuest(SubFst011.id) ) + { + this.Scene00001( player ); + } + else + { + this.Scene00000( player ); + } + } + + def onBnpcKill_47( player ) + { + var currentKC = player.getQuestUI8AL(SubFst011.id); + currentKC = currentKC + 1; + + player.questMessage( SubFst011.id, 0, 2, currentKC, 6 ); + + if( currentKC >= 6 ) + { + player.questUpdate( SubFst011.id, SubFst011.SEQ_FINISH ); + } + else + { + player.setQuestUI8AL( SubFst011.id, currentKC ); + } + } + +}; + +GLOBAL SubFst011 = SubFst011Def(); \ No newline at end of file diff --git a/bin/scripts/chai/quest/SubFst013.chai b/bin/scripts/chai/quest/SubFst013.chai new file mode 100644 index 00000000..8f048451 --- /dev/null +++ b/bin/scripts/chai/quest/SubFst013.chai @@ -0,0 +1,235 @@ +// Quest Script: SubFst013_00040 +// Quest Name: For Friendship +// Quest ID: 65576 +// Start NPC: 1000162 +// End NPC: 1000162 + +class SubFst013Def +{ + def SubFst013Def() + { + // Basic quest information + this.name = "For Friendship"; + this.id = 65576; + + // Quest vars / flags used + // GetQuestUI8AL + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_1 = 1; + this.SEQ_2 = 2; + this.SEQ_3 = 3; + this.SEQ_4 = 4; + this.SEQ_5 = 5; + this.SEQ_FINISH = 255; + + // Quest rewards + this.RewardExpFactor = 50; + this.RewardGil = 111; + + // Entities found in the script data of the quest + this.ACTOR0 = 1000162; + this.ACTOR1 = 1000161; + this.FIRST_QUEST = 65575; + this.SEQ_0_ACTOR0 = 0; + this.SEQ_1_ACTOR1 = 1; + this.SEQ_1_ACTOR1_EMOTENO = 99; + this.SEQ_1_ACTOR1_EMOTEOK = 100; + this.SEQ_2_ACTOR0 = 2; + this.SEQ_3_ACTOR1 = 3; + this.SEQ_3_ACTOR1_EMOTENO = 97; + this.SEQ_3_ACTOR1_EMOTEOK = 98; + this.SEQ_4_ACTOR0 = 4; + this.SEQ_5_ACTOR1 = 5; + this.SEQ_5_ACTOR1_EMOTENO = 95; + this.SEQ_5_ACTOR1_EMOTEOK = 96; + this.SEQ_6_ACTOR0 = 6; + + } + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( this.id, 0, NONE, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // accept quest + { + player.questUpdate( SubFst013.id, SubFst013.SEQ_1 ); + } + } ); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, NONE, + fun( player, eventId, param1, param2, param3 ) + {} ); + } + + def Scene00002( player ) + { + player.eventPlay( this.id, 2, NONE, + fun( player, eventId, param1, param2, param3 ) + { + player.questUpdate( SubFst013.id, SubFst013.SEQ_3 ); + } ); + } + + def Scene00003( player ) //unused + { + player.eventPlay( this.id, 3, NONE, + fun( player, eventId, param1, param2, param3 ) + {} ); + } + + def Scene00004( player ) + { + player.eventPlay( this.id, 4, NONE, + fun( player, eventId, param1, param2, param3 ) + { + player.questUpdate( SubFst013.id, SubFst013.SEQ_5 ); + } ); + } + + def Scene00005( player ) //unused + { + player.eventPlay( this.id, 5, NONE, + fun( player, eventId, param1, param2, param3 ) + {} ); + } + + def Scene00006( player ) + { + player.eventPlay( this.id, 6, NONE, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // finish quest + { + if( player.giveQuestRewards( SubFst013.id, 0 ) ) + { + player.questFinish( SubFst013.id ); + } + } + } ); + } + + def Scene00095( player ) //unused + { + player.eventPlay( this.id, 95, NONE, + fun( player, eventId, param1, param2, param3 ) + {} ); + } + + def Scene00096( player ) + { + player.eventPlay( this.id, 96, NONE, + fun( player, eventId, param1, param2, param3 ) + { + player.questUpdate( SubFst013.id, SubFst013.SEQ_FINISH ); + player.questMessage( SubFst013.id, 4, 2, 0, 0 ); + } ); + } + + def Scene00097( player ) //unused + { + player.eventPlay( this.id, 97, NONE, + fun( player, eventId, param1, param2, param3 ) + {} ); + } + + def Scene00098( player ) + { + player.eventPlay( this.id, 98, NONE, + fun( player, eventId, param1, param2, param3 ) + { + player.questUpdate( SubFst013.id, SubFst013.SEQ_4 ); + player.questMessage( SubFst013.id, 2, 2, 0, 0 ); + } ); + } + + def Scene00099( player ) //unused + { + player.eventPlay( this.id, 99, NONE, + fun( player, eventId, param1, param2, param3 ) + {} ); + } + + def Scene00100( player ) + { + player.eventPlay( this.id, 100, NONE, + fun( player, eventId, param1, param2, param3 ) + { + player.questUpdate( SubFst013.id, SubFst013.SEQ_2 ); + player.questMessage( SubFst013.id, 0, 2, 0, 0 ); + } ); + } + + ////////////////////////////////////////////////////////////////////// + // Event Handlers + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + + if( !player.hasQuest( SubFst013.id ) ) + { + SubFst013.Scene00000( player ); + return; + } + + if( actor == SubFst013.ACTOR1 ) //talk to girl without emotes + { + SubFst013.Scene00001( player ); + return; + } + + if( actor == SubFst013.ACTOR0 && player.questGetSeq( SubFst013.id ) == SubFst013.SEQ_2 ) + { + SubFst013.Scene00002( player ); + return; + } + + if( actor == SubFst013.ACTOR0 && player.questGetSeq( SubFst013.id ) == SubFst013.SEQ_4 ) + { + SubFst013.Scene00004( player ); + return; + } + + if( actor == SubFst013.ACTOR0 && player.questGetSeq( SubFst013.id ) == SubFst013.SEQ_FINISH ) + { + SubFst013.Scene00006( player ); + return; + } + + } + + def onEmote( eventId, player, actorId, emoteId ) + { + var actor = mapActor( actorId ); + print( emoteId ); + + if( actor == SubFst013.ACTOR1 && emoteId == 5 && player.questGetSeq( SubFst013.id ) == SubFst013.SEQ_1 ) + { + SubFst013.Scene00100( player ); + return; + } + + if( actor == SubFst013.ACTOR1 && emoteId == 18 && player.questGetSeq( SubFst013.id ) == SubFst013.SEQ_3 ) + { + SubFst013.Scene00098( player ); + return; + } + + if( actor == SubFst013.ACTOR1 && emoteId == 11 && player.questGetSeq( SubFst013.id ) == SubFst013.SEQ_5 ) + { + SubFst013.Scene00096( player ); + return; + } + } + +}; + +GLOBAL SubFst013 = SubFst013Def(); diff --git a/bin/scripts/chai/quest/SubFst015.chai b/bin/scripts/chai/quest/SubFst015.chai new file mode 100644 index 00000000..a8f89a2b --- /dev/null +++ b/bin/scripts/chai/quest/SubFst015.chai @@ -0,0 +1,261 @@ +// This is an automatically generated chai script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, change its extension to .chai +// and move it to the correct folder in bin/scripts/chai/quest + +// Quest Script: SubFst015_00042 +// Quest Name: Sylphic Gratitude +// Quest ID: 65578 +// Start NPC: 1000286 +// End NPC: 1000286 + +class SubFst015Def +{ + def SubFst015Def() + { + // Basic quest information + this.name = "Sylphic Gratitude"; + this.id = 65578; + + // Quest vars / flags used + // GetQuestBitFlag8 + // GetQuestUI8AL + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_1 = 1; + this.SEQ_FINISH = 255; + //this.SEQ_OFFER = ?; + + // Quest rewards + this.RewardExpFactor = 50; + this.RewardGil = 110; + + // Entities found in the script data of the quest + this.ACTOR0 = 1000286; + this.EOBJECT0 = 2000020; + this.EOBJECT1 = 2000021; + this.EOBJECT2 = 2000022; + this.EOBJECT3 = 2000023; + this.EOBJECT4 = 2000024; + this.EOBJECT5 = 2000025; + this.EVENT_ACTION_SEARCH = 1; + + } + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( this.id, 0, NONE, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) + { + player.questUpdate( SubFst015.id, 1 ); + } + }); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, NONE, 0, 0 ); + } + + def Scene00002( player ) + { + player.eventPlay( this.id, 2, NONE, 0, 0 ); + } + + def Scene00003( player ) + { + player.eventPlay( this.id, 3, NONE, 0, 0 ); + } + + def Scene00004( player ) + { + player.eventPlay( this.id, 4, NONE, 0, 0 ); + } + + def Scene00005( player ) + { + player.eventPlay( this.id, 5, NONE, 0, 0 ); + } + + def Scene00006( player ) + { + player.eventPlay( this.id, 6, NONE, 0, 0 ); + } + + def Scene00007( player ) + { + player.eventPlay( this.id, 7, NONE, 0, 0, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) + { + if( player.giveQuestRewards( SubFst015.id, 0 ) ) + { + player.questFinish( SubFst015.id ); + } + } + }); + } + + def Scene00089( player ) + { + player.eventPlay( this.id, 89, NONE, 0, 0 ); + } + + def Scene00090( player ) + { + player.eventPlay( this.id, 90, NONE, 0, 0 ); + } + + def Scene00091( player ) + { + player.eventPlay( this.id, 91, NONE, 0, 0 ); + } + + def Scene00092( player ) + { + player.eventPlay( this.id, 92, NONE, 0, 0 ); + } + + def Scene00093( player ) + { + player.eventPlay( this.id, 93, NONE, 0, 0 ); + } + + def Scene00094( player ) + { + player.eventPlay( this.id, 94, NONE, 0, 0 ); + } + + def Scene00095( player ) + { + player.eventPlay( this.id, 95, NONE, 0, 0 ); + } + + def Scene00096( player ) + { + player.eventPlay( this.id, 96, NONE, 0, 0 ); + } + + def Scene00097( player ) + { + player.eventPlay( this.id, 97, NONE, 0, 0 ); + } + + def Scene00098( player ) + { + player.eventPlay( this.id, 98, NONE, 0, 0 ); + } + + def Scene00099( player ) + { + player.eventPlay( this.id, 99, NONE, 0, 0 ); + } + + def Scene00100( player ) + { + player.eventPlay( this.id, 100, NONE, 0, 0 ); + } + + ////////////////////////////////////////////////////////////////////// + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + switch( actor ) + { + case( this.ACTOR0 ) + { + if( player.hasQuest( this.id ) ) + { + this.Scene00007( player ); + } + else + { + this.Scene00000( player ); + } + break; + } + case ( this.EOBJECT0 ) {} + case ( this.EOBJECT1 ) {} + case ( this.EOBJECT2 ) {} + case ( this.EOBJECT3 ) {} + case ( this.EOBJECT4 ) {} + case ( this.EOBJECT5 ) + { + player.eventActionStart( this.id, 0x0F, + fun( player, eventId, additional ) + { + var actor = mapActor( additional ); + + var currVegetal = player.getQuestUI8AL( eventId ); + + var despawn1 = player.getQuestUI8FL( eventId ); + var despawn2 = player.getQuestUI8FH( eventId ); + + if( SubFst015.EOBJECT3 == actor ) + { + despawn2 = despawn2 | 1; + player.setQuestUI8FH( eventId, despawn2 ); + } + else if( SubFst015.EOBJECT2 == actor ) + { + despawn2 = despawn2 | 2; + player.setQuestUI8FH( eventId, despawn2 ); + } + else if( SubFst015.EOBJECT1 == actor ) + { + despawn2 = despawn2 | 4; + player.setQuestUI8FH( eventId, despawn2 ); + } + else if( SubFst015.EOBJECT0 == actor ) + { + despawn2 = despawn2 | 8; + player.setQuestUI8FH( eventId, despawn2 ); + } + else if( SubFst015.EOBJECT5 == actor ) + { + despawn2 = despawn1 | 4; + player.setQuestUI8FL( eventId, despawn2 ); + } + else if( SubFst015.EOBJECT4 == actor ) + { + despawn2 = despawn1 | 8; + player.setQuestUI8FL( eventId, despawn2 ); + } + + player.questMessage( eventId, 0, 2, currVegetal + 1, 6 ); + + if ( currVegetal + 1 == 6 ) + { + player.questUpdate( eventId, SubFst015.SEQ_FINISH ); + } + else + { + player.setQuestUI8AL( eventId, currVegetal + 1 ); + } + + SubFst015.Scene00096( player ); + }, + fun( player, eventId, additional ) + { + }, + actorId ); + player.unlock(); + break; + } + + default + { + } + } + } + +}; + +GLOBAL SubFst015 = SubFst015Def(); diff --git a/bin/scripts/chai/quest/SubFst019.chai b/bin/scripts/chai/quest/SubFst019.chai new file mode 100644 index 00000000..371a0096 --- /dev/null +++ b/bin/scripts/chai/quest/SubFst019.chai @@ -0,0 +1,89 @@ +// This is an automatically generated chai script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, change its extension to .chai +// and move it to the correct folder in bin/scripts/chai/quest + +// Quest Script: SubFst019_00049 +// Quest Name: I Am Millicent, Hear Me Roar +// Quest ID: 65585 +// Start NPC: 1000788 +// End NPC: 1000429 + +class SubFst019Def +{ + def SubFst019Def() + { + // Basic quest information + this.name = "I Am Millicent, Hear Me Roar"; + this.id = 65585; + + // Quest vars / flags used + // GetQuestUI8AL + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + this.SEQ_0 = 0; + this.SEQ_FINISH = 255; + + // Quest rewards + this.RewardExpFactor = 50; + this.RewardItem = [4551]; + this.RewardItemCount = [5]; + + // Entities found in the script data of the quest + this.ACTOR0 = 1000788; + this.ACTOR1 = 1000429; + this.SEQ_0_ACTOR0 = 0; + this.SEQ_1_ACTOR1 = 1; + + } + + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + def Scene00000( player ) + { + player.eventPlay( this.id, 0, NONE, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // accept quest + { + player.questUpdate( SubFst019.id, SubFst019.SEQ_FINISH ); + } + } ); + } + + def Scene00001( player ) + { + player.eventPlay( this.id, 1, NONE, + fun( player, eventId, param1, param2, param3 ) + { + if( param2 == 1 ) // finish quest + { + if( player.giveQuestRewards( SubFst019.id, 0 ) ) + { + player.questFinish( SubFst019.id ); + } + } + } ); + } + + ////////////////////////////////////////////////////////////////////// + // Event Handlers + def onTalk( eventId, player, actorId ) + { + var actor = mapActor( actorId ); + + if( !player.hasQuest( SubFst019.id ) ) + { + SubFst019.Scene00000( player ); + } + + if( actor == SubFst019.ACTOR1 && player.questGetSeq( SubFst019.id ) == SubFst019.SEQ_FINISH ) + { + SubFst019.Scene00001( player ); + } + } + +}; + +GLOBAL SubFst019 = SubFst019Def(); diff --git a/bin/web/createUser.html b/bin/web/createUser.html new file mode 100644 index 00000000..9442299c --- /dev/null +++ b/bin/web/createUser.html @@ -0,0 +1,73 @@ + + + + FFXIV 1.0 Login + + + + + + +

+
+ +
+ +
+
+
+ + + + + + + + + + + + +
Username:
Password:
+ +
+

+
+
+
+ + + diff --git a/bin/web/css/global.css b/bin/web/css/global.css new file mode 100644 index 00000000..0af8d574 --- /dev/null +++ b/bin/web/css/global.css @@ -0,0 +1,158 @@ +body +{ + font-family: Verdana; + font-size: 10pt; + line-height: 14pt; + height: 100%; +} + + +div.contentContainer { + width: 50%; + float: left; +} + + +div.info +{ + width: 320px; + height: 100%; + margin-left: auto; + margin-right: auto; + text-align: center; + padding: 20px; + background-color: lightgrey; +} + +div.infoFooter +{ + width: 400px; + margin-left: auto; + margin-right: auto; + text-align: right; + padding: 5px; +} + +div.edit +{ + width: 50%; + min-width: 600px; + margin-top: 20px; + margin-left: auto; + margin-right: auto; + text-align: center; + padding: 20px; + background-color: lightgrey; +} + +div.inner +{ + position: relative; + max-width: 1250px; + margin: 0px auto; +} + +h1 +{ + line-height: 23px; + font-size: 23px; + padding: 5px 0px; +} + +h2 +{ + line-height: 17px; + font-size: 14px; + font-weight: bold; + padding: 5px; +} + +h3 +{ + line-height: 14px; + font-size: 12px; + font-weight: bold; + padding: 5px; +} + +header.top +{ + padding: 20px 0px; + background: none repeat scroll 0% 0% lavender; + position: relative; + z-index: 999; +} + +table.center +{ + margin-left: auto; + margin-right: auto; +} + +table.infoForm +{ + width: 100%; +} + +table.editForm +{ + width: 100%; +} + +table.editForm input +{ + width: 100%; +} + +table.editForm select +{ + width: 100%; +} + +td +{ + padding: 3px; +} + +th +{ + padding: 3px; + text-decoration: underline; +} + +p +{ + padding: 2px; +} + +p.errorMessage +{ + color: darkred; + font-weight: bold; +} + +p.pageTitle +{ + font-weight: bold; + font-size: 28px; + line-height: 20px; + padding: 0px 0px; +} + +p.pageTitle a +{ + text-decoration: none; + color: black; +} + +p.pageSubTitle +{ + font-size: 10px; + line-height: 18px; + padding: 0px 0px; +} + +#recaptcha_area +{ + margin: 0 auto; +} diff --git a/bin/web/css/reset.css b/bin/web/css/reset.css new file mode 100644 index 00000000..e29c0f5f --- /dev/null +++ b/bin/web/css/reset.css @@ -0,0 +1,48 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/bin/web/headlines.xml b/bin/web/headlines.xml new file mode 100644 index 00000000..3b671e4e --- /dev/null +++ b/bin/web/headlines.xml @@ -0,0 +1,1722 @@ +OKBezüglich Einschränkungen bei der Charaktererstellung14854608001485461160ee2c8eb0ec2c20d20e2bd6d9e2c69217dcad20d81Updates bezüglich der Einschränkungen der Charaktererstellung finden Sie hier.<br> +Sollte es zu einer erhöhten Belastung kommen, behalten wir es uns vor, die Erstellung für neue Charaktere zeitweilig einzuschränken.<br> +Diese Information wird in den folgenden Abständen aktualisiert:<br> +2:00 / 7:00 / 12:00 / 16:00 / 21:00 (MEZ)<br> +<br> +○:Charaktererstellung möglich ×:Charaktererstellung eingeschränkt<br> +<br> +Japanisches Datenzentrum<br> + ○ Aegis<br> + ○ Alexander<br> + ○ Anima<br> + ○ Asura<br> + ○ Atomos<br> + ○ Bahamut<br> + ○ Belias<br> + ○ Carbuncle<br> + × Chocobo<br> + ○ Durandal<br> + ○ Fenrir<br> + ○ Garuda<br> + ○ Gungnir<br> + ○ Hades<br> + ○ Ifrit<br> + ○ Ixion<br> + ○ Kujata<br> + ○ Mandragora<br> + ○ Masamune<br> + ○ Pandaemonium<br> + ○ Ramuh<br> + ○ Ridill<br> + × Shinryu<br> + ○ Tiamat<br> + ○ Titan<br> + ○ Tonberry<br> + ○ Typhon<br> + ○ Ultima<br> + ○ Unicorn<br> + ○ Valefor<br> + ○ Yojimbo<br> + ○ Zeromus<br> +<br> +Nordamerikanisches Datenzentrum<br> + ○ Adamantoise<br> + × Balmung<br> + × Behemoth<br> + ○ Brynhildr<br> + ○ Cactuar<br> + ○ Coeurl<br> + × Diabolos<br> + × Excalibur<br> + ○ Exodus<br> + ○ Faerie<br> + ○ Famfrit<br> + × Gilgamesh<br> + ○ Goblin<br> + × Hyperion<br> + ○ Jenova<br> + ○ Lamia<br> + × Leviathan<br> + ○ Malboro<br> + ○ Mateus<br> + ○ Midgardsormr<br> + ○ Sargatanas<br> + ○ Siren<br> + × Ultros<br> + ○ Zalera<br> +<br> +Europäisches Datenzentrum<br> + × Cerberus<br> + ○ Lich<br> + × Moogle<br> + × Odin<br> + ○ Phoenix<br> + × Ragnarok<br> + × Shiva<br> + ○ ZodiarkTechnische Schwierigkeiten des „PSN“ (26. Jan.)14854473281485447484133a2a9464b7a1e1cb77ed6899fc8e813b273d294Gegenwärtig gibt es technische Schwierigkeiten mit dem Sony Interactive Entertainment-Dienst „PSN“.<br> +<br> +Weitere Informationen werden bekanntgegeben, sobald diese verfügbar sind.<br> +<br> +* Bitte beachtet, dass bereits eingeloggte Spieler weiterhin spielen können, solange sie sich nicht ausloggen.<br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 26. Jan. 2017 um 15:22 Uhr (MEZ)<br> +<br> +[Details] <br> +・Spieler können sich nicht in die PlayStation®3- und PlayStation®4-Version von FINAL FANTASY XIV einloggenTechnische Schwierigkeiten des Mana Datenzentrums behoben (26. Jan.)148544489314854449418007f32b6f60752b6efc62332e7eaf608670a8f3Recovery4Wir freuen uns euch mitteilen zu können, dass die technischen Schwierigkeiten mit den untenstehenden Welten behoben wurden. <br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit] <br> +Am 26. Jan. 2017 von 13:46 Uhr bis 16:15 Uhr (MEZ) <br> +<br> +[Details] <br> +・Verbindung zu bestimmten instanziierten Inhalten unterbrochen und Wiedereinloggen war nicht möglich <br> +<br> +[Ursache] <br> +Probleme mit der Serversoftware<br> +<br> +[Betroffene Welten] <br> +Alle Welten des Mana Datenzentrums<br> +・Anima<br> +・Asura<br> +・Belias<br> +・Chocobo<br> +・Hades<br> +・Ixion<br> +・Mandragora<br> +・Masamune<br> +・Pandaemonium<br> +・Shinryu<br> +・Titan<br> +Notwartung des Mana-Datenzentrums (26. Jan.)14854377331485437790021fbfd330ff2fac70a32cf8bd15cfa146d2258fMaintenance2Wir werden eine Notwartung aller Welten des Mana-Datenzentrums durchführen. Während dieses Zeitraums werden diese Welten nicht verfügbar sein.<br> +<br> +* 30 Minuten vor Beginn der Wartung bis zu deren Abschluss wird der Weltentransferdienst nicht zur Verfügung stehen.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit]<br> +Am 26. Jan. 2017 von 14:45 Uhr bis 17:15 Uhr (MEZ) <br> +<br> +[Betroffene Welten]<br> +Alle Welten des Mana-Datenzentrums:<br> +・Anima<br> +・Asura<br> +・Belias<br> +・Chocobo<br> +・Hades<br> +・Ixion<br> +・Mandragora<br> +・Masamune<br> +・Pandaemonium<br> +・Shinryu<br> +・Titan<br> +Technische Schwierigkeiten des Mana Datenzentrums (26. Jan.)148543638814854364392e83b51376fe2d18ce9dc653b146574508c5829d4Gegenwärtig gibt es technische Schwierigkeiten mit den untenstehenden Welten.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.<br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 26. Jan. 2017 um 13:46 Uhr (MEZ)<br> +<br> +[Details]<br> +・Einloggen ist nicht möglich.<br> +・Areale können nicht gewechselt werden.<br> +・Betreten von instanziierten Inhalten ist nicht möglich.<br> +<br> +[Ursache] <br> +Wird untersucht<br> +<br> +[Betroffene Welten] <br> +Alle Welten des Mana Datenzentrums<br> +・Anima<br> +・Asura<br> +・Belias<br> +・Chocobo<br> +・Hades<br> +・Ixion<br> +・Mandragora<br> +・Masamune<br> +・Pandaemonium<br> +・Shinryu<br> +・Titan<br> +Zeiten in denen Zeremonien des Ewigen Bundes nicht stattfinden können1485423600148542385332c6eee3716cfdfaf24fea79b19b5f5d73b5f8781Wir möchten euch hiermit die Zeiten für zukünftige Wartungen mitteilen.<br> +<br> +Für den Fall, dass sich eine Wartung mit eurer Reservierung für die Zeremonie des Ewigen Bundes überschneidet, findet die Zeremonie nicht statt, und es muss eine neue Reservierung nach der Wartung abgeschlossen werden.<br> +Wir möchten euch bitten, diese Zeiten bei der Planung eurer Zeremonie des Ewigen Bundes zu berücksichtigen.<br> +<br> +* Falls eine Wartung zum gleichen Zeitpunkt stattfindet wie eine Reservierung für die Zeremonie des Ewigen Bundes, wird diese Zeremonie storniert, und muss neu reserviert werden.<br> +* Es besteht die Möglichkeit, dass es Notwartungen gibt, die nicht in der unten stehenden Liste erwähnt sind.<br> +<br> +[Mögliche Wartungen]<br> +* Diese Information ist nicht endgültig. Es besteht die Möglichkeit, dass diese Wartungen verschoben werden oder gar nicht stattfinden.<br> +<br> +・Irgendwann am 31. Jan. 2017 zwischen 5 Uhr und 12 Uhr (MEZ)<br> +・Irgendwann am 1. Feb. 2017 zwischen 5 Uhr und 12 Uhr (MEZ)<br> +・Irgendwann am 2. Feb. 2017 zwischen 5 Uhr und 12 Uhr (MEZ)<br> +・Irgendwann am 7. Feb. 2017 zwischen 5 Uhr und 12 Uhr (MEZ)<br> +・Irgendwann am 8. Feb. 2017 zwischen 5 Uhr und 12 Uhr (MEZ)<br> +・Irgendwann am 9. Feb. 2017 zwischen 5 Uhr und 12 Uhr (MEZ)<br> +<br> +[Geplante Wartungen]<br> +<br> +・Keine<br> +<br> +* Falls ihr schon eine Zeremonie in diesem Zeitraum gebucht habt, möchten wir euch bitten, diese zu verlegen.<br> +<br> +[Betroffene Welten]<br> +<br> +Unten aufgelistet findet ihr die Welten, auf welchen ihr Zeremonien des Ewigen Bundes reservieren oder nicht reservieren könnt.<br> +Bitte überprüft diese Liste, bevor ihr eine Reservierung macht.<br> +<br> +○:Reservierung möglich ×:Reservierung nicht möglich<br> +<br> +* Auf betroffenen Welten ist eine Reservierung bis zum nächsten Freitag um 10 Uhr (MEZ) nicht möglich.<br> +<br> +■Japanische Welten<br> + × Aegis      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Alexander    :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Anima      :vom 21. Jan. 2017, 8:30 Uhr (MEZ)<br> + × Asura      :vom 21. Jan. 2017, 8:30 Uhr (MEZ)<br> + × Atomos      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Bahamut     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Belias      :vom 21. Jan. 2017, 8:30 Uhr (MEZ)<br> + × Carbuncle    :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Chocobo     :vom 21. Jan. 2017, 8:30 Uhr (MEZ)<br> + × Durandal     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Fenrir      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Garuda      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Gungnir     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Hades      :vom 21. Jan. 2017, 8:30 Uhr (MEZ)<br> + × Ifrit      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Ixion      :vom 21. Jan. 2017, 8:30 Uhr (MEZ)<br> + × Kujata      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Mandragora    :vom 21. Jan. 2017, 8:30 Uhr (MEZ)<br> + × Masamune     :vom 21. Jan. 2017, 8:30 Uhr (MEZ)<br> + × Pandaemonium   :vom 21. Jan. 2017, 8:30 Uhr (MEZ)<br> + × Ramuh      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Ridill      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Shinryu     :vom 21. Jan. 2017, 8:30 Uhr (MEZ)<br> + × Tiamat      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Titan      :vom 21. Jan. 2017, 8:30 Uhr (MEZ)<br> + × Tonberry     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Typhon      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Ultima      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Unicorn     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Valefor     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Yojimbo     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Zeromus     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> +<br> +■Nordamerikanische Welten<br> + × Adamantoise   :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Balmung     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Behemoth     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Brynhildr    :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Cactuar     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Coeurl      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Diabolos     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Excalibur    :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Exodus      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Faerie      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Famfrit     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Gilgamesh    :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Goblin      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Hyperion     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Jenova      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Lamia      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Leviathan    :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Malboro     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Mateus      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Midgardsormr   :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Sargatanas    :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Siren      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Ultros      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Zalera      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> +<br> +■Europäische Welten<br> + × Cerberus     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Lich       :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Moogle      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Odin       :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Phoenix     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Ragnarok     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Shiva      :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> + × Zodiark     :vom 26. Jan. 2017, 7:00 Uhr (MEZ)<br> +Wartung aller Welten (26. Jan.): Früher Abgeschlossen14854222401485422365fe767f17bb086bc5428dba96d078dcb8bb9d3479Follow-up2Die Wartung wurde früher als geplant abgeschlossen.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit]<br> +Am 26. Jan. 2017 von 7 Uhr bis 10:15 Uhr (MEZ) <br> +<br> +[Betroffene Welten]<br> +Alle Welten<br> +Maßnahmen gegen RMT und andere unerlaubte Aktivitäten im Spiel (26. Jan.)148542087314854209860aef862a045b7fe223f6951de54dfd79b8e82dc51RMT und andere unerlaubte Aktivitäten zerstören die allgemeine Spielbalance sowie den Spaß am Spiel und werden als unrechtmäßige Aktivitäten angesehen, die gegen die Nutzervereinbarungen verstoßen.<br> +<br> +Die Anzahl der Spieler, denen unerlaubte Spielaktivitäten nachgewiesen werden konnten, ist wie folgt:<br> +<br> +Zeitraum: Vom 19. Jan. 2017 bis zum 25. Jan. 2017<br> +<br> +・Konten, die Sanktionen aufgrund von Werbung für RMT-Webseiten erhielten: 188<br> +・Konten, die Sanktionen aufgrund von RMT/unrechtmäßiger Aktivitäten erhielten: 16566<br> +・Konsequenz: Permanenter Ausschluß von FINAL FANTASY XIV<br> +<br> +Falls ihr andere Spieler beim Cheaten beobachtet, kontaktiert uns bitte direkt aus dem Spiel heraus, indem ihr vom System-Menü aus [Kundendienst / Infos] -> [Kontakt aufnehmen] -> [Unrechtmäßige Aktivitäten melden] auswählt.<br> +<br> +Wir werden weiterhin strikte Maßnahmen gegen RMT und andere unerlaubte Aktivitäten ergreifen. Bitte spielt verantwortungsbewusst, um nicht gegen die Nutzervereinbarung zu verstoßen.<br> +FINAL FANTASY XIV Versions-Update (26. Jan.)14854171751485417225f6d8c44ed9c66ab174fab5dd446903963f40a2713Ein FINAL FANTASY XIV Versions-Update wurde durchgeführt. <br> +<br> +* Clients werden nach deren Starten automatisch aktualisiert. <br> +<br> +[Datum & Uhrzeit] <br> +Am 26. Jan. 2017 um 8:12 Uhr (MEZ) <br> +<br> +Bitte folgt dem untenstehenden Link für weitere Informationen:<br> +<a href="http://sqex.to/8vH">http://sqex.to/8vH</a><br> +Wartung aller Welten (26. Jan.)1485238200148542205584aa16f2595b3b7c474a804f510b6605bfda20a0Maintenance2Zur folgenden Zeit werden wir, begleitend zu Patch 3.51, eine Wartung durchführen. Während dieses Zeitraums wird FINAL FANTASY XIV nicht spielbar sein. <br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.<br> +<br> +[Datum & Uhrzeit]<br> +Am 26. Jan. 2017 von 7 Uhr bis 11 Uhr (MEZ) <br> +* Änderungen der Wartungszeiten vorbehalten.<br> +<br> +[Betroffene Welten]<br> +Alle Welten<br> +<br> +* 30 Minuten vor Beginn der Wartung bis zu deren Abschluss wird der Weltentransferdienst nicht zur Verfügung stehen.<br> +<br> +* Beachtet bitte, dass es Spielern nicht möglich sein wird, Zeremonien des Ewigen Bundes vom Ende der Wartung bis zum 27. Januar 2017 um 10 Uhr (MEZ) zu reservieren.<br> +Technische Schwierigkeiten mit verschiedenen Arealen auf Brynhildr behoben (24. Jan.)148523172414852317790cedb3444ab6e078d1f63660a488cf0886598695Recovery4Wir freuen uns euch mitteilen zu können, dass die technischen Schwierigkeiten mit der untenstehenden Welt behoben wurden.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für eure Verständnis.<br> +<br> +[Datum & Uhrzeit] <br> +Am 24. Jan. 2017 von 4:32 Uhr bis 4:47 Uhr (MEZ) <br> +<br> +[Details] <br> +・Die unten angegebenen Areale der Welt Brynhildr waren unzugänglich<br> +<br> +[Ursache] <br> +Probleme mit der Serverausrüstung<br> +<br> +[Betroffene Welt] <br> +・Äußeres La Noscea<br> +・Gold Saucer<br> +・Strebewerk<br> +・Wallende Nebel<br> +・Bestimmte Bereiche in Häusern<br> +Technische Schwierigkeiten des Mana Datenzentrums behoben (22. Jan.)14850828291485082967f15a2cacbeb5baa1644195bffea61cbce6af9236Recovery4Wir freuen uns euch mitteilen zu können, dass die technischen Schwierigkeiten mit den untenstehenden Welten behoben wurden. <br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit] <br> +Am 22. Jan. 2017 von 9:16 Uhr bis 11:45 Uhr (MEZ)<br> +<br> +[Details]<br> +・Einloggen ist nicht möglich.<br> +・Areale können nicht gewechselt werden.<br> +・Betreten von instanziierten Inhalten ist nicht möglich. <br> +<br> +[Ursache] <br> +Probleme mit der Serversoftware<br> +<br> +[Betroffene Welten] <br> +Alle Welten des Mana Datenzentrums<br> +・Anima<br> +・Asura<br> +・Belias<br> +・Chocobo<br> +・Hades<br> +・Ixion<br> +・Mandragora<br> +・Masamune<br> +・Pandaemonium<br> +・Shinryu<br> +・Titan<br> +Notwartung des Mana-Datenzentrums (22. Jan.)14850768731485083118099e9177a41e4c1ab3c986c35c1d62ccfe7e1da6Maintenance2Wir werden eine Notwartung aller Welten des Mana-Datenzentrums durchführen. Während dieses Zeitraums werden diese Welten nicht verfügbar sein.<br> +<br> +* 30 Minuten vor Beginn der Wartung bis zu deren Abschluss wird der Weltentransferdienst nicht zur Verfügung stehen.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit]<br> +Am 22. Jan. 2017 von 10:30 Uhr bis 12 Uhr (MEZ)<br> +<br> + [Betroffene Welten]<br> +Alle Welten des Mana-Datenzentrums:<br> +・Anima<br> +・Asura<br> +・Belias<br> +・Chocobo<br> +・Hades<br> +・Ixion<br> +・Mandragora<br> +・Masamune<br> +・Pandaemonium<br> +・Shinryu<br> +・TitanTechnische Schwierigkeiten des Mana Datenzentrums (22. Jan.)1485074368148507441438dd1111b1a1c959066039a2caa156991eac5eda4Gegenwärtig gibt es technische Schwierigkeiten mit den untenstehenden Welten.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.<br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 22. Jan. 2017 um 9:16 Uhr (MEZ)<br> +<br> +[Details]<br> +・Einloggen ist nicht möglich.<br> +・Areale können nicht gewechselt werden.<br> +・Betreten von instanziierten Inhalten ist nicht möglich.<br> +<br> +[Ursache] <br> +Wird untersucht<br> +<br> +[Betroffene Welten] <br> +Alle Welten des Mana Datenzentrums<br> +・Anima<br> +・Asura<br> +・Belias<br> +・Chocobo<br> +・Hades<br> +・Ixion<br> +・Mandragora<br> +・Masamune<br> +・Pandaemonium<br> +・Shinryu<br> +・Titan<br> +Technische Schwierigkeiten des Mana Datenzentrums behoben (21. Jan.)148499161114849921168aa281daaf04c4ca4b2f43e5eedb0ab503ec537eRecovery4Wir freuen uns euch mitteilen zu können, dass die technischen Schwierigkeiten mit den untenstehenden Welten behoben wurden. <br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit] <br> +Am 21. Jan. 2017 von 7:35 Uhr bis 10:19 Uhr (MEZ)<br> +<br> +[Details]<br> +・Einloggen ist nicht möglich.<br> +・Areale können nicht gewechselt werden.<br> +・Betreten von instanziierten Inhalten ist nicht möglich. <br> +<br> +[Ursache] <br> +Probleme mit der Serversoftware<br> +<br> +[Betroffene Welten] <br> +Alle Welten des Mana Datenzentrums<br> +・Anima<br> +・Asura<br> +・Belias<br> +・Chocobo<br> +・Hades<br> +・Ixion<br> +・Mandragora<br> +・Masamune<br> +・Pandaemonium<br> +・Shinryu<br> +・TitanNotwartung des Mana-Datenzentrums (21. Jan.)148498441714849918448dbbd6c4bf84f996bd30138dbc317f87c24d0ae8Maintenance2Wir werden eine Notwartung aller Welten des Mana-Datenzentrums durchführen. Während dieses Zeitraums werden diese Welten nicht verfügbar sein.<br> +<br> +* 30 Minuten vor Beginn der Wartung bis zu deren Abschluss wird der Weltentransferdienst nicht zur Verfügung stehen.<br> +<br> +* Beachtet bitte, dass es Spielern auf den Welten des Mana-Datenzentrums nicht möglich sein wird, Zeremonien des Ewigen Bundes vom Ende der Wartung bis zum 27. Januar 2017 um 10 Uhr (MEZ) zu reservieren.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit]<br> +Am 21. Jan. 2017 von 8:30 Uhr bis 10 Uhr (MEZ)<br> +<br> + [Betroffene Welten]<br> +Alle Welten des Mana-Datenzentrums:<br> +・Anima<br> +・Asura<br> +・Belias<br> +・Chocobo<br> +・Hades<br> +・Ixion<br> +・Mandragora<br> +・Masamune<br> +・Pandaemonium<br> +・Shinryu<br> +・TitanTechnische Schwierigkeiten des Mana Datenzentrums (21. Jan.)14849825811484982635cb789f73d4f023948c46dfea32fab2939e1fb06c4Gegenwärtig gibt es technische Schwierigkeiten mit den untenstehenden Welten.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.<br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 21. Jan. 2017 um 7:35 Uhr (MEZ)<br> +<br> +[Details]<br> +・Einloggen ist nicht möglich.<br> +・Areale können nicht gewechselt werden.<br> +・Betreten von instanziierten Inhalten ist nicht möglich.<br> +<br> +[Ursache] <br> +Wird untersucht<br> +<br> +[Betroffene Welten] <br> +Alle Welten des Mana Datenzentrums<br> +・Anima<br> +・Asura<br> +・Belias<br> +・Chocobo<br> +・Hades<br> +・Ixion<br> +・Mandragora<br> +・Masamune<br> +・Pandaemonium<br> +・Shinryu<br> +・TitanTechnische Schwierigkeiten des Aether Datenzentrums behoben (20. Jan.)1484897102148489716437243fb93c19d2eb2da98865bb890a81efab5a1dRecovery4Wir freuen uns euch mitteilen zu können, dass die technischen Schwierigkeiten mit den untenstehenden Welten behoben wurden. <br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit] <br> +Am 20. Jan. 2017 von 5:13 Uhr bis 7:56 Uhr (MEZ) <br> +<br> +[Details] <br> +・Einloggen ist nicht möglich.<br> +・Areale können nicht gewechselt werden.<br> +・Betreten von instanziierten Inhalten ist nicht möglich.<br> +<br> +[Ursache] <br> +Probleme mit der Serversoftware<br> +<br> +[Betroffene Welten] <br> +Alle Welten des Aether Datenzentrums<br> +・Adamantoise<br> +・Balmung<br> +・Cactuar<br> +・Coeurl<br> +・Faerie<br> +・Gilgamesh<br> +・Goblin<br> +・Jenova<br> +・Mateus<br> +・Midgardsormr<br> +・Sargatanas<br> +・Siren<br> +・Zalera<br> +Notwartung des Aether-Datenzentrums (20. Jan.)14848896851484895618c96e7ae40e26d496677b421c75138c777691cf05Maintenance2Wir werden eine Notwartung aller Welten des Aether- Datenzentrums durchführen.Während dieses Zeitraums werden diese Welten nicht verfügbar sein.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit]<br> +Am 20. Jan. 2017 von 5:30 bis 7 Uhr (MEZ)<br> +<br> +[Betroffene Welten]<br> +Alle Welten des Aether-Datenzentrums:<br> +・Adamantoise<br> +・Balmung<br> +・Cactuar<br> +・Coeurl<br> +・Faerie<br> +・Gilgamesh<br> +・Goblin<br> +・Jenova<br> +・Mateus<br> +・Midgardsormr<br> +・Sargatanas<br> +・Siren<br> +・Zalera<br> +Technische Schwierigkeiten des Aether Datenzentrums (20. Jan.)14848887191484888767b3b129122337cd99563110c332723ebeeb3a976c4Gegenwärtig untersuchen wir technischen Schwierigkeiten, welche für Verbindungsprobleme mit bestimmten instanziierten Inhalten auf dem Aether Datenzentrum verantwortlich sind.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.<br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 20. Jan. 2017 um 5:13 Uhr (MEZ)<br> +<br> +[Details] <br> +・Einloggen ist nicht möglich.<br> +・Areale können nicht gewechselt werden.<br> +・Betreten von instanziierten Inhalten ist nicht möglich.<br> +<br> +[Ursache] <br> +Wird untersucht<br> +<br> +[Betroffene Welten] <br> +Alle Welten des Aether Datenzentrums<br> +・Adamantoise<br> +・Balmung<br> +・Cactuar<br> +・Coeurl<br> +・Faerie<br> +・Gilgamesh<br> +・Goblin<br> +・Jenova<br> +・Mateus<br> +・Midgardsormr<br> +・Sargatanas<br> +・Siren<br> +・ZaleraBekanntes Problem nach Patch 3.5 (19. Jan.)1484833791148483384962d02c99649a715a0c5bff04a3976f5605dfef931Wir konnten den folgenden Fehler feststellen.<br> +Der Fehler wird untersucht und wir bitten euch um Geduld und Verständnis, während wir an einer Lösung arbeiten.<br> +<br> +[Bekanntes Problem]<br> +・Wenn man den NPC nutzt, der einen Spieler von einem mit dem Unterkunftsgebiet verbundenen Gebiet zur privaten Unterkunft/Wohnung/Freien Gesellschaft transportiert, kann man unter Umständen in einem falschen Gebiet ankommen.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten.<br> +Bezüglich der Gruppenanmeldung für Dun Scaith (19. Jan.)148482376414848238253c0cd7ed9fca28a503561086551ce7f472076eea1Wir haben zahlreiche Meldungen über lange Wartezeiten für volle Trupps für den Inhalt „Dun Scaith“ erhalten. <br> +<br> +Nach einer Untersuchung konnten wir folgendes feststellen und wollen euch dieses erläutern.<br> +<br> +Im Allgemeinen werden Gruppen die sich für einen Inhalt anmelden vom System bevorzugt. Da der 24 Spieler-Raid jedoch nur 3 Plätze für Verteidiger hat, kann es aufgrund von hoher Belastung zu längeren Wartezeiten für Verteidiger kommen, die sich alleine für den neuen Allianz-Raid anmelden.<br> +<br> +Aus diesem Grund haben wir den Algorithmus für den 24 Spieler Raid mit Patch 3.5 angepasst, damit Verteidiger die sich sowohl alleine, als auch in einer Gruppe anmelden, in dieselbe Warteschlange kommen, welches die Wartezeiten für Verteidiger ausgleicht.<br> +<br> +Da „Dun Scaith“, zuzüglich zum neuen Algorithmus, momentan übermäßig ausgewählt wird, kommt es zu längeren Wartezeiten für Gruppen mit Verteidigern. Wir entschuldigen uns für etwaige Unannehmlichkeiten.<br> +<br> +Um dieses Problem so schnell wie möglich zu beheben, werden wir erneut den Anmeldealgorithmus verwenden, welcher vor Patch 3.5 aktiv war. Wir bitten euch bis dahin um eure Geduld und euer Verständnis.<br> +Maßnahmen gegen RMT und andere unerlaubte Aktivitäten im Spiel (19. Jan.)14848198751484819939be8b456f0e58f0c7b3e985f4123ce652f9d6b0291RMT und andere unerlaubte Aktivitäten zerstören die allgemeine Spielbalance sowie den Spaß am Spiel und werden als unrechtmäßige Aktivitäten angesehen, die gegen die Nutzervereinbarungen verstoßen.<br> +<br> +Die Anzahl der Spieler, denen unerlaubte Spielaktivitäten nachgewiesen werden konnten, ist wie folgt:<br> +<br> +Zeitraum: Vom 12. Jan. 2017 bis zum 18. Jan. 2017<br> +<br> +・Konten, die Sanktionen aufgrund von Werbung für RMT-Webseiten erhielten: 247<br> +・Konten, die Sanktionen aufgrund von RMT/unrechtmäßiger Aktivitäten erhielten: 23,247<br> +・Konsequenz: Permanenter Ausschluß von FINAL FANTASY XIV<br> +<br> +・Konten, die Sanktionen aufgrund von Teilnahme an RMT/unrechtmäßigen Aktivitäten erhielten: 6<br> +・Konsequenz: Temporäre Suspendierung von FINAL FANTASY XIV<br> +<br> +Falls ihr andere Spieler beim Cheaten beobachtet, kontaktiert uns bitte direkt aus dem Spiel heraus, indem ihr vom System-Menü aus [Kundendienst / Infos] -> [Kontakt aufnehmen] -> [Unrechtmäßige Aktivitäten melden] auswählt.<br> +<br> +Wir werden weiterhin strikte Maßnahmen gegen RMT und andere unerlaubte Aktivitäten ergreifen. Bitte spielt verantwortungsbewusst, um nicht gegen die Nutzervereinbarung zu verstoßen.Gaia Datenzentrum Gruppensuche Rekrutierungsfunktion: Notwartung (19.Jan.)148481765614848209630d182e9c810acf09a6d52d9bf515a3a208eec554Maintenance2Zur Behebung des Fehlers beim Rekrutieren über die Gruppensuche, wodurch manche Welten nicht auf dem Gaia Datenzentrum angezeigt wurden, werden wir eine Notwartung an der Gruppensuche durchführen. Während dieser Wartung wird die Gruppensuche nicht verfügbar sein.<br> +<br> +*Alle anderen Funktionen sind weiterhin nutzbar.<br> +<br> +Desweiteren werden beim Start der Notwartung alle Gruppen die über die Gruppensuche zusammengestellt wurden aufgelöst werden. Wir entschuldigen uns für etwaige Unannehmlichkeiten die hierdurch entstehen können.<br> +<br> +*Alle Gruppen die durch die Gruppensuche zusammengestellt wurden und in einem Inhalt beigetreten sind werden beim beenden des Inhalts aufgelöst werden.<br> +<br> +[Datum & Uhrzeit]<br> +Am 19. Jan, 2017 11 bis 11:10 Uhr (MEZ)<br> +<br> +[Betroffene Welten]<br> +Alle Welten des Gaia Datenzentrums<br> +・Alexander<br> +・Bahamut<br> +・Durandal<br> +・Fenrir<br> +・Ifrit<br> +・Ridill<br> +・Tiamat<br> +・Ultima<br> +・Valefor<br> +・Yojimbo<br> +・Zeromus<br> +FINAL FANTASY XIV Versions-Update (19. Jan.)14848160061484821267faa3ac761ad713ac9d8bc4733c216118cade74e93Ein FINAL FANTASY XIV Versions-Update wurde durchgeführt. <br> +* Clients werden nach deren Starten automatisch aktualisiert. <br> +<br> +[Datum & Uhrzeit] <br> +Am 19. Jan. 2017 um 9:30 Uhr (MEZ) <br> +<br> +[Update Details]<br> +◆FINAL FANTASY XIV Hotfixes (19. Jan. 2017)◆<br> +<br> +■Die folgenden Probleme wurde behoben.<br> +<br> +-Wenn bereits alle Voraussetzungen für eine in Patch 3.5 eingeführte Errungenschaft von Sammlern oder Handwerkern vor dem Patch erfüllt worden war, so wurde die Errungenschaft nicht korrekt anerkannt.<br> +*Das bekannte Problem mit der Minenarbeiter-Errungenschaft wird weiterhin untersucht. Wir bedanken uns für eure fortgesetzte Geduld während wir an einer Lösung dieses Problems arbeiten.<br> +<br> +-Für alle Transaktionen am Marktbrett wurde die gleiche Steuer erhoben, unabhängig von dem Stadtstaat, in dem der Gegenstand verkauft beziehungsweise gekauft wurde.<br> +<br> +-Ein Gesuch in der Gruppensuche konnte unter bestimmten Bedingungen nicht mehr vom Gruppenanführer bearbeitet werden.<br> +<br> +-In Wohnbezirken wurde die Orientierung des Zielrings von Trainingspuppen nicht korrekt dargestellt, nachdem die Position der Trainingspuppe geändert worden war.<br> +<br> +・Das Angeln im Äußeren La Noscea konnte den Server unter bestimmtem Bedingungen zum Abstürzen bringen.<br> +*Als vorrübergehende Lösung des Problems, haben wir die Möglichkeit zu angeln am Bronzesee-Nordufer im Äußeren La Noscea deaktiviert. Das Problem wird im Laufe der nächsten Woche behoben. Währenddessen wollen wir euch darauf hinweisen, dass dieselben Fische auch am Bronzesee-Nordufer im Oberen La Noscea geangelt werden können. Wir bitten euch daher stattdessen dort zu angeln, bis das Problem behoben wird.<br> +<br> +-Der Server konnte unter bestimmten Bedingungen abstürzen.<br> +Wartung aller Welten (19. Jan.): Früher Abgeschlossen148481505714848151093c04f5037bebcfb09f2afaeff044ee251dee4dc7Follow-up2Die Wartung wurde früher als geplant abgeschlossen.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit]<br> +Am 19. Jan. 2017 von 7 Uhr bis 9:30 Uhr (MEZ) <br> +<br> +[Betroffene Welten]<br> +Alle Welten<br> +Technische Schwierigkeiten des Aether Datenzentrums behoben (18. Jan.)14847832531484784150e67a53c035d1b439ef9498c1167e38a64c893db5Recovery4Wir freuen uns euch mitteilen zu können, dass die technischen Schwierigkeiten mit dem Aether Datenzentrum behoben wurden. <br> +<br> +* Der Weltentransferdienst kann nun wieder verwendet werden.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit] <br> +Vom 18. Jan. 2017 um 21:27 Uhr bis zum 19. Jan. 2017 um 0:25 Uhr (MEZ) <br> +<br> +[Details] <br> +・Einloggen war nicht möglich.<br> +・Areale konnten nicht gewechselt werden.<br> +・Betreten von instanziierten Inhalten war nicht möglich.<br> +<br> +[Ursache] <br> +Probleme mit der Serversoftware<br> +<br> +[Betroffene Welten] <br> +Alle Welten des Aether Datenzentrums<br> +・Adamantoise<br> +・Balmung<br> +・Cactuar<br> +・Coeurl<br> +・Faerie<br> +・Gilgamesh<br> +・Goblin<br> +・Jenova<br> +・Mateus<br> +・Midgardsormr<br> +・Sargatanas<br> +・Siren<br> +・ZaleraNotwartung des Aether-Datenzentrums (18. Jan.)148477503614847755821a5b75eb42176623b4f5f8c99d16a5ad35e36f34Maintenance2<br> +Wir werden eine Notwartung aller Welten des Aether- Datenzentrums durchführen.Während dieses Zeitraums werden diese Welten nicht verfügbar sein.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit]<br> +Vom 18. Jan. 2017 um 22:40 Uhr bis zum 19. Jan. 2017 um 0:10 Uhr (MEZ)<br> +<br> + [Betroffene Welten]<br> +Alle Welten des Aether-Datenzentrums:<br> +・Adamantoise<br> +・Balmung<br> +・Cactuar<br> +・Coeurl<br> +・Faerie<br> +・Gilgamesh<br> +・Goblin<br> +・Jenova<br> +・Mateus<br> +・Midgardsormr<br> +・Sargatanas<br> +・Siren<br> +・Zalera<br> +Technische Schwierigkeiten des Aether Datenzentrums (18. Jan.)148477495314847749709d10ff3fd068401c528a300c890d0f7b155a178a4Gegenwärtig gibt es technische Schwierigkeiten mit den untenstehenden Welten.<br> +Das Problem wird derzeit untersucht und neue Informationen werden bekanntgegeben, sobald diese zur Verfügung stehen.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.<br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 18. Jan. 2017 um 21:27 Uhr (MEZ)<br> +<br> +[Details] <br> +・Verbindung zu bestimmten instanziierten Inhalten unterbrochen<br> +・Wiedereinloggen ist nicht möglich<br> +<br> +[Ursache] <br> +Wird untersucht<br> +<br> +[Betroffene Welten] <br> +Alle Welten des Aether Datenzentrums<br> +・Adamantoise<br> +・Balmung<br> +・Cactuar<br> +・Coeurl<br> +・Faerie<br> +・Gilgamesh<br> +・Goblin<br> +・Jenova<br> +・Mateus<br> +・Midgardsormr<br> +・Sargatanas<br> +・Siren<br> +・ZaleraBekannte Probleme nach Patch 3.5 (18. Jan.)148474508714847451630b4fb28f632dd28fd45d976f1f6974fadfe12e301Wir konnten nach der Veröffentlichung von Patch 3.5 die folgenden Fehler feststellen.<br> +Die Fehler werden untersucht und wir bitten euch um Geduld und Verständnis, während wir an einer Lösung arbeiten.<br> +<br> +[Bekannte Probleme]<br> +<br> +- Wenn das Verhältnis zu einem Wilden Stamm der 3.0 Gebiete über „Verbündet“ liegt, wird die Option „Waren (Verbündet)“ nicht angezeigt und Gegenstände bei den Wilden Stämmen der 2.0 Gebiete können nicht erworben werden.<br> +*Spieler, deren Verhältnis zu den Wilden Stämmen der 2.0 Gebiete unter „Verbündet“ liegt, sind nicht von diesem Problem betroffen.<br> +<br> +- Der Gegenstand „Mörchel“ kann unter Umständen nicht bei einer Scheine-Wechslerin in Frohehalde eingetauscht werden, wenn der Bonus (★-Marke) angezeigt ist.<br> +<br> +- Die Name der folgenden Notenrolle ist falsch:<br> +(Falsch) Notenrolle von „Bathed in Woodsin“<br> +<br> +- Der Abstand zwischen den Kommandoslots des Kommandomenüs ist zu groß, wenn die Anzeige auf [1x12] eingestellt ist.<br> +<br> +- Das Wechseln einer Zone während man Details der Gruppensuche bearbeitet kann unter Umständen zu Fehlanzeigen der Gruppendetails führen.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.<br> +Wartung aller Welten (19. Jan.)148471772414848154329fc7402cb10ac8c1d7245a20ea2fcda39c33705eMaintenance2Zur folgenden Zeit werden wir, begleitend zum Patch 3.5 Hotfix, eine Wartung aller Welten durchführen. Während dieses Zeitraums wird FINAL FANTASY XIV nicht spielbar sein.<br> +<br> +* 30 Minuten vor Beginn der Wartung wird der Weltentransferdienst nicht zur Verfügung stehen.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.<br> +<br> +[Datum & Zeit]<br> +Am 19. Jan. 2017 von 7 Uhr bis 11 Uhr (MEZ)<br> +* Änderungen der Wartungszeiten vorbehalten. <br> +<br> +[Betroffene Welten] <br> +Alle Welten Bekannte Probleme mit Errungenschaften nach Patch 3.5 (17. Jan.)14846585861484833226c49238e29e77fbee71c52f7aa5522f87aa0a7e7d1Wir konnten nach der Veröffentlichung von Patch 3.5 die folgenden Fehler feststellen.<br> +<br> +- Spieler können Errungenschaften für Handwerker und Sammler die in Patch 3.5 implementiert wurden nicht freischalten falls die Bedingungen hierfür vor dem Patch erfüllt wurden.<br> +<br> +- Spieler können momentan nicht eine Errungenschaft des Minenarbeiters freischalten, da die Vorraussetzungen fehlerhaft sind.<br> +<br> +Die Probleme werden untersucht und wir bitten euch um Geduld und Verständnis, während wir an einer Lösung arbeiten.<br> +<br> +*Update vom 19. Jan. 2017 um 14:10 Uhr (MEZ): <br> +Das folgende Problem wurde in der Wartung am 19. Jan. 2017 von 7 bis 9:30 Uhr (MEZ) behoben: <br> +Errungenschaften für Handwerker und Sammler, die in Patch 3.5 implementiert wurden, wurden nicht korrekt freigeschaltet.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten.<br> +Gruppensuche Rekrutierungsfunktion Notwartung (17.Jan.)14846540631484655546d2502bcf1ebf0401348175ae53930c8394f88484Maintenance2Zur Behebung des Fehlers beim Rekrutieren über die Gruppensuche, wodurch manche Welten nicht angezeigt wurden, werden wir eine Notwartung an der Gruppensuche durchführen. Während dieser Wartung wird die Gruppensuche nicht verfügbar sein.<br> +<br> +*Alle anderen Funktionen sind weiterhin nutzbar.<br> +<br> +Desweiteren werden beim Start der Notwartung alle Gruppen die über die Gruppensuche zusammengestellt wurden aufgelöst werden. Wir entschuldigen uns für etwaige Unannehmlichkeiten die hierdurch entstehen können.<br> +<br> +*Alle Gruppen die durch die Gruppensuche zusammengestellt wurden und in einem Inhalt beigetreten sind werden beim beenden des Inhalts aufgelöst werden.<br> +<br> +[Datum & Uhrzeit]<br> +17. Jan, 2017 13:00 bis 13:15 Uhr (MEZ)<br> +<br> +[Betroffene Funktionen]<br> +FINAL FANTASY XIV Gruppensuche<br> +Bekannte Probleme nach Patch 3.5 (17. Jan.)14846530351484663994443e4d057578f445d28ae686a15102282dc892581Wir konnten nach der Veröffentlichung von Patch 3.5 den folgenden Fehler feststellen.<br> +Der Fehler wird untersucht und wir bitten euch um Geduld und Verständnis, während wir an einer Lösung arbeiten.<br> +<br> +[Bekanntes Problem]<br> +Beim Rekrutieren über die Gruppensuche, wenn andere Welten des Datenzentrums involviert sind werden manche Welten nicht in der Liste angezeigt.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für eure Geduld.<br> +<br> +*Update: 17. Jan. 2017<br> +Dieses Problem wurde während der Notwartung der Gruppensuche am 17. Jan. 2017 zwischen 13:00 und 13:15 Uhr (MEZ) behoben.<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten die durch dieses Problem entstanden sind und danken euch für eure Geduld.<br> +Bezüglich des Libra Eorzea Updates und der Einstellung gewisser Funktionen (19. Jun.): Folgenews 614846473491484647430938701fd2bdd12d1f51708b8be5f9ccce5ee25ebFollow-up1Zur unten angegebenen Zeit wurde eine Aktualisierung der iOS/Android App "FINAL FANTASY XIV: Libra Eorzea" mit den Informationen von Patch 3.5 durchgeführt.<br> +<br> +Bei dieser Aktualisierung handelt es sich um eine temporäre Maßnahme um die andauernde Entwicklungsphase einer neuen App zu überbrücken, welche "FINAL FANTASY XIV: Libra Eorzea" letztendlich ersetzen wird, weshalb die Login-Funktion weiterhin deaktiviert ist.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.<br> +<br> +[Bekannte Probleme]<br> +Die Beschreibungen zu den Voraussetzungen um „PvP“ über Zufallsinhalt aus dem Menü beizutreten, werden inkorrekt dargestellt.<br> +- A Realm Reborn > The Fold (zufällige Gruppe)<br> +- Heavensward > The Feast (8 gegen 8, zufällige Gruppe)<br> +- Heavensward > The Feast (4 gegen 4, Solo)<br> +<br> +[Datum & Uhrzeit]<br> +Am 17. Jan. 2016 um 9:45 Uhr (MEZ)<br> +<br> +[Betroffener Dienst]<br> +・Alle iOS/Android "FINAL FANTASY XIV: Libra Eorzea" Nutzer<br> +<br> +* Bitte folgt dem untenstehenden Link für weitere Informationen:<br> +<a href="http://sqex.to/9aL">http://sqex.to/9aL</a>Update des Lodestone (17. Jan.)14846454441484645547dec978253918982a6a58f1f5b7e21c813ff764f33Ein Update des Lodestone wurde durchgeführt.<br> +<br> +[Datum & Uhrzeit]<br> +Am 17. Jan. 2017 um 9:30 Uhr (MEZ) <br> +<br> +Bitte folgt dem untenstehenden Link für weitere Informationen:<br> +<a href="http://sqex.to/Nq-">http://sqex.to/Nq-</a><br> +Wartung des Lodestone (17. Jan.): Abgeschlossen 1484644838148464511066aa51f14b963ae0e854137c9d3ebad519672cfbFollow-up2Die Folgewartung des Lodestones begleitend zu Patch 3.5 wurde um 9:30 Uhr (MEZ) abgeschlossen.<br> +<br> +[Datum & Uhrzeit]<br> +Am 17. Jan. 2017 von 7:00 Uhr bis um 9:30 Uhr (MEZ)<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.Wartung aller Welten (16.-17. Jan.): Früher Abgeschlossen14846409511484641212deb9057ce5469aab8365051945efbfdaad2028e0Follow-up2Die Wartung wurde früher als geplant abgeschlossen.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit]<br> +Vom 16. Jan. 2017 um 11 Uhr bis zum 17. Jan. 2017 um 9:15 Uhr (MEZ) <br> +<br> +[Betroffene Welten und Dienste]<br> +Alle Welten <br> +Mogry-StationFINAL FANTASY XIV Versions-Update (17. Jan.)14846313001484631606d86726a7d66ae042f62e233559d1855179d957c43Ein FINAL FANTASY XIV Versions-Update wurde durchgeführt. <br> +<br> +* Clients werden nach deren Starten automatisch aktualisiert. <br> +<br> +[Datum & Uhrzeit] <br> +Am 17. Jan. 2017 um 6 Uhr (MEZ) <br> +<br> +Bitte folgt dem untenstehenden Link für weitere Informationen:<br> +<a href="http://sqex.to/X2S">http://sqex.to/X2S</a><br> +Technische Probleme des Support Centers behoben (Jan. 16)1484566066148456620204ec6f791eecb31f64216ea1999e449bc126ba2aRecovery4Zur untenstehenden Uhrzeit gab es technische Schwierigkeiten wodurch Spieler nicht auf das SQUARE ENIX Support Center zugreifen konnten.<br> +<br> +Wir freuen uns euch mitteilen zu können, dass die untenstehenden technischen Schwierigkeiten behoben wurden. <br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.<br> + <br> +[Datum & Uhrzeit]<br> +Am 16. Jan. 2017 von 9:51 Uhr bis 10:16 Uhr (MEZ)<br> + <br> +[Details]<br> +SQUARE ENIX Support Center war zeitweise nicht verfügbar<br> +<br> +[Ursache] <br> +Probleme mit der Server-Konfiguration<br> +Technische Schwierigkeiten aller Welten des NA Datenzentrums behoben (16. Jan.)1484544724148454620191487c69c7ccd5aaa63d623e370dca3bbfbabd02Recovery4Während der unten angegebenen Zeit kam es zu technischen Schwierigkeiten mit Welten des NA Datenzentrums, aufgrund derer es bei Spielern zu Verbindungsabbrüchen und -Problemen beim Wiedereinloggen in bestimmten instanzierten Inhalten kam. <br> +<br> +Wir freuen uns euch mitteilen zu können, dass dieses Problem behoben wurde und entschuldigen uns für etwaige Unannehmlichkeiten. <br> +<br> +[Datum & Zeit] <br> +Am 16. Jan. 2017 von 4:01 Uhr bis 4:53 Uhr (GMT)<br> +<br> +[Details] <br> +・Verbindungsabbrüche und -Probleme beim Wiedereinloggen in bestimmten instanzierten Inhalten<br> +<br> +[Ursache] <br> +Probleme mit der Serverausrüstung<br> +<br> +[Betroffene Welten] <br> +Welten des NA Datenzentrums<br> +・Adamantoise<br> +・Balmung<br> +・Behemoth<br> +・Brynhildr<br> +・Cactuar<br> +・Coeurl<br> +・Diabolos<br> +・Excalibur<br> +・Exodus<br> +・Faerie<br> +・Famfrit<br> +・Gilgamesh<br> +・Goblin<br> +・Hyperion<br> +・Jenova<br> +・Lamia<br> +・Leviathan<br> +・Malboro<br> +・Mateus<br> +・Midgardsormr<br> +・Sargatanas<br> +・Siren<br> +・Ultros<br> +・Zalera<br> +Technische Schwierigkeiten aller Welten des NA Datenzentrums(16. Jan.)148454348614845436329386dcb400181d2bbc9d96f8e2c04385a95f739e4<br> +Gegenwärtig gibt es technische Schwierigkeiten mit allen Welten des NA Datenzentrums, aufgrund derer Spieler Verbindungsabbrüche und -Probleme beim wieder Einloggen in bestimmen instanzierten Inhalten haben.<br> +<br> +Das Problem wird derzeit untersucht und neue Informationen werden bekanntgegeben, sobald diese zur Verfügung stehen.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten.<br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 16. Jan. 2017 um 4:01 Uhr (GMT)<br> +<br> +[Details] <br> +・Verbindungsabbrüche und Probleme beim wieder Einloggen in bestimmen instanzierten Inhalten<br> +<br> +[Ursache] <br> +Wird untersucht<br> +<br> +[Betroffene Welten] <br> +Welten des NA Datenzentrums<br> +・Adamantoise<br> +・Balmung<br> +・Behemoth<br> +・Brynhildr<br> +・Cactuar<br> +・Coeurl<br> +・Diabolos<br> +・Excalibur<br> +・Exodus<br> +・Faerie<br> +・Famfrit<br> +・Gilgamesh<br> +・Goblin<br> +・Hyperion<br> +・Jenova<br> +・Lamia<br> +・Leviathan<br> +・Malboro<br> +・Mateus<br> +・Midgardsormr<br> +・Sargatanas<br> +・Siren<br> +・Ultros<br> +・Zalera<br> +FINAL FANTASY XIV Bestimmungen für die Verwendung von Unterlagen überarbeitet 14842974701484297537f8e0d4b8671ead323fc775ca7c5367873f46ade91Die FINAL FANTASY XIV Bestimmungen für die Verwendung von Unterlagen wurden überarbeitet, um das Album "FINAL FANTASY XIV : Duality ~Arrangement Album~" (erschienen am 7. Dez. 2016) als verwendbare Unterlage miteinzuschließen.<br> +<br> +Die FINAL FANTASY XIV Bestimmungen für die Verwendung von Unterlagen können auf dem Square Enix Support-Center gefunden werden, siehe untenstehende Adresse. Stellt bitte sicher, die Regeln für die Nutzung der Unterlagen genau durchzulesen bevor ihr lizensierte Unterlagen nutzt.<br> +<a href="http://sqex.to/V9-">http://sqex.to/V9-</a><br> +Maßnahmen gegen RMT und andere unerlaubte Aktivitäten im Spiel (12. Jan.)148420896214842090078204bed945ac94f2a19b290fce2b1f2d9a4294bd1RMT und andere unerlaubte Aktivitäten zerstören die allgemeine Spielbalance sowie den Spaß am Spiel und werden als unrechtmäßige Aktivitäten angesehen, die gegen die Nutzervereinbarungen verstoßen.<br> +<br> +Die Anzahl der Spieler, denen unerlaubte Spielaktivitäten nachgewiesen werden konnten, ist wie folgt:<br> +<br> +Zeitraum: Vom 5. Jan. 2017 bis zum 11. Jan. 2017<br> +<br> +・Konten, die Sanktionen aufgrund von Werbung für RMT-Webseiten erhielten: 433<br> +・Konten, die Sanktionen aufgrund von RMT/unrechtmäßiger Aktivitäten erhielten: 38,472<br> +・Konsequenz: Permanenter Ausschluß von FINAL FANTASY XIV<br> +<br> +・Konten, die Sanktionen aufgrund von Teilnahme an RMT/unrechtmäßigen Aktivitäten erhielten: 11<br> +・Konsequenz: Temporäre Suspendierung von FINAL FANTASY XIV<br> +<br> +Falls ihr andere Spieler beim Cheaten beobachtet, kontaktiert uns bitte direkt aus dem Spiel heraus, indem ihr vom System-Menü aus [Kundendienst / Infos] -> [Kontakt aufnehmen] -> [Unrechtmäßige Aktivitäten melden] auswählt.<br> +<br> +Wir werden weiterhin strikte Maßnahmen gegen RMT und andere unerlaubte Aktivitäten ergreifen. Bitte spielt verantwortungsbewusst, um nicht gegen die Nutzervereinbarung zu verstoßen.<br> +Wartung des Lodestone (16-17. Jan.)14839584001484644142c56051f06010e26d8e56cc4654f34a81286e050bMaintenance2Begleitend zur Einführung von Patch 3.5, werden wir zu untenstehenden Zeiten eine Wartung des Lodestone durchführen.<br> +Dies wird gewisse Auswirkungen auf Dienste von FINAL FANTASY XIV haben, weiteres dazu unten.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.<br> +<br> +[Datum & Zeit]<br> +<br> +Am 16. Jan. 2017 von 11 Uhr bis 19 Uhr (MEZ)<br> +Einzelheiten: <br> +- Wartung des Lodestone zur Einführung von Patch 3.5<br> +<br> +Auswirkungen: Spielern wird es nicht möglich sein, sich in den Lodestone einzuloggen *Wenn ihr euch vor der Wartung auf der Hauptseite eures Charakters auf dem Lodestone einloggt, werdet ihr während der Wartung eingeloggt bleiben können.<br> +*Informationen zu Charakteren der EU Datenzentren auf dem Lodestone werden während der Wartung nicht verfügbar sein und werden nach der Wartung graduell aktualisiert werden, was unter Umständen etwas dauern wird.<br> +<br> +Vom 16. Jan. 2017 um 19 Uhr bis zum 17. Jan. 2017 um 11 Uhr (MEZ)<br> +Einzelheiten:<br> +- Systemupdates für den Lodestone begleitend zu Patch 3.5 für FINAL FANTASY XIV <br> +<br> +Auswirkungen: Spielern wird es nicht möglich sein auf den Lodestone zuzugreifen *Neuigkeiten und Artikel werden trotzdem zur Verfügung stehen.<br> +<br> +*Änderung der Wartungszeiten vorbehalten.<br> +<br> +[Betroffene Dienste]<br> +・Der Lodestone<br> +Wartung aller Welten (16-17. Jan.)148395812114846418918d4f1e506b9e837b83e42dc2c1aa51d5acdb95f4Maintenance2Zur folgenden Zeit werden wir, begleitend zu Patch 3.5, eine Wartung durchführen. Während dieses Zeitraums wird FINAL FANTASY XIV nicht spielbar sein. <br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.<br> +<br> +[Datum & Uhrzeit]<br> +Vom 16. Jan. 2017 um 11 Uhr bis zum 17. Jan. 2017 um 11 Uhr (MEZ)<br> +* Änderungen der Wartungszeiten vorbehalten.<br> +<br> +[Betroffene Welten]<br> +Alle Welten<br> +<br> +* Die folgenden Dienste der Mogry-Station werden 30 Minuten vor dem Beginn der Wartung bis zu deren Abschluss nicht verfügbar sein.<br> +・Weltentransferdienst<br> +・Charakterumbenennung<br> +・Mogry-Kiosk<br> +・Eingabe von Gegenstands- und Geschenkcodes<br> +<br> +* Beachtet bitte, dass es Spielern nicht möglich sein wird, Zeremonien des Ewigen Bundes vom Ende der Wartung bis zum 20. Januar 2017 um 10 Uhr (MEZ) zu reservieren.Technische Schwierigkeiten des Chaos Datenzentrums behoben (8. Jan.)14838912911483891339a6e00e05dfeda8c39d7ed57b2cd2daff6f3c6d4fRecovery4Wir freuen uns euch mitteilen zu können, dass die technischen Schwierigkeiten mit den untenstehenden Welten behoben wurden. <br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit] <br> +Am 8. Jan. 2017 von 16:22 Uhr bis 16:41 Uhr (MEZ) <br> +<br> +[Details] <br> +・Verbindung zu bestimmten instanziierten Inhalten unterbrochen und Wiedereinloggen war nicht möglich <br> +<br> +[Ursache] <br> +Probleme mit der Serversoftware<br> +<br> +[Betroffene Welten] <br> +Alle Welten des Chaos Datenzentrums<br> +・Cerberus<br> +・Lich<br> +・Moogle<br> +・Odin<br> +・Phoenix<br> +・Ragnarok<br> +・Shiva<br> +・ZodiarkVorübergehende Aussetzung des europäischen GM-Hilfsdiensts (6. Jan.)148363832114836383733f48955f68a7ee3ce28dc0fc23cce04158a3d2bc1Zur folgenden Zeit wird der GM-Hilfsdienst aufgrund einer internen Netzwerk-Wartung nicht zur Verfügung stehen. Die europäischen GMs werden nicht in der Lage sein, eure Anfragen zu bearbeiten. <br> + <br> +Für dringende Angelegenheiten ist der nordamerikanische GM-Dienst wie gewohnt verfügbar und Spieler werden weiterhin in der Lage sein, Anfragen zu senden. Seid euch bitte dessen bewusst, dass der Dienst nur in Englisch verfügbar sein wird und es zu Verzögerungen kommen kann, bis die GM-Anfragen beantwortet werden.<br> + <br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken für euer Verständnis.<br> + <br> +[Datum & Zeit]<br> +Vom 6. Jan. 2017 um 19 Uhr bis zum 9. Jan. 2017 um 10:30 Uhr (MEZ)<br> + <br> +[Betroffene Dienste]<br> +Die europäischen GM-Hilfsdienste für FINAL FANTASY XI und FINAL FANTASY XIV<br> + <br> +[Ursache]<br> +Interne NetzwerkwartungMaßnahmen gegen RMT und andere unerlaubte Aktivitäten im Spiel (5. Jan.)148360538914836055173ee72d31a08dfb77390d60be3616916b676652351RMT und andere unerlaubte Aktivitäten zerstören die allgemeine Spielbalance sowie den Spaß am Spiel und werden als unrechtmäßige Aktivitäten angesehen, die gegen die Nutzervereinbarungen verstoßen.<br> +<br> +Die Anzahl der Spieler, denen unerlaubte Spielaktivitäten nachgewiesen werden konnten, ist wie folgt:<br> +<br> +Zeitraum: Vom 22. Dez. 2016 bis zum 4. Jan. 2016<br> +<br> +・Konten, die Sanktionen aufgrund von Werbung für RMT-Webseiten erhielten: 1,232<br> +・Konten, die Sanktionen aufgrund von RMT/unrechtmäßiger Aktivitäten erhielten: 47,989<br> +・Konsequenz: Permanenter Ausschluß von FINAL FANTASY XIV<br> +<br> +Falls ihr andere Spieler beim Cheaten beobachtet, kontaktiert uns bitte direkt aus dem Spiel heraus, indem ihr vom System-Menü aus [Kundendienst / Infos] -> [Kontakt aufnehmen] -> [Unrechtmäßige Aktivitäten melden] auswählt.<br> +<br> +Wir werden weiterhin strikte Maßnahmen gegen RMT und andere unerlaubte Aktivitäten ergreifen. Bitte spielt verantwortungsbewusst, um nicht gegen die Nutzervereinbarung zu verstoßen.<br> +Technische Schwierigkeiten des Gaia Datenzentrums behoben (3. Jan.)14834346321483434718c90d9d434860849c4d836be84df4f0f90ae0cba0Recovery4Wir freuen uns euch mitteilen zu können, dass die technischen Schwierigkeiten mit den untenstehenden Welten behoben wurden. <br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 3. Jan. 2017 um 8:54 Uhr (MEZ) <br> +<br> +[Details] <br> +・Verbindung zu bestimmten instanziierten Inhalten unterbrochen und Wiedereinloggen war nicht möglich <br> +<br> +[Ursache] <br> +Probleme mit der Serverausrüstung<br> +<br> +[Betroffene Welten] <br> +Alle Welten des Gaia Datenzentrums<br> +・Alexander<br> +・Bahamut<br> +・Durandal<br> +・Fenrir<br> +・Ifrit<br> +・Ridill<br> +・Tiamat<br> +・Ultima<br> +・Valefor<br> +・Yojimbo<br> +・Zeromus<br> +Technische Schwierigkeiten des Gaia Datenzentrums behoben (30. Dez.)148308531814830853846ec3699a3b6148e43b95456f5b012bd965b70d0cRecovery4Wir freuen uns euch mitteilen zu können, dass die technischen Schwierigkeiten mit den untenstehenden Welten behoben wurden. <br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit] <br> +Am 30. Dez. 2016 von 8:20 Uhr bis 8:44 Uhr (MEZ) <br> +<br> +[Details] <br> +・Verbindung zu bestimmten instanziierten Inhalten unterbrochen und Wiedereinloggen war nicht möglich <br> +<br> +[Ursache] <br> +Probleme mit der Serversoftware<br> +<br> +[Betroffene Welten] <br> +Alle Welten des Gaia Datenzentrums<br> +・Alexander<br> +・Bahamut<br> +・Durandal<br> +・Fenrir<br> +・Ifrit<br> +・Ridill<br> +・Tiamat<br> +・Ultima<br> +・Valefor<br> +・Yojimbo<br> +・Zeromus<br> +Technische Schwierigkeiten auf Midgardsormr behoben (29. Dez.)148305257114830527201a3d4236618d83b45e6e100b175e3fcbf3fe75abRecovery4<br> +Wir freuen uns euch mitteilen zu können, dass die technischen Schwierigkeiten mit der untenstehenden Welt behoben wurden.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.<br> +<br> +[Datum & Uhrzeit] <br> +Am 29. Dez. 2016 von 20:07 Uhr bis 21:02 Uhr (MEZ) <br> +<br> +[Details] <br> +・Spielern war es nicht möglich, Midgardsormr zu betreten oder dorthin transferiert zu werden <br> +<br> +[Ursache] <br> +Probleme mit der Serverausrüstung<br> +<br> +[Betroffene Welt] <br> +Midgardsormr<br> +<br> +Technische Schwierigkeiten auf Midgardsormr (29. Dez.)14830404651483040609fbe0206a5abf9e23536ec01e6af617cffd08eafd4<br> +Gegenwärtig gibt es technische Schwierigkeiten mit der untenstehenden Welt. <br> +Das Problem wird derzeit untersucht und weitere Informationen werden bekanntgegeben, sobald sie verfügbar sind. <br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für eure Verständnis. <br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 29. Dez. 2016 um 20:07 Uhr (MEZ)<br> +<br> +[Details] <br> +・Es ist nicht möglich, Midgardsormr zu betreten oder dorthin transferiert zu werden<br> +<br> +[Ursache] <br> +Wird untersucht<br> +<br> +[Betroffene Welt] <br> +Midgardsormr<br> +Wartung der Mogry-Station (27. Dez.) 14826282001482802774175a341b8929b1609b272d8194e7326415a69af9Maintenance2Zur folgenden Zeit werden wir eine Wartung durchführen.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.<br> +<br> +[Datum & Uhrzeit]<br> +Am 27. Dez. 2016 von 1:45 Uhr bis 2:45 Uhr (MEZ) <br> +<br> +[Betroffene Dienste der Mogry-Station]<br> +・Charakterumbenennung<br> +・Mogry-Kiosk<br> +・Eingabe von Gegenstands- und Geschenkcodes<br> +Technische Schwierigkeiten mit verschiedenen Arealen auf Leviathan behoben (24. Dez.)14825739751482574049a44c77ce05aa4ef6aaec255b1da7904d9b9c58d62Wir freuen uns euch mitteilen zu können, dass die technischen Schwierigkeiten mit der untenstehenden Welt behoben wurden.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für eure Verständnis.<br> +<br> +[Datum & Uhrzeit] <br> +Am 24. Dez. 2016 von 10:04 Uhr bis 10:29 Uhr (MEZ) <br> +<br> +[Details] <br> +・Die unten angegebenen Areale der Welt Leviathan waren unzugänglich<br> +<br> +[Ursache] <br> +Probleme mit der Serverausrüstung<br> +<br> +[Betroffene Welt] <br> +・Untere Decks<br> +・Zentrales La Noscea<br> +・Unteres La Noscea<br> +・Östliches La Noscea<br> +・Nald-Kreuzgang<br> +Maßnahmen gegen RMT und andere unerlaubte Aktivitäten im Spiel (22. Dez.)14823954381482395640528714b20f35941075e65153c267cc632daf99de1RMT und andere unerlaubte Aktivitäten zerstören die allgemeine Spielbalance sowie den Spaß am Spiel und werden als unrechtmäßige Aktivitäten angesehen, die gegen die Nutzervereinbarungen verstoßen.<br> +<br> +Die Anzahl der Spieler, denen unerlaubte Spielaktivitäten nachgewiesen werden konnten, ist wie folgt:<br> +<br> +Zeitraum: Vom 15. Dez. 2016 bis zum 21. Dez. 2016<br> +<br> +・Konten, die Sanktionen aufgrund von Werbung für RMT-Webseiten erhielten: 17594<br> +・Konten, die Sanktionen aufgrund von RMT/unrechtmäßiger Aktivitäten erhielten: 8<br> +・Konsequenz: Permanenter Ausschluß von FINAL FANTASY XIV<br> +<br> +・Konten, die Sanktionen aufgrund von Teilnahme an RMT/unrechtmäßigen Aktivitäten erhielten: 394<br> +・Konsequenz: Temporäre Suspendierung von FINAL FANTASY XIV<br> +<br> +Falls ihr andere Spieler beim Cheaten beobachtet, kontaktiert uns bitte direkt aus dem Spiel heraus, indem ihr vom System-Menü aus [Kundendienst / Infos] -> [Kontakt aufnehmen] -> [Unrechtmäßige Aktivitäten melden] auswählt.<br> +<br> +Wir werden weiterhin strikte Maßnahmen gegen RMT und andere unerlaubte Aktivitäten ergreifen. Bitte spielt verantwortungsbewusst, um nicht gegen die Nutzervereinbarung zu verstoßen.<br> +Technische Schwierigkeiten des NA Datenzentrums behoben (20. Dez.)148222235314822224346d44f28f940a6b2d83bf07fd70bf0f9d51e36786Recovery4Wir freuen uns euch mitteilen zu können, dass die technischen Schwierigkeiten mit den untenstehenden Welten behoben wurden. <br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit] <br> +Am 20. Dez. 2016 von 6:10 Uhr bis 7 Uhr (MEZ) <br> +<br> +[Details] <br> +・Verbindung zu den Welten des NA Datenzentrums unterbrochen und Wiedereinloggen war nicht möglich <br> +<br> +[Betroffene Welten] <br> +Alle Welten des NA Datenzentrums<br> +・Adamantoise<br> +・Balmung<br> +・Behemoth<br> +・Brynhildr<br> +・Cactuar<br> +・Coeurl<br> +・Diabolos<br> +・Excalibur<br> +・Exodus<br> +・Faerie<br> +・Famfrit<br> +・Gilgamesh<br> +・Goblin<br> +・Hyperion<br> +・Jenova<br> +・Lamia<br> +・Leviathan<br> +・Malboro<br> +・Mateus<br> +・Midgardsormr<br> +・Sargatanas<br> +・Siren<br> +・Ultros<br> +・Zalera<br> +Wartung des „PSN“ (19. Dez.)14819552111482134825b964ce611f1c80b0d4c2228eb17f2bfa1af3f553Maintenance2Sony Interactive Entertainment wird eine Wartung des PlayStation® Network durchführen. <br> +<br> +* Bitte beachtet, dass bereits eingeloggte Spieler weiterhin spielen können, solange sie sich nicht ausloggen. <br> +<br> +[Datum & Uhrzeit] <br> +Am 19. Dez. 2016 von 7 Uhr bis 8 Uhr (MEZ) <br> +・Spieler können sich nicht in die PlayStation®3 Version von FINAL FANTASY XIV einloggen <br> +<br> +Am 19. Dez. 2016 von 8 Uhr bis 9 Uhr (MEZ) <br> +・Spieler können sich nicht in die PlayStation®3- und PlayStation®4-Version von FINAL FANTASY XIV einloggen<br> +SQUARE ENIX Support-Center Feiertags-Öffnungszeiten148189536014818954348388c2857ef5e195f0318bd122fe0cbf90af5f031Aufgrund der bevorstehenden Feiertage wird das europäische SQUARE ENIX Support-Center zu folgenden Zeiten zur Verfügung stehen.<br> +<br> +[Datum]<br> +19. Dezember bis 22. Dezember: Geöffnet von 10 bis 19 Uhr (MEZ)<br> +23. Dezember: Geöffnet von 10 bis 18 Uhr (MEZ)<br> +24. Dezember bis 27. Dezember: Geschlossen<br> +28. Dezember bis 30. Dezember: Geöffnet von 10 bis 19 Uhr (MEZ)<br> +31. Dezember bis 2. Januar: Geschlossen<br> +<br> +Bitte beachtet, dass es während dieser Zeit zu Verzögerungen beim Beantworten von Anfragen kommen kann. Der Dienst wird vom 3. Jan. 2017 ab 10 Uhr (MEZ) normal weitergeführt werden. Vielen Dank für euer Verständnis.<br> +<br> +Der FINAL FANTASY XI und FINAL FANTASY XIV GM Support wird in dieser Zeit wie gewohnt zur Verfügung stehen.<br> +<br> +Das SQUARE ENIX Support-Center wünscht euch frohe Weihnachten und dankt euch für eure Kooperation.<br> +<br> +SQUARE ENIX Support-Center<br> +<a href="http://support.eu.square-enix.com/de">http://support.eu.square-enix.com/de</a>Maßnahmen gegen RMT und andere unerlaubte Aktivitäten im Spiel (15. Dez.)1481791966148179203702f39c207e7bcfcc90802ad6a2ddaa8f50442a8e1RMT und andere unerlaubte Aktivitäten zerstören die allgemeine Spielbalance sowie den Spaß am Spiel und werden als unrechtmäßige Aktivitäten angesehen, die gegen die Nutzervereinbarungen verstoßen.<br> +<br> +Die Anzahl der Spieler, denen unerlaubte Spielaktivitäten nachgewiesen werden konnten, ist wie folgt:<br> +<br> +Zeitraum: Vom 8. Dez. 2016 bis zum 15. Dez. 2016<br> +<br> +・Konten, die Sanktionen aufgrund von RMT/unrechtmäßiger Aktivitäten erhielten: <br> +・Konten, die eine permanente Account-Suspendierung von erhalten haben: 24,685<br> +・Konten, die eine zeitweisen Account-Suspendierung von erhalten haben: 14<br> +<br> +・Konten, die Sanktionen aufgrund von Werbung für RMT-Webseiten erhielten:<br> +・Konten, die eine permanente Account-Suspendierung erhalten haben: 1,029<br> +<br> +Falls ihr andere Spieler beim Cheaten beobachtet, kontaktiert uns bitte direkt aus dem Spiel heraus, indem ihr vom System-Menü aus [Kundendienst / Infos] -> [Kontakt aufnehmen] -> [Unrechtmäßige Aktivitäten melden] auswählt.<br> +<br> +Wir werden weiterhin strikte Maßnahmen gegen RMT und andere unerlaubte Aktivitäten ergreifen. Bitte spielt verantwortungsbewusst, um nicht gegen die Nutzervereinbarung zu verstoßen.<br> +Technische Schwierigkeiten des „PSN“ behoben (13. Dez.) 14816412131481641482b4dffdd89746619b69c0dca9b7d2256019528332Recovery4Wir freuen uns euch mitteilen zu können, dass die untenstehenden technischen Schwierigkeiten behoben wurden.<br> +<br> +[Datum & Uhrzeit] <br> +Am 13. Dez. 2016 von 13:21 Uhr bis 14:25 Uhr (MEZ) <br> +<br> +[Details] <br> +・Spieler können sich nicht in die PlayStation®3- und PlayStation®4-Version von FINAL FANTASY XIV einloggen<br> +Technische Schwierigkeiten des „PSN“ (13. Dez.)14816375141481638312660a227038126a0b87273b7fc79fc66ea1c71e434Gegenwärtig gibt es technische Schwierigkeiten mit dem Sony Interactive Entertainment-Dienst „PSN“.<br> +<br> +Weitere Informationen werden bekanntgegeben, sobald diese verfügbar sind.<br> +<br> +* Bitte beachtet, dass bereits eingeloggte Spieler weiterhin spielen können, solange sie sich nicht ausloggen.<br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 13. Dez. 2016 um 13:21 Uhr (MEZ)<br> +<br> +[Details] <br> +・Spieler können sich nicht in die PlayStation®3- und PlayStation®4-Version von FINAL FANTASY XIV einloggen<br> +Technische Schwierigkeiten aller Welten des NA Datenzentrums behoben (12. Dez.)1481622877148162292247a9ab642c10d5f853f652686e9c5ef028f5cdceRecovery4Während der unten angegebenen Zeit kam es zu technischen Schwierigkeiten mit Welten des NA Datenzentrums, aufgrund derer es bei Spielern zu Verbindungsabbrüchen und -Problemen beim Wiedereinloggen in bestimmten instanzierten Inhalten kam. <br> +<br> +Wir freuen uns euch mitteilen zu können, dass dieses Problem behoben wurde und entschuldigen uns für etwaige Unannehmlichkeiten. <br> +<br> +[Datum & Zeit] <br> +Vom 12. Dez. 2016 um 19:06 Uhr bis zum 13. Dez. 2016 um 2:17 Uhr (MEZ)<br> +<br> +[Details] <br> +・Unable to log into or may be disconnected from NA Data Center Worlds<br> +・Unable to log into or may not be able to view your character(s) on The Lodestone<br> +・Unable to view your character(s) in the Mog Station<br> +<br> +[Betroffene Welten] <br> +Welten des NA Datenzentrums<br> +・Adamantoise<br> +・Balmung<br> +・Behemoth<br> +・Brynhildr<br> +・Cactuar<br> +・Coeurl<br> +・Diabolos<br> +・Excalibur<br> +・Exodus<br> +・Faerie<br> +・Famfrit<br> +・Gilgamesh<br> +・Goblin<br> +・Hyperion<br> +・Jenova<br> +・Lamia<br> +・Leviathan<br> +・Malboro<br> +・Mateus<br> +・Midgardsormr<br> +・Sargatanas<br> +・Siren<br> +・Ultros<br> +・Zalera<br> +<br> +[Betroffene Dienste]<br> +・Der Lodestone <br> +・Mogry-StationFINAL FANTASY XIV Versions-Update (13. Dez.)14816183111481618363da0827e127079cd39388b42c19c9dd63331a5d383Ein FINAL FANTASY XIV Versions-Update wurde durchgeführt. <br> +<br> +* Clients werden nach deren Starten automatisch aktualisiert. <br> +<br> +[Datum & Uhrzeit] <br> +Am 13. Dez. 2016 um 8:40 Uhr (MEZ) <br> +<br> +[Update-Details]<br> +<br> +◆FINAL FANTASY XIV Hotfixes (13. Dez.)◆<br> +<br> +■Das folgende Problem wurde behoben.<br> +<br> +・Das Wachstum von Pflanzen in Gartenbeeten wurde unter Umständen angehalten.<br> +<br> +*Alle Pflanzen, die von diesem Problem betroffen waren, wurden angepasst und werden mit der nächsten Wartung zur Ernte bereit sein. Wie gewohnt tritt nach einer gewissen Zeit die Verwelkung der Pflanze ein, weshalb wir euch bitten eure Pflanzen möglichst zeitnah zu ernten.<br> +Netzwerkbedingte Technische Schwierigkeiten aller NA Welten (13. Dez.) Folgenews 31481598317148159836135a897edcb5fc7dc0b39f651ff08e646d30ae71eFollow-up4Bezüglich der technischen Schwierigkeiten mit dem Internetanbieter der für den Upstream für die Welten des nordamerikanischen Datenzentrums zuständig ist und die zu Verbindungsproblemen führten.<br> +<br> +Spieler des nordamerikanischen Datenzentrums können sich weiterhin nicht mehr verbinden oder verlieren die Verbindung zu den Servern.<br> +<br> +Das Problem wird derzeit untersucht und neue Informationen werden bekanntgegeben, sobald diese zur Verfügung stehen.<br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 12. Dez. 2016 um 19:06 Uhr (MEZ) <br> +<br> +[Details] <br> +・Verbindung zu bestimmten instanziierten Inhalten unterbrochen<br> +・Wiedereinloggen ist nicht möglich<br> +<br> +[Betroffene Welten] <br> +Alle nordamerikanischen Welten<br> +・Adamantoise<br> +・Balmung<br> +・Behemoth<br> +・Brynhildr<br> +・Cactuar<br> +・Coeurl<br> +・Diabolos<br> +・Excalibur<br> +・Exodus<br> +・Faerie<br> +・Famfrit<br> +・Gilgamesh<br> +・Goblin<br> +・Hyperion<br> +・Jenova<br> +・Lamia<br> +・Leviathan<br> +・Malboro<br> +・Mateus<br> +・Midgardsormr<br> +・Sargatanas<br> +・Siren<br> +・Ultros<br> +・Zalera<br> +Netzwerkbedingte technische Schwierigkeiten aller NA Welten (13. Dez.): Folgenews 2148158928114815895916863b92cb230d5e626323e49cf15929c34e4cc62Follow-up4Bezüglich der technischen Schwierigkeiten mit dem Internetanbieter der für den Upstream für die Welten des nordamerikanischen Datenzentrums zuständig ist und die zu Verbindungsproblemen führten.<br> +<br> +Seit dem 13. Dez. 2016 um 0:25 Uhr (MEZ), können sich Spieler des nordamerikanischen Datenzentrums möglicherweise nicht mehr verbinden oder verlieren die Verbindung zu den Servern.<br> +<br> +Das Problem wird weiterhin überwacht und mehr Informationen werden bekanntgegeben, sobald diese zur Verfügung stehen.<br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 12. Dez. 2016 um 19:06 Uhr (MEZ) <br> +<br> +[Details] <br> +・Verbindung zu bestimmten instanziierten Inhalten unterbrochen<br> +・Wiedereinloggen ist nicht möglich<br> +<br> +[Betroffene Welten] <br> +Alle nordamerikanischen Welten<br> +・Adamantoise<br> +・Balmung<br> +・Behemoth<br> +・Brynhildr<br> +・Cactuar<br> +・Coeurl<br> +・Diabolos<br> +・Excalibur<br> +・Exodus<br> +・Faerie<br> +・Famfrit<br> +・Gilgamesh<br> +・Goblin<br> +・Hyperion<br> +・Jenova<br> +・Lamia<br> +・Leviathan<br> +・Malboro<br> +・Mateus<br> +・Midgardsormr<br> +・Sargatanas<br> +・Siren<br> +・Ultros<br> +・Zalera<br> +Netzwerkbedingte technische Schwierigkeiten aller NA Welten (12. Dez.): Folgenews14815820391481590276f0b362f0566bcd065d9d9eac916b79aa61e38b1aFollow-up4Bezüglich der technischen Schwierigkeiten mit dem Internetanbieter der für den Upstream für die Welten des nordamerikanischen Datenzentrums zuständig ist und die zu Verbindungsproblemen führten.<br> +<br> +Das Problem wird derzeit weiterhin überwacht, die Verbindung sollte mittlerweile jedoch hauptsächlich stabil sein.<br> +<br> +Mehr Informationen werden bekanntgegeben, sobald diese zur Verfügung stehen.<br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 12. Dez. 2016 um 19:06 Uhr (MEZ) <br> +<br> +[Details] <br> +・Verbindung zu bestimmten instanziierten Inhalten unterbrochen<br> +・Wiedereinloggen ist nicht möglich<br> +<br> +[Betroffene Welten] <br> +Alle nordamerikanischen Welten<br> +・Adamantoise<br> +・Balmung<br> +・Behemoth<br> +・Brynhildr<br> +・Cactuar<br> +・Coeurl<br> +・Diabolos<br> +・Excalibur<br> +・Exodus<br> +・Faerie<br> +・Famfrit<br> +・Gilgamesh<br> +・Goblin<br> +・Hyperion<br> +・Jenova<br> +・Lamia<br> +・Leviathan<br> +・Malboro<br> +・Mateus<br> +・Midgardsormr<br> +・Sargatanas<br> +・Siren<br> +・Ultros<br> +・Zalera<br> +Netzwerkbedingte technische Schwierigkeiten aller NA Welten (12. Dez.)1481572039148157220028a5ea03a48c12d27183198e817f2e439f9eaaa04Gegenwärtig gibt es technische Schwierigkeiten mit dem Internetanbieter der für den Upstream für die Welten des nordamerikanischen Datenzentrums zuständig ist.<br> +<br> +Das Problem wird derzeit untersucht und neue Informationen werden bekanntgegeben, sobald diese zur Verfügung stehen.<br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 12. Dez. 2016 um 19:06 Uhr (MEZ) <br> +<br> +[Details] <br> +・Verbindung zu bestimmten instanziierten Inhalten unterbrochen<br> +・Wiedereinloggen ist nicht möglich<br> +<br> +[Betroffene Welten] <br> +Alle nordamerikanischen Welten<br> +・Adamantoise<br> +・Balmung<br> +・Behemoth<br> +・Brynhildr<br> +・Cactuar<br> +・Coeurl<br> +・Diabolos<br> +・Excalibur<br> +・Exodus<br> +・Faerie<br> +・Famfrit<br> +・Gilgamesh<br> +・Goblin<br> +・Hyperion<br> +・Jenova<br> +・Lamia<br> +・Leviathan<br> +・Malboro<br> +・Mateus<br> +・Midgardsormr<br> +・Sargatanas<br> +・Siren<br> +・Ultros<br> +・Zalera<br> +Technische Schwierigkeiten des „PSN“ behoben (12. Dez.) 148156529214815657611078ee7a64dd51e29473811def0a3e5966aaac9dRecovery4Wir freuen uns euch mitteilen zu können, dass die untenstehenden technischen Schwierigkeiten behoben wurden.<br> +<br> +[Datum & Uhrzeit] <br> +Am 12. Dez. 2016 von 17:37 Uhr bis 18:06 Uhr (MEZ) <br> +<br> +[Details] <br> +・Spieler können sich nicht in die PlayStation®3- und PlayStation®4-Version von FINAL FANTASY XIV einloggen<br> +Technische Schwierigkeiten des „PSN“ (12. Dez.)148156366514815637141e4b3a530e24d0886253d7c7ce2dbb8ae9da6d934Gegenwärtig gibt es technische Schwierigkeiten mit dem Sony Interactive Entertainment-Dienst „PSN“.<br> +<br> +Weitere Informationen werden bekanntgegeben, sobald diese verfügbar sind.<br> +<br> +* Bitte beachtet, dass bereits eingeloggte Spieler weiterhin spielen können, solange sie sich nicht ausloggen.<br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 12. Dez. 2016 um 17:37 Uhr (MEZ)<br> +<br> +[Details] <br> +・Spieler können sich nicht in die PlayStation®3- und PlayStation®4-Version von FINAL FANTASY XIV einloggen<br> +Technische Schwierigkeiten mit verschiedenen Arealen auf Typhon behoben (11. Dez.)14814638301481464055f7d8bdf8e21834d958183a76b45fe291e419ee88Recovery4Wir freuen uns euch mitteilen zu können, dass die technischen Schwierigkeiten mit der untenstehenden Welt behoben wurden.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für eure Verständnis.<br> +<br> +[Datum & Uhrzeit] <br> +Am 11. Dez. 2016 von 14:14 Uhr bis 14:21 Uhr (MEZ) <br> +<br> +[Details] <br> +・Die unten angegebenen Areale der Welt Typhon waren unzugänglich<br> +<br> +[Ursache] <br> +Probleme mit der Serverausrüstung<br> +<br> +[Betroffene Welt] <br> +・Östliches Thanalan<br> +・Südliches Thanalan<br> +・Nördliches Thanalan<br> +・Zentrales Hochland von CoerthasWartung aller Welten (13. Dez.)148143272914816230083117acbbc1bc889326da8d21986588e66c9cfb56Maintenance2Zur folgenden Zeit werden wir eine Wartung durchführen um Probleme zu beheben. Während dieses Zeitraums wird FINAL FANTASY XIV nicht spielbar sein. <br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.<br> +<br> +* 30 Minuten vor Beginn der Wartung bis zum Ende dessen wird der Weltentransferdienst nicht zur Verfügung stehen. <br> +<br> +* Beachtet bitte, dass es Spielern nicht möglich sein wird, Zeremonien des Ewigen Bundes vom Ende der Wartung bis zum 16. Dezember 2016 um 10 Uhr (MEZ) zu reservieren.<br> +<br> +[Datum & Uhrzeit]<br> +Am 13. Dez. 2016 von 6 Uhr bis 11 Uhr (MEZ)<br> +* Änderungen der Wartungszeiten vorbehalten.<br> +<br> +[Betroffene Welten]<br> +Alle Welten<br> +Technische Schwierigkeiten des NA Internetanbieters behoben (9. Dez.)148136951014813695941b5a8c9edbb602a79dbcbb34e86303f8f490ea1bRecovery4Zur folgenden Zeit gab es Verbindungsprobleme mit bestimmten Routen des nordamerikanischen Internetanbieters.<br> +<br> +Wir freuen uns euch mitteilen zu können, dass diese technischen Schwierigkeiten behoben wurden.<br> +<br> +[Datum & Uhrzeit] <br> +Vom 9. Dez. 2016 um 19:40 Uhr bis zum 10. Dez. 2016 um 11:18 Uhr (MEZ) <br> +<br> +[Details] <br> +・Spielern, die bestimmte Internetanbieter nutzen, erfahren Verbindungsabbrüche und -probleme beim Wiedereinloggen <br> +<br> +[Betroffene Welten] <br> +Alle nordamerikanischen Welten<br> +・Adamantoise<br> +・Balmung<br> +・Behemoth<br> +・Brynhildr<br> +・Cactuar<br> +・Coeurl<br> +・Diabolos<br> +・Excalibur<br> +・Exodus<br> +・Faerie<br> +・Famfrit<br> +・Gilgamesh<br> +・Goblin<br> +・Hyperion<br> +・Jenova<br> +・Lamia<br> +・Leviathan<br> +・Malboro<br> +・Mateus<br> +・Midgardsormr<br> +・Sargatanas<br> +・Siren<br> +・Ultros<br> +・ZaleraNetzwerkschwierigkeiten aller Welten des NA Datenzentrums (9. Dez.) Folgenews1481327426148132771476d5a27c1da52f45d762b08b700fdd8fad9ed7c5Follow-up4Dies ist ein Update bezüglich der auftretenden Netzwerkschwierigkeiten aller Welten des NA Datenzentrums, aufgrund welcher Spieler Verbindungsabbrüche und -probleme beim Wiedereinloggen erfahren. Dieses Problem ist nun zum Großteil gelöst und eine stabile Verbindung sollte nun wieder möglich sein. <br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 9. Dez. 2016 um 19:40 Uhr (MEZ)<br> +<br> +[Details] <br> +・Spielern, die bestimmte Internetanbieter nutzen, erfahren Verbindungsabbrüche und -probleme beim Wiedereinloggen<br> +<br> +[Ursache] <br> +Verbindungsprobleme<br> +<br> +[Betroffene Welten] <br> +Welten des NA Datenzentrums<br> +・Adamantoise<br> +・Balmung<br> +・Behemoth<br> +・Brynhildr<br> +・Cactuar<br> +・Coeurl<br> +・Diabolos<br> +・Excalibur<br> +・Exodus<br> +・Faerie<br> +・Famfrit<br> +・Gilgamesh<br> +・Goblin<br> +・Hyperion<br> +・Jenova<br> +・Lamia<br> +・Leviathan<br> +・Malboro<br> +・Mateus<br> +・Midgardsormr<br> +・Sargatanas<br> +・Siren<br> +・Ultros<br> +・Zalera<br> +Netzwerkschwierigkeiten aller Welten des NA Datenzentrums (9. Dez.)14813193761481322251fc40d22866a32af110c70f63cc74f928d5bf56854Gegenwärtig treten bei Spielern, die bestimmte Internetanbieter nutzen, technische Schwierigkeiten mit allen Welten des NA Datenzentrums auf, aufgrund derer Spieler Verbindungsabbrüche und -probleme beim Wiedereinloggen erfahren.<br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 9. Dez. 2016 um 19:40 Uhr (MEZ)<br> +<br> +[Details] <br> +・Spieler, die bestimmte Internetanbieter nutzen, erfahren Verbindungsabbrüche und -probleme beim Wiedereinloggen<br> +<br> +[Ursache] <br> +Verbindungsprobleme<br> +<br> +[Betroffene Welten] <br> +Welten des NA Datenzentrums<br> +・Adamantoise<br> +・Balmung<br> +・Behemoth<br> +・Brynhildr<br> +・Cactuar<br> +・Coeurl<br> +・Diabolos<br> +・Excalibur<br> +・Exodus<br> +・Faerie<br> +・Famfrit<br> +・Gilgamesh<br> +・Goblin<br> +・Hyperion<br> +・Jenova<br> +・Lamia<br> +・Leviathan<br> +・Malboro<br> +・Mateus<br> +・Midgardsormr<br> +・Sargatanas<br> +・Siren<br> +・Ultros<br> +・Zalera<br> +Maßnahmen gegen RMT und andere unerlaubte Aktivitäten im Spiel (8. Dez.)14811852921481185350576c371d47faf6846c6432e05f968ebe8baafcae1RMT und andere unerlaubte Aktivitäten zerstören die allgemeine Spielbalance sowie den Spaß am Spiel und werden als unrechtmäßige Aktivitäten angesehen, die gegen die Nutzervereinbarungen verstoßen.<br> +<br> +Die Anzahl der Spieler, denen unerlaubte Spielaktivitäten nachgewiesen werden konnten, ist wie folgt:<br> +<br> +Zeitraum: Vom 1. Dez. 2016 bis zum 7. Dez. 2016<br> +<br> +・Konten, die Sanktionen aufgrund von Werbung für RMT-Webseiten erhielten: 36,046<br> +・Konsequenz: Permanenter Ausschluß von FINAL FANTASY XIV<br> +<br> +・Konten, die Sanktionen aufgrund von Teilnahme an RMT/unrechtmäßigen Aktivitäten erhielten: 453<br> +・Konsequenz: Permanenter Ausschluß von FINAL FANTASY XIV<br> +<br> +Falls ihr andere Spieler beim Cheaten beobachtet, kontaktiert uns bitte direkt aus dem Spiel heraus, indem ihr vom System-Menü aus [Kundendienst / Infos] -> [Kontakt aufnehmen] -> [Unrechtmäßige Aktivitäten melden] auswählt.<br> +<br> +Wir werden weiterhin strikte Maßnahmen gegen RMT und andere unerlaubte Aktivitäten ergreifen. Bitte spielt verantwortungsbewusst, um nicht gegen die Nutzervereinbarung zu verstoßen.Technische Schwierigkeiten auf Shinryu behoben (3. Dez.)1480775340148077590195ca3aa1f731de6e12898bd7001f24c66ff6421fRecovery4Wir freuen uns euch mitteilen zu können, dass die technischen Schwierigkeiten mit der untenstehenden Welt behoben wurden.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.<br> +<br> +[Datum & Uhrzeit] <br> +Am 3. Dez. 2016 von 14:02 Uhr bis 15:05 Uhr (MEZ) <br> +<br> +[Details] <br> +・Spielern war es nicht möglich, Shinryu zu betreten oder dorthin transferiert zu werden <br> +<br> +[Ursache] <br> +Probleme mit der Serversoftware<br> +<br> +[Betroffene Welt] <br> +Shinryu<br> +Technische Schwierigkeiten auf Shinryu (3. Dez.)1480774131148077562879f5f648b4dfb3ffb7d2656cc33acb48079a85774Gegenwärtig gibt es technische Schwierigkeiten mit der untenstehenden Welt. <br> +Das Problem wird derzeit untersucht und weitere Informationen werden bekanntgegeben, sobald sie verfügbar sind. <br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 3. Dez. 2016 um 14:42 Uhr (MEZ)<br> +<br> +[Details] <br> +・Es ist nicht möglich, Shinryu zu betreten oder dorthin transferiert zu werden<br> +<br> +[Ursache] <br> +Wird untersucht<br> +<br> +[Betroffene Welt] <br> +Shinryu<br> +Maßnahmen gegen RMT und andere unerlaubte Aktivitäten im Spiel (1. Dez.)14805805711480581529cff37fccf4a91ec5245b76b675dc3b995fd349e21RMT und andere unerlaubte Aktivitäten zerstören die allgemeine Spielbalance sowie den Spaß am Spiel und werden als unrechtmäßige Aktivitäten angesehen, die gegen die Nutzervereinbarungen verstoßen.<br> +<br> +Die Anzahl der Spieler, denen unerlaubte Spielaktivitäten nachgewiesen werden konnten, ist wie folgt:<br> +<br> +Zeitraum: Vom 24. Nov. 2016 bis zum 30. Nov. 2016<br> +<br> +・Konten, die Sanktionen aufgrund von Werbung für RMT-Webseiten erhielten: 25682<br> +・Konten, die Sanktionen aufgrund von RMT/unrechtmäßiger Aktivitäten erhielten: 293<br> +・Konsequenz: Permanenter Ausschluß von FINAL FANTASY XIV<br> +<br> +Falls ihr andere Spieler beim Cheaten beobachtet, kontaktiert uns bitte direkt aus dem Spiel heraus, indem ihr vom System-Menü aus [Kundendienst / Infos] -> [Kontakt aufnehmen] -> [Unrechtmäßige Aktivitäten melden] auswählt.<br> +<br> +Wir werden weiterhin strikte Maßnahmen gegen RMT und andere unerlaubte Aktivitäten ergreifen. Bitte spielt verantwortungsbewusst, um nicht gegen die Nutzervereinbarung zu verstoßen.<br> +Wartung des Netzwerks des Europäischen Datenzentrums (2. Dez.) 148047933814806552604cd4a6cc9f61f82310786dee67c923a8b9fb6189Maintenance2Internetdienstanbieter des Europäischen Datenzentrums werden zur folgenden Zeit eine Wartung des Netzwerks durchführen. Während dieses Zeitraums könnten Spieler sich nicht zum Europäischen Datenzentrum verbinden, verlieren die Verbindung zu den Welten oder haben eine eingeschränkte Verbindungsqualität zu diesen.<br> +<br> +*Spieler können das Spiel weiterspielen, wenn sie sich neu einloggen.<br> +<br> +[Datum & Uhrzeit]<br> +Am 2. Dez. 2016 von 4 Uhr bis 6 Uhr (MEZ)<br> +<br> +[Details]<br> +・Verbindung zum Europäischen Datenzentrum nicht möglich, Verbindungsabbruch zu den Welten oder eingeschränkte Verbindungsqualität zu diesen.<br> +<br> +[Betroffene Welten]<br> +Alle Welten des Europäischen Datenzentrums <br> + \ No newline at end of file diff --git a/bin/web/icon-01.png b/bin/web/icon-01.png new file mode 100644 index 0000000000000000000000000000000000000000..05f4243f50a35dadb50492cfccb8beebd577128b GIT binary patch literal 16051 zcmb_@^+Qx&^x!abBT9%vDj^{#pbR;Hh#Qi|{S zIr0IiRvjN+gwKP?pw$qi(AA&#&Lh-PAxw-Tjn3q5Qk5^f3S*Z0)>~H+6Bd?&>@ZNwZIhNfEr} z>KMT!NDQS+q5!y<=c!p zWaD)=0m8_nG*8YxVm77Pec?3!78anO#uX7%9<$AS<0e*@{Ms@R4|z{R1=5DK`0=8o zAa~cMWr@x*(Uqkx&rJ#g%ic#YV2`&mZ^N-5yWRGvd9Se0VPwM@Z!zOGAp-rFCSdP~ z^EXbo%BAh2l|zR>Dj$MX2o#Pe)fdJZOO9mF{Kp6Si z%6gWWvvP5B&4v4->u7KJrF$Mp>To(we#|u&vMfpDgCHT3p(b6hH4UKu6SABI8#e0j z=*)Xpg`J9KH1em0G855q|EO7yP{_X}#AtT$JKcl(k;2J!H1$}1*r^(54$=bj-;b!o z`l>Y>HT>e1dRC{cpc|g=!VK`2cCRNjJKhoB-w0T`qG_O9aH`A=zy|VaFy*vaubmzU zMhchJReQf2Y(}fBmvqUkESo5lIpXBrE_ndyD`&JP`{D>`BYbvV>`$lIbXW{`O1Sk; zQ2-n?4^S$xjHFWgcTQ-IqqZv}$N)t?)-b9+*-yw`d9>Q?L6TQr%r*H8odZR7>3 z#AZUzMhM$UY0f7D_UcS5o&z+QSx`;o7pVIp=H*|psW1%AX#NCnBRev%!o#RkH}_gKbn%;emd_e0R&r}@WQ zZql&3TaCr$Y`|gC#(@y3oI;klo4TJL#psrDF#)68*>rsC3E0j5@<32X0*+o`sF7WA zHX?mR?^c^Wt%H^_!jL*VOW8O+WyST#-yUeSL%~dW{rPF7-~?rua@ArU<3A45i?_GR z?|TJjFYg8Ihf>Z1ks9|63T!v-hwGjWEN7$TF3jXZB+FQ9pE4g8N?(o!ps}fOh6O>K zs#(I7*{HfevPiS*8~Ix#y1GLC@9yzn;T=jlXN$v#8Xf+0bUb|}ZxfPvt)U#~SWJ1( z9~}*ub%i;yw336jb*eQ2?Jv;mG$M#Kl>^ns)rZD_L!ILa#SqcIOu zLt=&-l#Rz9a+}|msFJD%JNb0|06+Nlz4$A~akxN+Kl-&YdF(A+wJ(ulLRmZuS8nQT z==IL8g*jahC|#bi#-J*{vI2#FipEK@KL0s3pD}*G{_I6&gf3+la5}TM)Hd$`!)4#7 zu;2Y;6NyRXMF%yXR3(jR26q2J(KpG4inm$KbSwYNb`)2ZZCSzAh~L{=Y!!}H>qfrS z7Z&a(wN7=(*>0q!^qgqb>I{-Ou$W8dbn(>W@eN6dTmqECTwy^BUey5#o^_4$$H6Wt z#-qi^d}e&$Pm|;3dk$jCdTc)g7bI7WTOfGLh{Iwj+ZjsICKK^kC9c~egr*2*B1|C1 zQNAs{@?D3iK6Kc4-+`Gq*i*)JE>;V-q znxHZuD5!8Zq-cLKw9b(2`^al=+$35kkn%01y?mT%?DRxXrIqQFCkPZoRdGP5b7K6? z;YUNxu(4&otT6(Bo4xX7mt~GhXF#nxo@vMw%3UOu!HurF}l-ASJwnVPND7hZ~5D2r)wV0lqomrRUYsQTYxgC)nv0xJUMzYgucC ziBMR%BXQ3?^)cGy%S{q}mpzuo9rfH1&sx?Gk4kqyp7C8#??|YTe^L{hZV^v&!kBAF z4V+vp&NKF)0&X})akbRDD2wKhla-ikDr7XIS@f@5)>mg@g{9mJTSC0$#&7zZM309Lp2R< z>4C=;t=!)7G)Ue}vhFBaQ)t8 z6~@~==<14rIN4na`^*X}eVE#S#y44#H*Xk&zP_c!RUyk>YR}gZn0A~8k;jqwl+K~D)s_V`;MN||3M zaDf^pnS~(Pau~{l4u8t^(f2Q%V8N{q(L~dgmD+tfGNb$uBzZu}-!ITMGQ%CQV|c4? zJ;_JJ5FvRl^D|~qF);_AVhPw@7F-t|;YB})&H@h<(VTvj0gQwonNc)20A&b3S&d{4 zf==t>r3tD#T~>pD>L@}txzsovAPkjW0q}cV&Jn!85WyP)NJCOx&@S0fGtjdyBWXwM z((;u$8KuEB2Dn}&iPlu!mz2cFQDh8y2bgi9TrEgJ%dxSAF9{h=DyINMQ;NG4T*9!B z4hs_EiGd&oX5Ob7g?yDj%ach3(CAmM*P6&<`oi8xIl*`efa@tSZkBCPdY zCi|8#MsCKW$?yR|vNtt8iTb5m{Q_#nh7J0%rY3?kiE;#pqs7>5#5@9=^Q&ha!lvM)yzSV=;5<5C!bhPqboaQVP*0ToD; z`(znDfXohdmivNy#ugw;*0@c_i^Y>Hl^o$`nbTtN0;-qmQJ^E>Wk#(hOkv*i< z00kg0GLd6w;1*fVRV=jxw3YRln*|!*NYNUppc zDAsBphjJlj1JWc=xPT8tiLEp*UJ>Z`>?iJLo%2?TRmlE9JX$$00Z8_D2>{i@S`!?A ziHoQoEkzf!1N%k@TVP2z-f|#h)xd?q$AHb1A>tl1{?U|2EzluBx)rwXG+CqEBOMGR zrxgf{MkNtR2y#ofrl`zDQyt5G-g&}Y2^ZgI(OeURc$+;9MdN$Ifa(^qM%Rh;q0JBi zI6{4=4xK&q)2x&_^q*|ALst50K$@_zJHOLd3v!(jqlN05EDW|UZdAT7TO=eiDin(` z0u%EQ4i=IaO>@8*C_DLIo>h_vfB_&LNan!TatbVaL=6F=tTYekS<`r%ee(r0?JfH< z-ts&H1QGCWIn-PgBe>;zAW(wF3jnO7)N!k$X_*ueAPA6td;qXNnN)`KbORI=V9GH@ z4j3$2rva^*87a8jQ|})=0h;2PXSxHid&>i~`>T6WS?=_I-%ygZVJwdH5`b<>(l4tX z^857yaCVw}3p~iT)$C+|UJ1}i-&j;)LrkM-r#F@6Kz`d;8Co=0fFzloAh!!SO7j8U z{<@^7j6S~yb?vHCLrVsIe|c#Ozrgk;iE z*n>+lz%GA`wiudqAM`RaT6sv9iB@K<bEZ$D=U`no{_g&Y76NBZV|HK>vFF&U8l44{6j zk)^@^LoUsaod!RQydNQ%{3F^K9K2}oeO^2+xF6vsbI*qWeh`8nVX=a+5A$Q;E$a>9 zqzV2bNm6`mcl#-VH(?IY$3fFCDt*8dAxSK3f(N0=vA_da$%q)?B&cq|gttug-7#v% zzjN{>gzu{;kULmyj0_UL2@JELwuPye50W&R0OV7KG0>qw4A=fTHNH=qX7?x&NMn(} zv_7LqW@&~Xy!D4zJZqpFPyoTe8Y5VXH@aG4G4(nAi*^8>$C$|UPkEjJ)PPE`%-zOm zQsAu}i*!E6ZokQZ+Jw=(I-#w~hy$$LEPxP7xB)lh><=JZ#`>&K_;2wW0fYxWa7n!< zIB61;&Oof#f5WsdpCch=TvB%dnOm6i0wA(k3?P%{Ttb?_$V$II$V2X!0=XX$`51!C zQ7Y&B(Z2U3q%MipW5f66WTzJr5J(;1f=jAeVB;B{xm~8Fe*ZO zIw9gHi61i+6C z1OzY#L6T}qg5NVBG1J=VfZ2>*2j$bo=BU5!mQcOnY;RDXlBXrpgRTFQX0VU1&U~ zQoHwGX))KsImWP@C@_GFsQAq2(}^>(hoOv~ANWKOskY-Pb%MeVk$s{;OAk7z?ax4g zcPzD>-XmgRr9w=AdZEn!Z1^CT^O-agjS6zdNaY_4P^)n6U8w7n@c)6@FSN#+w>nU1 z#|4dq#@~-X^SBHyp-Slc_kX<6eRd;ts7kx)l?%`d#7HH}ky}w67eMKCWQX#K{rZ9) zcj&>>1?x8!doJi|Iox*dyWEpQb1W6G;YxQALVttn{*P_SxUtayQm8oWlvYv;W zZ9NC?5}mcsL(xngM37H`tUMtM?W!I9DU4}(*T>=0nlD|i|AtRMBin@dfbAf;xtVzc zk_zrARy=4VpKh}+>EANBB|%L(;sR_6VL2TSL2(|gX-?wfH>4&#M0Q^e3og zhZCE;0r3gxCKRs>kF zO9+-d^>-UQvtrbB2ktjF&UE8e%HZJ%a7--A1=#~Z5{fUB`};R#Fi1ZL3;#SEL(P|f zfv}$$w3I&tL2}2oi^TnUuY*3=0fkzk_ihZ8q+O>6L8tea{^Oy6uzq?L7g-h~y8Q4o zH5=@B%zM5O%_nO!oV>zbJ>*A=)@n--)#lFgjaKDFl|3u}@H1dKBoXL_5o)&Y?0^YC zMn8^GW(@jhrkQSX#}*_CghwEx>tyCu#c(4VHV}a=PKJ`5Y)UFr@1w{+lHhHe*@72v51oY46Lv1kPpGkAtiUBX*3#LZrFcv*paqtnGUix2 z!jvld*Ab{Ee8jq9R%hAm&$--r}cZC z8-dTHzz3!P#jc|$0{Bsy1W=N3p&qWk9Xj2nyL(DPn6dY%u zg>aGDX#u0Q71`p-8U#_iTSP}#kp1>uC|kRQ_gSEL8p*%bLyq`%53=3kyw&z$xUn6g?bK^N(+IY5n8}&PgZ4=##>O&HGec zjMCiRNBn+>+@2HQ6A!QahexUIYat#++%C!>MsGLoCxh_mjPDHeX`tHx%MUyEKzmVx zPUwu*9)UiB?%Uiqg4OLnOsm$HF{P|bfB~BQlfh4_OCECEwHpD9Pt&!f&>f_K$u}G` zJ_lhaJiZVkGomC76zJx_#pz(n%@*p5Npt>fb|C(J7RwItFwgDyDbQWebmUK(FaC1Y z3da3qe+<%u9NPJ$N^`*f!~r1}13ZoP2AihsN!Ea$bnuc2DXn|wgMQRM-s2n7l}r1{ zBCr3O1VQ1$$fv$1pRk zsA09IkwP>0g!ZxWOzG(OBu=*qn5^786FBeC{uzxo&P520s7y8S&*xquadj_3H>ecr zkH6TsG6pyOv?SC7j4>u1|DXikzZolrGh)ZIu*Cv;${y>*uH@mySI_F-Tp7A9+|$9! zHbL2eKJx2U=~{jygLAs}kBzvN5TH{U;i3waL6`B_E=YG-nQlgNRt@qk$TzuE=vxI+A0U@`9C4rOqrrcFh+C6S&Ev1gfjTJVc;P zexJSko3?`^_pSF{m1-?S37oUR@f{JHBv|?84bP~Ud;rPN*~B!c!Cc>D<%hG!35Atb zfy@M1pMmEkW=7qvVb_p83|D;Y@B|7kjbMlW$^I68dEjlC0na8}QcnjX9;i)nWho7*D9_GBGW#7vmkdZoHhrRFQ0kx(nI?!j_zkcWD zAV~M&rI+Ych#2pl10{g~XRFMA`;rwt z67;0MHoj5hrZ&pnFGW}4S;i@xKkJI$N=~M9JFZLvo#SuL=~H+sm6$m*E4DeIa2^!_ z#33=}WBgE|gIVZa!{t=}JLPm)1>+hm&@R;~I{OS%OE?~Tt({GKsi^%nSEXP_CwOZ- zJrg!Ci2`#-19IqLb{$24j3?0-F3rMQ zQj&85c{x6Ol)|7)Edeoes1OG17e1@v=(uIf*6?)g=T6Jq#qR>o zHmJNonjlHS2{lyhWoDGi(A3v-2A1?xV50Z&m&0Nn0#z4NsM_rdMj!9<+hgI!kAq%j zewJJXlekdOU(U%jXz`K%-l)e#$=07p@4TkFoUIAJzG++2b#9_Jxc%X@1zk%DW!Xr5 z-w(ZnaIRR=wDnWtR7#P;Iay2dGq)g|@+biSAy|_S;e3t0jL>AO*d%B)P-+JrFm0}l z5udt&Ugpl@fH-WjW}}Zr;^|rd#L`q54a0 z@9Z&gi3bAtBN!0f!||y|;>Q9g%uDkjwJp|y+&g#CGlVT99f@f9F?90L9kzdzyZrr- zb370(%12NmI&gZ-jx5U;wtnCfM<70(AOUvlBfTO7vAL2+aISDD6RCT@<))8(R&=k$h@+ zi~m;Mcs!}2rN&81m)Gb3lhWr_W*pCPIn&G^RWY#w8NMKA6%L~@d+p71z$j^hvP)8| z>Z;TC*FZKXn8QzEfctAbAxHFTcYQ=p{>$#j?}2v`!?7yp8P#mDVl69qsIag5AQ~KR z1wt_~g1+K=7!y=Zk>TlE{g<^OKL<2!1DQxK88+N^i*|YJKv{~CXV%{~uzqiMZsmd# zj-;XF+1X)tek6p+@nPb3P(f+vyA%jk5Ju-A<$`1#;%vB?VfA)w1GIrYUpI{^^hE0N zKAj19OpFbjsO4aGwT)i)-Sa*=nmrinV?7bwy)FIBCn~vT6kT0m*eGjv568a^R3rV+ zb6%O(kF;;J#da0Aug_AiGkVF|#P*jOM#rg6%4{y(_TAm@t>t?(aJ!vU)HWRVKfbb! zt#vtxpQo-#oLabv|87y~@idt|}4Z3qSreE76`We>`X5 z1V081#NX$muWZ7ZE7<3)-rwlb%dL8^(O-qLeOOP`xo!=(_QFg2u76RW>&@(Tv|AP6 zCGWa}de!1~>gJN?`Jn1Tl3wUs!=GDAs9|8~-U%!m+V|zgY~g~WpF?Pv!XmaxZuAV)VsXhC2N1s z7Q5_6dgFM9lv8O`ClUGQk!&VUIL>u$>7HIK2c$>T z$CYudXv^rXO15yiP-^XQZE9kN>``lKLG@7i(SIY%!t zrGKYkGeTx2E8=z{nW)QZk{<4DugtFZR?8mYMq-9mT@4~{{Prq^g(-{5^868W5{8+j zDz~)S0}{x(=uiLluTkPi&g0YjHy;pHQ2U=WUCmX*TC7~g^2Ia^-wgk8(0;lcKuS!% z^(>KNR$QF+yp`kH{1YS|Uxh8JU9f@`Nh&48M z|989AA@n2?w=$^ClDxkCAO$m*!cyDMr-%Mzw3LQ{^)(z5Mx&_*rpLvp6IuEUC==hy zWa;Eox7AAz)cJt3CFyZ1A6e~g!kij=PXNP{tRVM+rD`)NQLIs1uhY~u8X`%vtCE}> z_pJHbA5>huTs~!a)ki9OQ01Km+IhGxsoLi~4_b2;@%$XB)Z239E#L{0DjU6XG`S4- zTJWTwy;(TXyOqw*T&tRMNlS$4-DTY9tJx8w3FU@e*0eX+9Vi4*H5M5Ao}?JyuobnoCQkH?YjJG^28$ZzZI@8j>^Zf{Ww+5xguogE*r0q`trr(#xK0rC&t<#0zGGAtM9e^mU_~9 zO%e))&1T#<6J|^vM(}z);>UVU)+VWTeR1ELj{P?H9O+u7_*^30=2r!>{G4iiTQdlH z#(OLLmFZ+q#9`V^w>h4N=)?SWuZQW?$CEkSeYyLAyT^WFXPccOb4P}RSC=kz7j>N# zGgkv|8m~3QP93CAsCF#g3V0pZ=qS{m2i&+FUP+-WCJkLt6<+OH`utenbkx$I?g(pH zsuQy?bQPf;GH2xVFI3g3c2-)^I;>~8Ht-tTTkcM6aODde625e~G2XvMoi4D=dM{Kp za1(zy;8Y^kzZ5}TA$GzUYjqZ`O+EDp#f9HTWN*0eT-JqO*UeFj2o-i52XgP`r#L`dR-6!91QAuohBj!Xh(obp>J6-6kr$Hf@1V7zET}fDn zUgBJxmPlxGhK2>TTZ~%p_HU{lq7bvDd~sDbktahF6vs5A+y3oQ6BN5gxsVc-W=(yY z&j#{%ZLAI{k}ds$(VyDIK~dqiWvQxb7Q$PSk~8`e<*r4|2FrElz3%%{`4e}bZd~Fl zc_PkV5%bO3QWb6l{dLxj0Doa%fQwt;zPc5Un^?Q8cRIh(YfS~4~Pb$92)H0M33+&Cpc^8nthhH^=- zXy;MqX$>!YAe!pjA{e~wck`0;2d<3KNPNvN%PEy%XIDm_9)euP81Cx7){|GS6@Nq9 zcYW`_-;Gy^B}u>RzuwhdvG;cAcO_ANw5YXWH>16~BswYS)pfCy53k_o1Qr%9PbV#4 z3`^x?2$oN5_mF|tq-&`^E?l$gfhYJNJ_Ym&T=Xrjj`Kb26vt7jd|$>?*}GUh}i zkEZIhQK)Ckv=10|3x$ye?YEm=COgRN<#CjJ6f%b4l0+GB?4k3Wy#2+8FFbZB+za)j zOr*C{L|koB5J(eWCzoPWE%wup)O@5@LCNzpQz zOUqxhJT^H$f{-b+MjXT|L+mlAM|!5AZ_=e*H8dqM=?dH#znklyiZBbeBQc0W4O#I` zF?6c0J4bZ8ANH@zM5=V;cv+d$^>+)D@NA1-@2_lrAs|`8G&Swn%pj=0QIoKBg(<)f z?}M6SryR+_JmZ45T=b}PouxuI(A}lWkhae9$d*Sep|sZJv6ijz*IM_^96pnbFqhM} zm?`(qE+#`&Q@I`o%WGELUM-M+6?j$aLI;IEUYCpa=_cy%kV(oQmClj!t8X!njSab4 zouD)cXXO%6rjhSf$cvh*91LEA=g8J?BtX>u1G5?w?~2AF7ns2}=PH2zxa=WXAl zmyX0uY8mZv(?OC8?_Ii@a)s{4NLO$fsGC@MkNFo0THNbY#j;<-TZtAna0LfZ>aZy* zy+b|}uj2Jpj}>`IYf5_*p0i%a!`xLTjO2JRSH2ba;5ee*1OT(rB~yx>{2{~$cp81( zF?aXG6f^OFZn(HLMWNi>b_ywyattfWCG#z~3tHx^pd&PJYf?0&xQNI?KhEO@O|QN9TIGZtmzHR~F)ctCBa9B)$re{;sD zsXUc0=45JIRdlP4S*yABolE&Vd_V4B9d)=gq3p5gg&tiJ@I6H4f5Ojr{fy=t=^9?U zg2I`OO#<#?$6M*6wA83O9p-`GMe>K{R@BCV;|)$zl#tl|rCEPvTcr}wT~ zEZA$Tah?nlQvL>YAI$CakMb|>-N5EJBA#iVCW}N~k+f&?u6TIpfKETFt(5Dsk9k{d z{w@h}CQ>YM%|~$i?eK!B^`i@);;Sx&2gDZo3FXnUij?o`F9*v)=1S&E{yZ|)7hWYD zv`}0+^votCU=shSO4}CSKzA+Jfuby}zY)0WZESM$R5>^58Sh+1~*v7KWm>!gY-eV)5j& z9&TakiW+JX$mBaJiFcG(ld;VPgGgq{y-vc7r@o9f-BwI#x5m^>b+UPbWxuif{z(lJ z%)P6Czi_ZnWdFvabI~(qNOa(E-!)=^&$XPe`>dMeu+%yBqQNHTmd!77dcpb<#{S5P zEff9PNAxjc89j3f{D=I4D^?#7^2xAm0-pA{%^wxr6L}9~gZ|)OtTTJH?Zlu&BG>$S zovkxh0{nF@rvr+-y-tEen}8CQ>RaM6%x(A^6Ca2$3*i_4en0+ zi=oEO{I2iRrIRvv+Gqlf4Q%?5DMry+nQ^EGggX_q3;uOa?e!+L_aP$Y;=}H<^g6|a z_##QeX17!_KR39aPLHEJ3lH{QTte&iRCN{5Nv3G7=A=nFTmoK3<+Vm9?~S`z4%wG` zQYAQBniCv&c5LAMUKYzfZjVk9(dt~{BZ8t^uG^x#o|&MLcmLjhuukEna#|5hDVN-J zk@iJ-l@7dtCS9WU^u9S5YonT%aJuv(&Vn_7u2Fzs<+}u#_up~ny^|Z(26G&aK0TW~ z!JX%WiBB?ubbIRX=nPpe1`2bfOA54Yl(Fo;F3M5nx=<$VdQANGdYaX)Q$DkNym8H* zVa08{G{e0-fMM_|T_PbfNstp8G{^M)==0tr*4B^5tf_@rz8oBOo@CQlagT8r3u z&QGQG7F;NS-9y49r|ESwp@ivd`-t9GkN-Z{uA!#AHB>CY=^U-;*>%M%v6I$bd+*Ev zRxz@WjXNzfQc`9VAkw*pw{msp{4H~!;T`a%JCY-n_%)yXvrpHq=fAXhaVy=RJm*<^ z*pBY3Hndw5Cofd`c-Xz57F%G(@l872{#jw{auh5Q@6slmFYJ6b{+O3QcRSUp&Y3f0 znMf-0qXJ>}Ycpkh{mYVu6GB5x8lR5o$6W?Nuzj{~A1Lhf% z>~iCN+9GiilNJK;E==w^8SSvN{qgEtF=nE*`bq~0HhQIQj=J~()qL+KXFVC-)|N}Fo!x;h}~i1WF>RHErSB??jp3+^iATMa4G?-UbCe=XPY zkd&-5vab3K7cFnMiiZYnT05uV;rf+O&=a+3eA{j{Hn&Hyg}n4dB{IBKy#MmE<;8Cq|ZiLlsK0sJrgX?zVSxy_O~PX}Ib& zvv5J;vwRrW+hoVRR9oNgs6W5na?DkpRUM?(U4|+@vfg5bYa=YfnquSoS$p$7(v#3C zG;4XWT=*!SSh<0T;D8?8wY8Z(JTbStcjSr0OSKW-NZ0&!2<-W zdG#B`j5vaLWLJh_kHON4TH@UZ)s6Zp9LH~sDrK{h^q#m{5>3i??4+ZE0KbeB^Z6mc zj@9y4GD1^|5(rXLrvlRh>t|W*JG!7{vFGt-Qn$n~#oJ#{vPz)(IWA{ipcT}9rH0Yu z9i?cDyYF_1nmhB5_B{iKeiWNl;Eh-ROIML<&dVHbmV(*K=|A2I)dT&uFFohKi_yPU zzN`{E{rSE9YV@FX^LonJ?QE0JHfW9FdUkVtdxiVv&v5Ep==IgyO^I}@-PNK}W@^AL zN9UAgVfoDbme2Mb(AjA7piH9YYMW}mcye*XgeS&#@9@JocZ7o%0xlAt=@8=Pl_4jH zmFLwNJ?IupTPtVgG|pWmygl%yhS<*!@X|&7ZB^$V;CiS>q%5Z_ALkH+6?cNnVuc=UymxzUEOaeJc*>gDH}4UMg`8i(MhpS zxUiFmJ;S6wSF=CyZ2v}*DUBg`F>etC#lGWTWK?A7*`7Aj6ZP{K zfk5jCYq(7rs+&UAHCBw`s=22UO-l{lhD_4+(92tMr3okZ%r1QYLL1{uNYYfq=47|V z3EsMioimgbl{H+0$%F#&hi(paJk=|e@l<@xUn)plNkwYd8_=}vS1%!6nQ`4dH zd%_f&4D>31uf5;tvL+F-erDo?v*NM~&>fMV|679o`)Xb@8v*(E=b3fkxC7v0&$=mvjF zl(yg;4UR@SeJAkq1CnU_0+nam^(mR%gjD&L3A1#49~$#3o=^z(h|UMSnoc!Sr=}-f ziO!x+>^xk=Wr(;Rqd=VHwu3LaBY`m1Wn0R+OHcW3gn*pV=U2sUI=lZtZNEt)pT`2G z=lONbvpSK9M!G#?iL+?lRjPDYT$*t}Ii7ERqMYbVb)2FZ9hGY;`&rd-bVbF7q(kcd zv2ASFWEE3siT^vT%wrpO3&lp1!uY<8DumwR*+n(4v6q`@*3BbcFyX^6(H6H7>CC8b zFBPQoGNHKmBPzliAzf4H;A>0QC#WUsccym|&l#>IbE zR`RT`V-9>i<+=%hk<@NtWAFdjIMr{({r;+R89OH6Ku;%t#sv-?#vdbXJ|!DAw|&Rk8FbR}B!FR8>?$d9j5J3!ZjP`9v=J>OS~ z&@+aJ^5U=YR^~3EHO%UBXWu(dkMA!M&NI5|c1lz_{}2#PxZ258z*`aOJPaiS?+}>P zx>+{-2w0bce!=Fy+>)@eks$lrq^ECg(|nTpGHI3`>+qFdQAfGr7Qx>?)cz<;4B>Y{ z>hmeX--^+Zb3!vqPJnUsI{_1XP=@^0WCY7Ecm37e&Xe8H+@$}OI(%L4;4lUusy01w za{OLefc}t?6!-8bJwmiH{?6IGQi^~hI$TLEHoTSByaE=sD(I9(5U%9dkc^KTY|Qan z|A`3yYJX~oW$j6EBM7ea#juK%9-sOzL{=0DM`^mx1gmPF1)x>~_M_EzQyiU^9Xh8x z*Q}i27uB0w;KeXSHN}jLO>-)@$6m@dK5inlCZgFPsZ@103kp3e-PjW$CRjJDJKp$$ zlPBTlH94s=baQ^B%HoCk)Nt;;zhmQe!_*|C_4dlF$)QP;G@t9NPFRHRy8yB@+Z(rK z)5AcPjlQRym4n7Fo4DLhI8i_m9M(GpC8L+qzSMF?XHR&%68&s0#@*KGZjMZbuj|03RmS^@AcKx=DsE-aS zh)dGmUwd5*U5S51B}$L{9Rbu!8! zNVdBD2i~T)bNn-s@^ipsO7X@;@h|0~7F2KR!<*yCm%54S;TCoC2+>VH#R~t&YN>mt zU6-`ev|mHJiB?Lyq@TUIL`-z1-0WK1C_$0F;P3uIortX02!-98F+w{+8?);m_gs1jFoYOg#rxoPmCtqWeaETm0L~ib2VzLYhDhy9lv+ot4OJzxdY?0?w3@mu$t|=;oc6d zW5@244-821HaiVs`|aoj`k$YQTOE2jn1mpnxjP%zNfq>J9AD3=+kLK1z+T#k3Qzyi zf|_^kMD>?pua3H{1~*;In~=LukL5#4A4TZu>_c3t=G&D@nc5wBQq~A)GAuf`g>ESs zliBZ!HtP0^K4`T??wEwHxcBwjogRAM)=fNuwpsq+B@vQ&96P_s(UaW$KE67EQ&;cd zh9~lnYn60W>34Zh%=(@s)bm>-yM|a*nXy*ola*pkvOsSSIn=F&j24Uo;weYqbg4@aMO};u)o@FP4UCP zq+h?8Mpd1TWIkx(^(p%Aupx0Lk0ikl_*e@4nbp6q;r`vAzm)?o{{CA<-~7LUpz;5I jMu}$k{|aUI`3;l^V#%fU7zJu6S_v{z^3U@n^gjGAHh5?a literal 0 HcmV?d00001 diff --git a/bin/web/index.html b/bin/web/index.html new file mode 100644 index 00000000..dd3231e5 --- /dev/null +++ b/bin/web/index.html @@ -0,0 +1,30 @@ + + + + + + Sapphire + + + + +
+

+

+
+ + + \ No newline at end of file diff --git a/bin/web/login.html b/bin/web/login.html new file mode 100644 index 00000000..60ae3750 --- /dev/null +++ b/bin/web/login.html @@ -0,0 +1,75 @@ + + + + FFXIV 1.0 Login + + + + + + +
+ + + diff --git a/bin/web/news.xml b/bin/web/news.xml new file mode 100644 index 00000000..0fe6b24c --- /dev/null +++ b/bin/web/news.xml @@ -0,0 +1,162 @@ +OKit works14854473281485447484133a2a9464b7a1e1cb77ed6899fc8e813b273d294Gegenwärtig gibt es technische Schwierigkeiten mit dem Sony Interactive Entertainment-Dienst „PSN“.<br> +<br> +Weitere Informationen werden bekanntgegeben, sobald diese verfügbar sind.<br> +<br> +* Bitte beachtet, dass bereits eingeloggte Spieler weiterhin spielen können, solange sie sich nicht ausloggen.<br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 26. Jan. 2017 um 15:22 Uhr (MEZ)<br> +<br> +[Details] <br> +・Spieler können sich nicht in die PlayStation®3- und PlayStation®4-Version von FINAL FANTASY XIV einloggenTechnische Schwierigkeiten des Mana Datenzentrums behoben (26. Jan.)148544489314854449418007f32b6f60752b6efc62332e7eaf608670a8f3Recovery4Wir freuen uns euch mitteilen zu können, dass die technischen Schwierigkeiten mit den untenstehenden Welten behoben wurden. <br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit] <br> +Am 26. Jan. 2017 von 13:46 Uhr bis 16:15 Uhr (MEZ) <br> +<br> +[Details] <br> +・Verbindung zu bestimmten instanziierten Inhalten unterbrochen und Wiedereinloggen war nicht möglich <br> +<br> +[Ursache] <br> +Probleme mit der Serversoftware<br> +<br> +[Betroffene Welten] <br> +Alle Welten des Mana Datenzentrums<br> +・Anima<br> +・Asura<br> +・Belias<br> +・Chocobo<br> +・Hades<br> +・Ixion<br> +・Mandragora<br> +・Masamune<br> +・Pandaemonium<br> +・Shinryu<br> +・Titan<br> +Bezüglich Einschränkungen bei der Charaktererstellung14854428001485445569ee2c8eb0ec2c20d20e2bd6d9e2c69217dcad20d81Updates bezüglich der Einschränkungen der Charaktererstellung finden Sie hier.<br> +Sollte es zu einer erhöhten Belastung kommen, behalten wir es uns vor, die Erstellung für neue Charaktere zeitweilig einzuschränken.<br> +Diese Information wird in den folgenden Abständen aktualisiert:<br> +2:00 / 7:00 / 12:00 / 16:00 / 21:00 (MEZ)<br> +<br> +○:Charaktererstellung möglich ×:Charaktererstellung eingeschränkt<br> +<br> +Japanisches Datenzentrum<br> + ○ Aegis<br> + ○ Alexander<br> + ○ Anima<br> + ○ Asura<br> + ○ Atomos<br> + × Bahamut<br> + ○ Belias<br> + × Carbuncle<br> + × Chocobo<br> + ○ Durandal<br> + × Fenrir<br> + × Garuda<br> + × Gungnir<br> + ○ Hades<br> + ○ Ifrit<br> + ○ Ixion<br> + ○ Kujata<br> + × Mandragora<br> + ○ Masamune<br> + ○ Pandaemonium<br> + ○ Ramuh<br> + ○ Ridill<br> + × Shinryu<br> + × Tiamat<br> + ○ Titan<br> + × Tonberry<br> + ○ Typhon<br> + ○ Ultima<br> + ○ Unicorn<br> + ○ Valefor<br> + ○ Yojimbo<br> + ○ Zeromus<br> +<br> +Nordamerikanisches Datenzentrum<br> + ○ Adamantoise<br> + × Balmung<br> + ○ Behemoth<br> + ○ Brynhildr<br> + ○ Cactuar<br> + ○ Coeurl<br> + ○ Diabolos<br> + ○ Excalibur<br> + ○ Exodus<br> + ○ Faerie<br> + ○ Famfrit<br> + × Gilgamesh<br> + ○ Goblin<br> + ○ Hyperion<br> + ○ Jenova<br> + ○ Lamia<br> + ○ Leviathan<br> + ○ Malboro<br> + ○ Mateus<br> + ○ Midgardsormr<br> + ○ Sargatanas<br> + ○ Siren<br> + ○ Ultros<br> + ○ Zalera<br> +<br> +Europäisches Datenzentrum<br> + × Cerberus<br> + ○ Lich<br> + × Moogle<br> + ○ Odin<br> + × Phoenix<br> + × Ragnarok<br> + × Shiva<br> + ○ ZodiarkNotwartung des Mana-Datenzentrums (26. Jan.)14854377331485437790021fbfd330ff2fac70a32cf8bd15cfa146d2258fMaintenance2Wir werden eine Notwartung aller Welten des Mana-Datenzentrums durchführen. Während dieses Zeitraums werden diese Welten nicht verfügbar sein.<br> +<br> +* 30 Minuten vor Beginn der Wartung bis zu deren Abschluss wird der Weltentransferdienst nicht zur Verfügung stehen.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis. <br> +<br> +[Datum & Uhrzeit]<br> +Am 26. Jan. 2017 von 14:45 Uhr bis 17:15 Uhr (MEZ) <br> +<br> +[Betroffene Welten]<br> +Alle Welten des Mana-Datenzentrums:<br> +・Anima<br> +・Asura<br> +・Belias<br> +・Chocobo<br> +・Hades<br> +・Ixion<br> +・Mandragora<br> +・Masamune<br> +・Pandaemonium<br> +・Shinryu<br> +・Titan<br> +Technische Schwierigkeiten des Mana Datenzentrums (26. Jan.)148543638814854364392e83b51376fe2d18ce9dc653b146574508c5829d4Gegenwärtig gibt es technische Schwierigkeiten mit den untenstehenden Welten.<br> +<br> +Wir entschuldigen uns für etwaige Unannehmlichkeiten und danken euch für euer Verständnis.<br> +<br> +[Datum & Uhrzeit] <br> +Seit dem 26. Jan. 2017 um 13:46 Uhr (MEZ)<br> +<br> +[Details]<br> +・Einloggen ist nicht möglich.<br> +・Areale können nicht gewechselt werden.<br> +・Betreten von instanziierten Inhalten ist nicht möglich.<br> +<br> +[Ursache] <br> +Wird untersucht<br> +<br> +[Betroffene Welten] <br> +Alle Welten des Mana Datenzentrums<br> +・Anima<br> +・Asura<br> +・Belias<br> +・Chocobo<br> +・Hades<br> +・Ixion<br> +・Mandragora<br> +・Masamune<br> +・Pandaemonium<br> +・Shinryu<br> +・Titan<br> +5834234334434534634734835035135240243959354355356357358359360361362363364365367428603683693703714416137237337437537637737837938038138238338438538643044071434◆ Hauptmenü des GM-Diensts1111◆ Untersagte Aktivitäten in FINAL FANTASY XIV1333◆ Account-Strafen1222◇ Werbung für RMT (Echtgeldhandel) melden1001◇ Einmalige Gegenstandswiederherstellung/-umtausch1011◇ Ich habe keinen Zugriff auf den Heavensward Spielinhalt? Was kann ich tun?70628◇ Ich habe meine Heavensward Bonus-Gegenstände nicht erhalten? Was kann ich tun?70629◇ Darf ich Geschenk-Codes im Spiel kaufen oder verkaufen?1027 \ No newline at end of file diff --git a/bin/web/sapphire_logo.png b/bin/web/sapphire_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a7970d0ceab28c2ad4d9bd53c366a1670245dec6 GIT binary patch literal 352784 zcmbTebySq=_Xj$3hcwb4B}jJ*DBWFBQo_(Fjf4o&ozmT1LkdWTG(!qVch`MAzk}zy z*1dmS)`D5gFz-C?6MOGZY(kY4r7%#Rqk=#n3>j%jRS*d2H3$TUfs6<|a{xh?2Oi)p zUMm1kRz;%S86yC{Q<_SvDu6&A=|CXAKoIB#c*^fL2;{;B0__-qKmti15TSiqvx*S# z0-}kWlqB#7d|gYl_yP|o_R=~|AP@`9pKloVJW*HR?I0P+*Xr)`dr+4&{i$owqfvgX zUNfj04T&2q6$-(kfn1P4(92g~tJ@MUIRi_^p!&E8RfYp>W)y6w3O2Am$Zhc>L zKbkO4?*F}B1boIe;?uQ%pc}H$Iz>#ro11l8%FM89g4)LC$v1>Pz0QxrfGqp(SSZw* z8A%^6ExRKzB=8`ONiS;e?PM0QEp!aDQ0ukzoU$bjJEZi zxUXy1TyAOpxT2rh{D|`{t+TF4#94>gsuTfx#90sJ-dXn!3@*#PgOu}5o3IEPmKgw5In}09y%XDRQl$ZbA!s6q14ULD< zew-~F3pRM{2&*GLJP^oK%v7t?d4$i6%FkcEA^B;_i5Ul;CN(M&rgxTKZzo`x7}=V? zxa(UgY_sv&{N$JDiQzUZyvkbVzJiLyRW%N%`O_4=&;4(~=$nud>oQJfzl&dVcZP@WJ}=uGEGJT}_M^{$&{1)j0jjDrfVNqjlm1QREM(_Oaqm zTSi>b=xjJMOD!sLX`^wr&nIHche|BfSGX)Vwxqf6Pm`7=LqNlpx1V1oG96HC$di z6mT+kbueT*-@sq+PL#q8<{m8RVng8SmUM`~H*E3Zf_OPx``n`UVc1w9cN!}!lRt+w z*U2cO9WAp=KEV3_T7o`*?v}fy{Dawv^x_gbtLO{ zL2Jk91LnkLx}s19I7xF(xGNI4aSjOR8 zDMxFQCNchX*Jx1xZ^3(0pGymPl(!tKxxE~CpY&vh|SD@C# z_hCXT2x0;UjPR5)=p0H?4BXv;R{5FqPKY{YhjSU&+gpykMs@aS!kmPntyMU`Iq;K>9g}gFAs^9M(lRe0VCijGriRnLetq<3VCq^nv@DKS*{-+J$$oF56qF5=?Fi0G^Iw?lt zH&q15uSw%?Xcs@6m<+-hHs!9ZMmDz%`c`|)Tc_SU9$vc$Z!zLDpd&D;HKRltbdqUB z_Le28cVr)3!gKT`^0C$TV|L@QT^g{d=W@Od8QAjC25}W7YuD#tkyuM~>wJUl(BX7i zRy89SaL&Yi+9e@jWDj)zMw?&1&VC6RBzkQx6(ixwa4M~N+GX;6+OCv+mip!czn$XJ zq+w&_-Zru6q6S56SvzF0D?sHwVp$Y=W;KkR*KFL(Z;A~oZHY)1FL>O?D&HF*^G;jC zM?JCx!W4|=+xW}?@*+5bDT6C#_o31Lb%xZOMuMGasbl-oT1n^sw^o>Ip>6`KZTAp^ z%aFCV(J$LBr+?tVcEK-V@~_qYcvao=oKSIKzSjBe#eC?-2x3@Qtjw@-19xD7P+jp> zYw*bLaLcYFyf54QAfm19J*7zyiwG@6`{SA<-j;TiUFEqYvLyH7@ulvan+Fo}z>?7} z{V2=*K5uzpqqTfAP5d^5{%KU0gb1&nk{T$o{CDH85hUwFAgjxkee&;;9FXKFhAD<` z(FoumBH~tn>4vuABYW-m2 zc?{~Js};hR>Q_?tja<;4ZaddC>&wG{9vBgA-kE*nl%k~q3uBxeF9pCckm-psnZB-c<%Oi<<`7iL)gd#Z&z(pXbHLz0fsM=h*L zJmnXdlko78M_QTbN5ZIn|7J&I{$%C9M+@=(eyX0o-Mw{{7knS;*dXlPf~Sx|WN6Zt zX_p>el%t=-F%Zf`K(IDkcJJ;ThE?K*(IK52g@>rKR>?qW!`2-GGp67l#}f4ugVM@q z(UMTa#gvvsFDepvYv11Nj-YAdIz`>@-%1^}(UkC%4m|efG1*&m2?7~|&dYx{vlPzX zrGoFEv2%IfR^RkEub}}~(1-~4ExIvc{Eh3~YFKPATmnA}K0mI8Jn=>sEgI_BG-2P) z4$PheNx33lB~vb7bEwmJLJ-6 z{Q#84Lrf&EKJ37RfuOVVI9z`Af)o1q-(pGr4ahLclLY+U68jwrF+CkHJ*tRw3H-;q zqY51!PA5yJ?gbiMXX7mL6#HEJg%I!YweJv!U5oh`%RLsCsaX)rjr-`}G5dHnJw=xg$U=hGSgC7ttBY5p>` z+qm$#T~4ffRRsQ;;J%28!-#uLjs|gd;Acroe9RhkTQHMnaWlVRTapl4`R>xzc=(;b zzL!!CJv0ubB?#+oZ*sle<$HD)F9-DP-w&`{Nwx+38{yv114*WW%e zxm~3l?wuL7)=>$~*+xfADB!tkq;WGL&9Tr<4wF<(FY)=@zsGg`iLmOxIEDeEv$lD6 zyp%YS8SAE$zaaHgOOY!4ErGmBxm~}H*zH6ZB7@Mygse=awRuO9<5RcuziRW9uOAN1 zA1$VkH|oC(WCZF?wU=pn5Qp!DqUr237L=3V7f;I@LHCqm9RoaV-W1%P4|^jd+xCT8 zIvLnch#K16?i|$jyN3kP6eagNFf|&zBY#Uc%K>eDrq?tXDW&E7I)>;4Vy-jp_qpi= zRs;2i-P6rY@PPB}(~zTb{#N~I9X{vpO*O%uX9?Ubh(7iY1|%%HO;C#;&Z&xc!_cY| z3X#?=LThVSxilV>d=OW6&zsW|hmE43WZR|B=ZLCT%U=|^T;HzN$^wZKvjnf%M5VJ` z#6@vCHrbZqZ*pSp|GSXy-;3Oaq$4~i@6dR#pCf(nsq$($hl~k(iy3BfuuV>zEZ?5@!52sg0A$6q-J~j7B zSxL6XA!?UqEkCvM7d%><)(>0Awnm4^Jolk`k5zdhT%+LFPNJxv2-W(i5TEasY3#y+ zlf$G{2CtsAwq_BI2f|dSy=AsC(XVRr*e*?z8qG*w_}|^vhx)Yp`2E!z0-L&DZux90 zX+(;&*INi!4CVBbii4_qj0UU!U>ski=qqv%>-*-mzOcvExvZs2N9zQ?#?4JbyGI{i zWu}wa$p(oODx(JbyQ_TJ#n##vlL}<)P;B@29`w_Ds2ygBMkyfqtaNV9t>eRG zCio7}-QDE6(iN!C7J2bemT7t#ex-H*8#d~NIZH~~`H9t}qpNwd_tU}duX_6ww-rI5 zaog8Jhi)Q73Pku4Fv=k0K9{?j8eHQV`@8czO)l5IZ~dgNgsZBcaG@vi4Yy)#{<)X8 zSo_!Q2!@89b)b{z2#JHOcnojeyOmX8H`a`p`^~xnd=Zot1rV5`ejg>%djZx+#55`8 z=g=v=_d_}Y=mf+jGw;jGI4tP_!MOA>LmkP8kKMNAw|Uf_4(4sR`Sy}D9A-SwUya@Z ztS!K~b)IR~?C>;pX~d_r9JQ|RZP9ZwMzWu|F!fv~pz~W6wqHJp`<^GK{Zuyf8GMZU zTDt9?Rit>lf1o*a3>$N@?JZ<_3eh~xW$Ok>(CY^=Y?OTz=r?xiOGaS*xAtu?U)`^^ zUrI{(I=<2KfRxQy#b$r!pDs_1KOh6Qg-(Fa{kLJ$xLx|*y4>If5kA=C@+w5zC9Oyw znu<14eIur`ZF!FeaoAwMv!Kv2;G!OExIT(B1OGmzH&)>XU~F`<>qFWieWLvEe9Hf1 zgJiL%)rfEkrb6|-cJFS0u?J!QiE^Ut++>L?%z@18Vr+Y{lwXY4f+`F--`=e@$v23U z6*F=jbWwmm3Sf^*ee%cRo?=6AHnq#s3+0qnz0sDZYRr0#?^nE?LXS5?4~Lz`d75|L z*31Y$gFyx7XC=NCek?hF2bzU=8>hg^DEP7amnbpy&ajkq#HlFGzM9CQ=y2Fk8f{p4 zNYoo!N|d+ohy5(crSI}_Tx}*z^Qy6@DS4acsa&G^pSv&xZhWuZr}`Qx#ded40}0fF zgXr_H?a*lHBVr?a;}$gcvh-yLKamn1-AbiwQ?jinXz|v|X=H|?@Y>Utfm<_rVjmwC z`8yX-k@N!jwXzTgM+Q!hM0{44A|OAtQs+fK4v8$`MhX=lJP7#(2n{aSNhZW3!{%r; zg$2l;zf(e0-ne=>TA{G$Bt=#Qxw@wfEHUgk$nwG`fcLt4n<<;`e%wFw@{jE+Wi`=9 zK#XvJpxHaojwR`w#zAX62p|b^4tZzu8@|7(NANfKTo($47-ywPtQCgtsvOGY%hrUgeM-6kiEP|1ksf*kaba;71%D^yK zW1<^`mMKzzXYc?oa1%Q_hx1m-7bgv7|K6eYf-Y)ZRas}vkJ@QgJ%WE-$X=UPonT?r zrN7^`sNa<_WO3To7l*ZUw{t(o&yvkDN|$vI7Xsi>4I`pKRI-Sclb^(q5Y%PD{~sc?hW&i{*{P2 zn=9zI@%)Grqo(0`HSdw&vQ-RW

FFQ@E$^b8^kguLfvyVknCjl_sfJ!@}&^>L}dcXjPUfR-0n9`eCvy zE57Nz%I5isy$@g0s+&Z(ewf830V#&v>t;_?-%0lw-uAuqgn1L*`zAbj1{Z)p8HwDa z%HRTlj^7JNOk~^hfjRh;EF{cZ@cMBc`}1s5J=ffi>Uc^Q52Qj^{UJuEp}G96Jd76T zu+-`AUxHv@-k4}>;r6WCxlxbitaV*qHy)f(|MFA^b!;|clj|(`rz;p=bv?gZ#e;o@ zaU6$IrQ}0r>Zh^c?p8pdsUdzTh69uVB>ENVlL{|fV2sJ5e*OSWVvDKwU4<@{>)Dpx zS(IyeXV-J<-f!s@5cS>Y{{=REB!4R-()lGK*Y>Kq$MQIH^EqZ5ct7dIj`W!b|1EFX zstiGT!pDy}WOe(`X4O$ZzowV2Xhppm>wly9E?y@rWbGv>@BIF19h_Ijn^Dukt;MY-)(M2{B{?GyX?f+r~*j|2-QBxia08TZ0 zXY;+r+EaNFr&CPw6E$Z)PDpnGrZ_6hZ}aA!@|UNprSeoDLv0BqN(2Sos+Lz@5_!+4 zmrY;G@{Ug@c9c)Eb+N<6#Es0y@qO}UYiwdw19`v35YMF?B>mF!jTp8nDPnG2h%7$u z;$_R5h=W_wZah_gEpVp6_FS!FNW1L?pW9SZ&1rzt4e8(5O8@fj1f^}C(f+(O{2;t_ zK721ns)-^FN`nLL4`4qWmo7cXL&8%>S$an{*#x{~-1j)LQM#{t36_c9g$Vh|N4Hs< zf+=m1#3N`iqyYX;?{=;8ru=t`AjRVSScQn-@i2`CscG2WQhV#Hz)bd$GqHZM@v0;% z0O3R0kGp>^;`UKwf_rnA1jZ?3J8h#^YGv6FqNItXX)(l1`Y&~(b~SG`f@lSAaA~V@ zLoFpg<;qqTZ*#Qr#OKgQNm?5UrKkTO!b`?5FFqLl9ZoAx)Eo+@_S!7yP;Gu%QWm%0 z@dw;;llk4KrtK*>RsUe`j4$pdWPb*ulPPT9pGoo68BE7A2Q=&HnDsjZKar257F`a) zzH|AIL+La|5M|Uz@ZIXycxC(t|Is$**DxOzOs=M4F^E3rt~f9NvEv2TB&3a9Xqptg zLnh7N39*~4#QN~tE06@Z?_0qVIs=d^|*a=q7vx%k*^m{4yrxrQl^-AKI zLO2ewNCiqU^54OJeJm0nWJwo3Fb;vjkKz>3&Rbh+L$6CTYfm`b0rmFouDXba_r?)& zb>915RB($^x@)X;b2xYAsmb4L0GX`tWXY);WEm{RR@`kI%ho)0K%)1)qMV^}ioaBK zmW#>(lZKSH6(hY$2BKUnHmMLKC(k-u$72AgT=D;bUrz6H7wWJ%An!)>7v#YH6<+$H z!C$G)>xR9xYzv8#)?G^25Gb8ix;(CvxTnvvMjP~Acs+D+@Y#@Ju~_#VY$A8SXskxP zK#a)xSnh|tT}ST%=VdKn*}3PCQ34{3ru-ez8`Ydg#YICfLzdBrE;r)$My;A-zTN+G z@UqBMpv8={#2P6knv^)_Go>VL0VWHDay{<}_9pU$o=)-hfn#yDrgkzjUHeA!BdIL3OGd|&Kxz2H zkJCaGD7Jod(l~#Vb9>#Cmd*_MaA=IGdjD@3|q>G1xFX z+S<~En3D`C;$hn_Xm~x|RE4yDU9&+uX#9YluijYc*n(9@ro!dY_YB#3`}`FQ14qc4 z)!%2dlaTABn$Lwa(sY6Cf;9O7KR4SG@QNOL@(~b zRwQB=szy(9d%Gl;+4AiS5)@lK4bvgoe*Umf$m|FYvVp7Iha?=GVztk)yGfZ^u3}ga z#LqFSCK#hKE|=6#xk$Ph)>j%0t}kcS5xd*5xkT9=wHqs0)Q0>`$+2+%rQ|)^usH8s zyB3Jv%yZ)P^J0J|kTJRHnOJ*{m>6vKo%frlSpvYNlh$mdF+IaL|)C$DHtdR8c*lhL+bWVgh&QXZEo*bQrM1$ zkv?=FmaID>t~xMuLTK!np%1wm(Hr{(uC9Gw+L|;ioBf8n9QL>05bqcmQD(0uM)Fc8 za~Nyzqf2y9*UTW_Cjn%M5W(c}ce%kD zKn&6%2;X_R&W52TEe!V~2J%glK~A1RM$frhT^?7%H4JZDLCxo*hSu`3A=uj2TcU#9 zG>u+A+AhqjCH`j;wUo2E|0~y<+C4FyjNyJ~3LNqNEZr7sqj^z7@NLZZB3N;tEcoJ7 zdiCI9x>`-vRIv}+anZ~6aQuPf;ldHEl?5NxuP2!wTwC(-`q`|MwVl@ZpI@+_?-kn~#*L30 zUE$Chlsu`dr1<~NlPP#5EaZeQQo@+<(b9Ci`m6VS1P$MB??Ql_t9fZ~0^o41)*=?| z9%6YA@^@z?Cnb|bW$aoDN*&@a+vL4TpXttosFaaGEQtZP?`(p`naen8X;MwwM7zaDC$eKdF|>0Xc$vMR)aOheqe6(5BnXJEVW z>~+o3MCq~8s=61hkgb|SecP5Ivy8~xT>9_ni7a-BR` zU2tH7!b<+x3L~-|dOqM%KU+a=mmtZaF~3?mHPI}6Y7Z&9+U8WTs7$BB}l+4 zGz}PXgcWRX@<;|wGm12Nkd7t|>12r~Y!OreS_SP)dbi(tSGQAR{ywB2+_5ilWGEs- zm??6A5J#M22Pi_&GQ0|I>B44UsU|Y>aOD7<_N$alsNxH5+zOk$?uG}=Px<9Ue^kKe zhs8MB1Z|@H${lve+TOMPH0jbEh&@)5_63jtcJGYA zN}j$Z;LdZq@+83}Tp_Tm;@#vHffQC5KJpoCpFZumZr8s;%)fVS)WUhs>|S@nnX@8Av+y&H$VWw)F>Ud#$Pe=FGV z&VI+2S=YEitfEJCR+*kVNFfcGk^@nXRi)tZoqb47DXJ89@9_`u5&9T8#eCOSUB9ayq{nU0iu+~P8bIz^tH&}AqF|30H%zS}!=`}qdv?Oxg(KVvTufJJ{X z;+L0(Ebm<%+_N_LbP6XSd`N;_mnCi7xT~g_z*IxFDa2Sg=pz}MC00NZLjWPa>NA@= z|4}3NaJ-({2faPR!tymNDM6wWZpq)GlUX$aaZO5^L2v;rQz*6o762ud!6=Bqapoq| z?+-P5b=Y#g-VhxHsoE$>y`SF@ox3yfWz*O^-V^PVMebPDJnm}Fu--4e6Mf>du*LhI z{iCP+sLV3T?wO=DyEc;1;p|3OC6a5vknY1Z3tjyg`YwrD*it9O;*Aaj1II#on{M-~ zQ}?bi04xZCjJ-nP21H&@(v)Q}1zRqP6^QyzL*TurFu>jpKV2lp$H*i&XpK;#59HK3 zh?wIA;}~Dcp#w~>iV=bzz`85yX>5q@Z#|Ygx|&6|T~8ofvj&>ns4aWjyVVV{&=%`a z7fH1Xh7FuO6UUsJH}L<#T^8;1$6oXh`Ji_BX@J^uy(qS3x-WK9w>PO$?^h^5Zl8xk z!O>RaQUaWcyzpPDnHwD)s7@AljO!`yuMK9Nb+b~~^~}E%ZDnyOTr7VVZCCP6fb%j^ z6ymYiEw$$EofUU>skJcTZLRl+)9{MSvaTP;JkrUum&ony=o=|tlSUJNTV&>xv^MW^ z7Ey%Pk<|beBM?1Syo5q3HO=d!k-Wn}Mk?+=$)X@(ndml`7Zg~&9vo@IGzent_8md3E zVqcB6E@<&C-zOgf9tRIRblO0#LWt1^FL6%Vur6a2zC*P9mzjE#YS()y8L56}f#|)U z8KWP1YRLUK-TY1`M^kc45z-_9DrD^+vtd}vxBdId#6e@u#_D+5)+|Yhms`s|J`>MS z{9rqLwVczhm+=h@Yx{AC5!fwiiZMQba)X_w*b!?<|K7)TXu z4+mw3G8^yrRwyc(8I7X(%lXT&MQ?vK(o9E4E$wu~mV8`s&TqdcaGoSJu&fXUG=1T! zz~c&{90zynk@pdO(v0U~q8yC3r>i;V`V54W7?p%msJyZ3~YQ z$;OFAvjKh0X2vY>vajXnDAd*CDnkvFq`NBaV(otAslZ{Jq{Yf|HFKqEahb^hwR}GA(yj(&ENBv^FN)-9GVTJ%VOH0vm$^9`=MnHtU@&n3-F*-EzB$#K)^09)2j^tJ@w z>QNRK69@0E z#1XXaZFZASZ4KL2TV^8Lwu;{bv6|lyp-}bJwR-!q$+IVcMX#=@C-O#fWZ=x2G#5Sg zi54B-G1?S!Wv7$LD^Z3@vmr!k1sS9MYW#VXBz_yq2)(-WZcq|7*^tWAfqDkbcD?^fSlT%!$$T-UWv zFPf$F$K-WZ-=On>bzMJ#?Q(rBh+sLHpbJn;v)edS!m>_c+&5q#8Kwj(C(eCY^Sn#eP`k|!F7%krwI7=5Qt zAfSkLQNWtH=skl^Y^$?JI1!fh)X8`=>b#&R+3uCS%6TcWd{WfjK9O<>6w*0o`5SN9 zij&hgkzs5Wao4 z(eUg=`T?GL_0)+|$f?~%=(`UhfR2|4>(%%IR5)e?P zu~814-DDOI0ltz-y~q)Zn?MevxA=488%iD7vcFI0t9Jx*w%Tfd6K*wGy&Ksh@=kZz z^S&CR&4Ry_6ojoroW$Mxm1LAbguviFD`p-Br9zytFVC59YnDOujOOM+qUG>r(rI}4 zGySm5Fq@8(9VyO&-bMgBWirPzrRUwmql^ZWeXrJ+D&$|=vH435kVZ&Zr;O!C9@{Yf zsOsVLw)uY*=y{nV)R3L9WApN+6d{8H^jk{>6ioM0!R zQ-1!L>=Tq4pzeUk-Z@K+RL)lintEjn*o5eT84I!JLI_dwr{+w8RlO7|uH?-%_~lt{ z)>{Cm(%IkDY93F3f1iIgtAiK4SjHXsJhM8;<@l1foG2C!Tz$Hq_*AJQ2t!F zHQyzlOgmy`L-jaxdG8zZSmbYjyHfLcu)N<8hAScs(Fo`v#&iuPhI`TbZ5OsG&i{|@ z;-)^|26-V^}1%SC{$fwER>fnd7usNhQx_y4fZ6UVsTC>2^=F#PhX9gi_ zfYh}lZX}~xy0VxQ|C(orbhj(lk$yAsv}>R5PA+YduG6Z<)FzsYv#;?u2yO6qC;y#L zb1Rxbx(Z(_K_TiVs{r21o`DvxA4&%wzJ|A)(5D*uZaxlQYrIuLr+SgIr^(-RHgY~} z0QrT7%+{jOYsw^0<*bRxl9A~j>wk155ZjZJ6ux&LJ>u2Dm z($U@V4d)k6sp|dF2jjl8I&L__;=?cT3(Ppq1|7wYX`F(D1@dR)HKuoLy)gKQI5N1r zX(~30_ebLkTTa%^1(3@6%TmDmHBx@|Q()iGOTS9^cywk#OZfO+N6O~av}qB9Q`R3XMiUK9Xws4;Pc1h57vB> zeQ%$V#IJu!WBv&Fmu_!h_7E#uazv|Er@nfZD5WL{Pv*-md)<^>RPi(*5CnCy!2>EU z_Jbi@2N8>*`yS%Y5WpaMwJQhKZWr_mJ|Oyt7$coKQEceweaAhiInKwR2280a34u#55s zMy+=NGP!VFfv~_N;j}DZ|D-HlFAuq(%;0huj_ER;j-XYm1}X$uhnem=U@K~CL`X08 zKaA?_8_q2eJ@;HNEH=FRIY%2gnz|yK>msiA(Ii7uWWj4`#{h1I_q<1Gi#dIfQ0Dg^ z&DFLo*Q60|=NQ1(0T`oQ#$#N#X!IUo&3BjG+r8@?Xnrzk20)QYLH75To_u zOqQWyxnaE6eY_Jt^=>c}*x8rA9F#IcwMSPpo8a;ns`#RmnHni$rU)oPd~$}9{1*ME z41oO70qko>q?w?y!!N6O7@q6 zk44&6Fp{BlOIZ~YVx$BjQDq5txZzy|xoMb963>9k(ELTeUb_1ll%=$sT#O+f3z2Qk zep>>HE&YMcSpo#WNZgn=0e}e9un9OZ-mEf=s(H6{s*gZ+17WtA$Hds`csJjO`;~% zROzmZN$%T%Hd?y#c7ScAYEYS9!i_TdeC_5+0r;HlZMRa-?fqqzt9^FCKg;{JT+gFC zyTet7Ek6;J%1DjBSdZpvNuq9c9=l76wM5J~VWY62+c^Gc+evn8iJ}i^(SWh|LmkVd z9B^~P&76g(qUnBI-wMAz`%>>@v9X`VGd=YIwK8wg$yJj(WZ>=@bZUuWbV-?{wBMz~ z6ml#!T-$qamAjdtts+ZU{Kgy*CBj)M*Aq?$A}m8sXtJ1RP(|<{rrVDJ>}`djaciIm zS>ow9x+K=Lft@q@8sJdqi05*u;wO*#Tz!pT1n%?ZCO#}|X~=omE7x>FVGb_<&d*Pb z%gm(n1*{*$I;;iusr)LX9#MQ4BPGBae@I2z)dGZ@9R?L z_9vQuGo+*HKh<6uXe244#@tOWcN6;3_a`{^aB-SQ7D*gNy+P7`ru|~&_;7UIZtU3d zdS6Z9>b9DP%emJ`y)4uY>trD++vER)XT()(qjb zso6JpEf134lpj1VeDE(!h?jo-T?D~NtvU2?QCWx5DFF*{e1fFnr%RUW4XzoGTPDQR zoi35o*j!+AR+Y^VOS+7;00P|k3deFU!Z-*d>sadUAwiKJ;b^iwM4BedgjCIS@-X1| zveC;}#5}@bwYEs->QawPTWcd^n65k9zCR`qqt1U)&au?VwymM~OpY-A(d5R`ZS=F7 zG&29HeqAoZ)rjIUH1pAPDy})=w|jv?@E~1Qkzg=zh64eE*=0FNSoU5H1@iED;nfJY zY4lI{1K%S2l#!K688!sdy8ZE!^x;({0{2%Y-r#RwKp0R0*?`Z*tSPfMUT{wmC_EoA zQXkc;8cxh1rYkLm*VwG=-*yoL6GV&}C`SOQi+S_HvV;bov)W!;qdg_jRL#OI4r+ud zb}ehtP%ub6^mW3;$iXuZj|P^!$KHN<1<)1La2$hh4LC0|CAgc0=Jsl(jnzN|q1`i? zfOhqXy~CLQ>ZW3}V!sp62df;Euoa-ktA{N4AXH$1@|qI3!{{v3=op?-a!$aXlq`_DE1s%6T>_yNF&!zEP@4G)$0pYYqrKKa!NM>RPX(Gp(2(gAycOolG-%ypU zP(wZmP>rA&Kma>8F^`709p%Q|u3VWR$>-l5SncD-eM;#-XfMooA>Qw>QESDY`q0vP ze+#&ax9I^!g^?h>+cfc+-1Dm~>wUmIyxi=_g&O&qvX-we;L%NuR^JsRvTRS>(-V&; z5h&_`zlaVT`7mGW2*ut2eIwbl3FTz#?co131e5wE;FAp7kaMpuM>ZAfa&W~v5!6iK z3V6j-=f+{7m#9K7O+uYp)e`vXc>>KhJk{y_dd6oBeHk{UFsLZB@seOF1@Uc)u+r!D z?f7szP;lW5glJ1x`pPbL@=<#EEA4eh$^k~Yox#ry;;u56vg~DR z0s`?+bb2c>J7Hp|&R{(}9%Qw*VXibNWMu;l5SqZM@z(P#{4oWHcxcHvztxa)*KKF* z#4CXh>jFw=Y!IN$&NkD3CY(Mux#por7#aA(#&&}#uFV`)U$Fi$NsAZZMlv4)z|y<2 z80URxr&;Xr?Cw4-k+Y6dGH0Qq zz;8weD|e_l=##$^+}nY`@4f8x{r-&jiu%s7BIP=&@GTp^wP=Wn=Hkg~Z)2plx4Bge z-_3X)00xs@xZk4BZwD`Ry{d<5KfU5B?neg%v~9F}SxzV`MbIG2F7KU*o_vx7Qr8$~ zlq9nix-YA?hOl3OmdpD2tNYn0qJR(4E5p?QF`t(#ojYR+Z37OQZ@FOGZ@X(9P2tJD zH-D?Me<(Hn&b#~F$y%T_?Y=O(LttA=iOXQGS_T_5e~WvyKdI0NbU8>l`vx;s<}ij+ zJXm1Gq@b9wRnW$aISeO%R~jbWedsgbRfiyg+$;)}@*`c{sM3|2F+t=gFQC33>pgfZ zwD~T62FL)>FWH4`T*d$rXj3CwsrRCTx|3r1XjDt@cp~^+=@Nd&R2Z85W_a4OhEMD( z38%8`PNgK5LNkGh)0b2k9Nz{=mzeP@N_Pze?6Moqraeopyc-m}1tg$vkbn5e5fU)_ z`heX&^{CXCgghqL`d0TF$FpI}t{ykE02d`4dcG?{2d*k6oymL`4q%=2xhZJjhtO{j z&ftg#_?rO6TrOOIAvDs4OC&mJBVbElfy+45PyqlJV6`_7cUV8$p6hpv5K4W}Zn~)z zZ>_E3ZDT3u8QYM<6M1l*nc$0J>Z|X9dsxX(J{H{4ETn=-BE4)Wt|gz;aysE zG5XL8$89>5b*DKjDHDOOqllm}{H(RP2ulev8T3`dhryMYya5#?Z3W9X-0=%l3-Bu+ zXq~q1r~zcz)r?QVHXQX+I-U?jZ4w85i3r-+JesvWSZXfMqt6hmT}q;M+Pm5{0ZjQ3 zvq)Yqj8}kpItCgJSI(ymw>(T2&0rY94v+9Q8~sqhGKi!VodSH5l+e z2b#k=DKfxa*4Cb#uSjk6ns)-sk%@xEtjf9BoWghcO9r$SUDg{5=o1BVl10d$LL>#& zKT032x}4I`!wtbQS;Irq4*f;vN-kjWJ>B?m^=ra};bb*3mn6Sq`UX2;vC6jbXFB7z zNS4ZdpG~Qn(L!d|D-I|Y#hXOY)%&@ebFI2_S{AF{;ls<5&t9qGW4L*Qu1Kb^I^k(}R?9=zcAlCcyiz0Q*D4^T6 zV0k~~v~NrIz|denbJw*W8SqYuyduH!0>7k-69BpZVy927J&*R=58oEB!ssX}$)lj> zD(kH7i2$1Gz! zGS5J~z)=2^AE1c1w^Y2p^Xy602?e6FzTemyz@*aH04mp@Tw(wp85R=0=>XCQ{4 zToYY)cGtN*9Q??q7({J&p6@q9weC6d^*cCG^L?`weciIq+~;=4&o2jJs9)giN1`SW z)@0zs2|@5i$YPre!wtkh*<1&J)&?ECdK(QFqg|la&bHlLM#ad|ljIVoiNGs&eMZ9i)>;AObFz!ifEKm(TazgCJl9c3vnLWtrojFa?mQ zDiGnUrE1y%<7>m?@8$DH=sb37nv)-uclvwg^zmY1IzG7ydh4WZ7g1qMe(e}j11%LJ z&&%dXG>X>M@R$Qrx8NrOK~$Ti0wC1z`vWrGPPH1^(!&B1c&jAMA4a>u69o4RgD1>+ zmeT;>8HL)4k$B_;(Be2h>zG0p6wg2mpu1JMSPIyqF|C8Lhn>xv6?`CLT+0mCI`ys$ zSN#drO82fvJ|{npukH}?`cDgKmS#2z2#oYYfs^JzSkDD-oa8rCWHemvADSO(n8B~6 zAY9$LKCG0cAx@kX=q1mb7I!|q82T_cbAZYWc*>k_VrBtgj>#6Cv%WAB?r#kHXfW=d zpTXxm9QcC05sPDv7H=|d*roGFNih-~6HbfkfxD7~fz;U#`sHn}Z9sVR{xZZYnA#N< z@a%rN;;!jK^At6EBvU#DBYf1)NtiAsLVR&v`Bq3Cg?A?&UUCjZSeF3ca$v8dUylXs zE~jmxS=|}B$)6rrqG~~^^4cG>X6AS7gi3Pv0V|b+RC9Yw3V#l3Qrb5XSb_||c0h~R zEpO3)86U6ofsXl0t^%_YR|dQAR$dJ0ZYIQOKWTa^;v9wUiP*e&{YNz8_n&fkO9Qau zAFuoq^+qXV4`wj@-CS=Rrq-wnPx_@MFx0*^(}w%_!jea#!uUBQ+zoukzx26SRP8~kv(MVR6Xacp_~vLyC$nXQvd6D1gB@w~yna{ucpeI{un>|sA# z7GS}<8U)8W?6ytKPGbjHak!_WPVYZY`sL8SoUXok1T&ko{XiK=N&34I=II9(gwVk;#}zxe8G6q!elhk=ldA1YDj z1d3|l4W=)J;$QhQSJ{n{9a^0Psp>S`xk^ExbX8fZmEs^kanj%;^C$#LG zs8SYTt3^WKNNQ>#U#<6Bsa?dA7a1dGLk>() z{1R-%G#DZ}5snatK5kPVHvqPPlSTS~RT5duZ~n#{*l`1Wt;d(;^kyxa zH7bUrnfe2>mHkN4RpCM$Uw3xV96S4!d^euWs-)eJ`Kq}r;a+XgoK#%^%pY9V?{66x zgbg&)1N^`A{b^mj+4Z|A6HXQ%Gi&=q&Jnx;h#k zhGsZ$=0IV^+1rQ&TD-ZnNSPKo`*^z#_C8L|N6}dG6C4acdiMbVbaxiJ4p?70rIPZw zUE-wKe>sJ8akU=pNq`d46;?yj;BL)*Qp7vVqod5C*$O7U4l2FsQLrHJcM3+pZA%gu z2u-O+1{`o?9GV(fX>~THhZ~@S+sX@DYjk!sBXmDMZ2OOC1IkGR29WpH7LS#uTjVWg z-7;q7!IA@K#QE-{grIIbM=q-ipfzo@t+D<#y>IDY$MdYECV-;WFl>ms*9Zi_@tSlF zMC#`_DKMd&fL$gB)kdMc)vSvQ@Wo%#77VHUh_kW?_x>eQfn)KOGP^89dUT9C zFzO@R4-A4JdTt4ZGVkO0(R*Wy#}*AA_J)ZZesD}7vx8-x2M^5*ZE8)Q#~I=D#m?g) z?z)I0=%4?8@yqBR(;j^zZ^PBBm73E|hT#lnG^d}Fk;FbIrWuCtEjj$x9t;33N^EXB zXeM)-ZW3KyNXTmOzxF;I7>^VJD%*M~P3ODi;+Kz2!7wDIehWn_Kqn#__V`iQsC-8f z_3h_Nc3@A4UP;nIE=P5_oZog5g$T-hZ(sU-=j>2kR#wh=bL#Lt;(h*Y0Jh_q%WZ5M zP|~%X8;n!4z;qTyY`#McAeT!_Q}vTmWSl*8^Dm4L-d6z{n2v^aYyocvWeQu?F5Qsx z1MU0J*OX*;@PJVziWVg?Jtb1Gg8b7sl0Ln@E3sCZ?q}d+0}>a|vvYGNA*r8@`d z?(S|8q`O;65O}ZO-}{$qxm*jJd7gXEIeYKVffI`*I%wH|$|yC$`@LK0xe|4G_2+$lOze|fI477YcsQL2$>idT5O|acXe2CJIJMNxb>V|c&;qG33sVKpJNVf#>dg**a}ll z?~z7B6J^WdgE>Ygt9^>QOaeb>6G_Sc*Yex#@HJ%0q#X8r1STYZ&ftY>daj4F*Ar5> z$Oi&>zwku+SG)^4h3i`z#K83x_v_u?u+*9YJf`TL-H>gxTGQ=Y^e1FIy$T*K|v zK-mUwRvK!E%NE?uv)!GXHr6Nu;a`Dv1~}oP(1!Q!TVqib^;fU0z~lP6W8@{?l*$1s!Z@4!jGKV@^PMpgS1Rj;+Y=@j{M6O%0 zh(Oka&G!om=oAC}L!(gi?fO6gJN1)*qMZePzq%=%{a=s+xR1G{2o_e{TIMn}LL2I@ zHtkvKx^o=|8Krf69s8Y1S_J2dsXWb$aHo72C*)6xlidFA$e2xeYlC#|n_iHjnH@8H8AZZ`H={gDYPO#24+hhp z`zjQNrk&YUc>C~FLu-(fpRY|o7C4rDF7%m&*{?wZe!X-+?(=h0H}S{l+cE6l@~TYr zjMEIjuV5@^_j#m?->JHbkdEXp3If)l{!Wh!#b@RZ5c*V>QlNA&jQe)T;40>v;i$4}U9&dQD)Dro6^BoJJ5XFpiT6stT|4WrvdtCTVq8X>CmQ5;@ zh8E`TzlNC02(mxt@r}>p!vNl6;SPt1aCW|V8IH%eb}@Fk4?}?<&M;h6L6whY+!-P| z=zI?>g`0l=n_}wlO{Imtj?fJ3EDZJ`h$2Fj;=&{Ahc>gOf3dd^R)%vJj~LpHI*_M0 ztpXAE%t_2oI#F^bzH15ff*+bKzwrT4b~CG@aKQiZtS_vR{uKpqw*J}vZWXoGF(Mc{ ztw4_>5yHB@kNMhO*;E4)Dh<0|H<_Kr9XYcui@{@bS2CEPbr1)~hNF_aeSa)Gj>s`7AH`Ez7snn#@sxI$V6B!G^D z0du#Hxe&g7eecKF|IurM^YnJ{WcBH)MD;U-$01mbsD~Sp*hm)cc-Yp0p&AOWzLNHm zi|{!T!dmr^yNl{-ZfgCYs6Bthk?i<6jUP-ti}UTEexZ+XWH&#_08xz-au~b3A%QMdAsH_N$ohuyD@0VvH`O|AYj1z7~;Ijp@M|6!74ihS)cN)k3DeXVex)?nz z)ufCuek&H6>@yaZ`&IC$9)`XMA6He$N@(!~Fnlr#HcoXiS2b~@Hq}y~(o$7w&23{<=_c$g zTGbkn_lL*8YQQMZ7=WPm;7$AAa|W$d_llfF_7Z|jXH~Ih_LiSK^Z8HLtdvae=ifNZ zID*BPEMGfTcuSCI9(~W!+WG!wyxw)9)cKUpT;s&GLUmuj)jZZD1`cZ93m6mgH0cp} zW1vvD8>i=zfG(d<(u`wASbet>sjU+3!2{-6LOqj^nb$pb>x8OMiT1fKUu^LCS+2fQ zAb^-#0$b5i5L$sEAq--?Z$q$;UCkN-bo{Qy4=CXFFl=~laTJkgvw)lad~FI)rhtB9 zJ$`?1VC~!!PlO;Z(FugUvJ$C0zJYL1S@Qfu2G$j<23rFhbJPKh(&B65%}mNASN@E? zVIq=HE8~ua?TR*d%-b8ofuTTlapKs*rEH4o}Z`$KBL)`KkI@y z(sO76TkJ1U-&&vHWTSi2|3D?HEp|sv(hvEhU#?mZRDmGAYn@u;M|NHL=%u!$y~v1e zV`~$*n8?R@_oZkFSesLdyH%yDZJVj$H*D(M9D}UKKnB9NJ{4F^((hm0&4aOcroGDT zi#NZ`livdA3qh5Uw52ROo+F6QP=tkcJVIICZO)~)|Mu0##NHJ44O@1ze%0W*W_}?C z?Aaxp)fTf?#@NkN`LL7Q?>m|9P1Ky25MUnMh_5KGPkmh-a)$%KH9GCUR6X;?Su(VM z-)>3_w#-XMNI4O$o;$F5>XuG)({FVQc`D^^sL1R@v}tCb>A}W9Xgn7&NDcW}wsP|n z@@Sh1QXQadL2HqeqBe!z5%QwfsO|Mj-&^3q6NXxRw+n;P-*ct1f$L1_Jwd=+hVvw+ z-WX*@#_-Lb8~^i}b&M%zXbb|q5d_rzx^=Faool49UhU}L7jta(>E<&LRpkegz~idV zCFUpf&6VZ1IaD~u@n+ci6S?>2lzfxS&^+mvDKMylbkejyI2rjh-nz>jPZ_fu*oSklf%f&PRA5^gj{(5B5+?v$hGO>w52BtUU7r?}-GB?N)FgK^kdzC*Wzu>&KBacIwyW-d|4n>~Yr z4GYy(@vtotOjYw6_g7?E;B|O4GsvON2SPY!DpbtSyX0{{J8*mny!76gTtla12h^bb z%xKVQ{fDR+L<71tORAUASTI921~M}dLiZ<3qre{TuzY_-UwE4=e?9Oz32r_9yUt8h z3QV|ip5WyxK{lgphAoIm4g*bL&A{F{n`<FLTmCW>fh@r(!IO34 zqH$8xJUg1-r+yGUS)iiPqi~alGb4P<6SNlMQhwtz5F6C#k6Vj44W}R*`|AuP+Y&v{ z$gAU?^tR1B>*iiW2ghMP-rpvv*tGdn$-xX` zxNYCI4Ot<8F@R|ncuLdut>4zmb;UapggcedkJT6fmKsZ1ge<<|79Tzv7CjD70K{O_ zg%wq=nv%GJ=2_ht5wrLA551{Pb79Qk`DVEVyiq`a0EUp-Ygzz15R)??o%)W&;~u#y zDuc85BxO#qX{Y_`7lC|OY}AYN!9d87hV1C=1tVbO z-E@_|dYey&9p+8sYgvsZGm|n+CPl`#$Mp30@&PCP#-{-XLW9L# z*WJW9^8kbf3WEPMhHss7rxon5#1`dMd?biWL=KEQJkYHB;>9o}W>}$o?G4=wZwCY~ zjAZ*y{l_G|Kl95R{H2bdI`$z8J<#^`%K4+wFaR%U2KZIry{|Pspy%C*bc=SspOI>E z_>&9I0WfrYUxdRQuO-RWLIM01eIS61=++Lr=A%E=mD03(yyGm|~fGLGIfl z=cPwI@v#?HoMUpLQP^*P9_`6N!TqhTyZQ_W@{Ab#A`~sB*5$b$t?gwSbmJw)HxJ!6ZbgvpYQ;)_9g>g=-hHMRk)wCNFFvk!RT1P zOlEt=W<*!9k9)L084hTMQGtO^=dltuEFMmM2iq@RCS`i^PZ%9$e(-CDd<+v)o%1GO zAe!n46w?|f%M;D0>md{|54EjMjUl`;;>Xn z5lOihODrQoEZ(NoEk@3`rVrEjhC_|R+0qjJ{c4_;N5-K1BG;^s~5yWN!TGpr*{cG%d@Bn^R-;PM!Vr+2|md6|O5AD$WmjMw0 zO)QpDZvXTLhqGLERSf5}tS+5E|Frhddh(K)`K@&ix1z3 zrv(R)r3P^VmKiZKUUhYPIxR6K2)+i%(!l?kN}SMMm)Ko(Z!q9W&sp8?A4J(DtaQ_> zy7bI8OO*JdW$J%2vZ?%*xveTI(71WG3O|F_Bb`w#$k5mp+t;%l?di{T#0&d0r(jln z<>2E;DxvyTTyi=PXx7rfZQPnwXd{99OEoj_)NX5jBr((IEYZo;Cry5796{!&k&aE6 zzTZCaOg|sxdiq{b$(r|iXs~xJ!kG|$bD+sklNJQl%cUiO`O#JV3j^YZ;4pS1*9gYS zV@%Z6=e~SlpyuxqGxuz$J61uYCZ-uzUL}%Xi$Uz1wr67y?$Jx+i|-;jm5_Af)*EC{ za6`^(#uW==bOJ+VUUOsHGfp0Lt5m1^gWwURF@rxKC7}-*lHjO=u-DQ-Oy@vitIvUB zPGihze-+O9w}?0?JuU=TDTtd+@(gya^042oZAW^$dxcOel1S`f=3~pjP~xf45SnAL zuAe70N_aXr8lf_5;hIq!lx7UoDKih&&In8=)mkjSY415rs@)L|=#%`o7I(Z;$ zKtQTN#BYZL1hY^55v00oyw9hrDDIIUx^>^N-_+k%es&UVCCArg^Vr6ELc+{Af71W$ ztD|Ai)ac+LTV7zUr{K_Ee>WL_Dx&6P>Z?p5%H=?$MAT?w2=_XELG&}`WB{=65R6Uq z1Q=um>-cmax@Etw+Q-Qg|efLClCF)uSgP@KE#W8{427wRxBn!Y3lQX z)fPTx`({;i7bCrk)Us%$r;8Ag@4nN;kz0?{8T%<9D(Uy7TL3OQwkOneX&nlk#CY}4 zEIhc@YKhejyIIa)n0{jK+)-m|?}elC3k$F&c6***S#Ab7kB37JKC*fCc;_g01Uzq9 zq08QHL6_Xx;ZeQckLd-U`rd$E9XsN{6?*%C(La-bAIE_EaT=n@_d21e5}Jzw zW@hZ(&YsJbNeaPZ)LoVdQo2oR7DQIj)E&Nc!9&}MG+dnC>A_-r<%J0OXk>?OC@OO= zBth0q*jB}+;u%(A=$i7D^Uv?ppV+Wa;m8#T>t%Esh+u;%G$JfafHD+6-sT{+zZd=g_X`oQVXd?^yhd^5Lu|xuZn15o!uPhLz15D#%uP^&I z43Hy|>>Z|u4AZmB;NLeI`A`X>8X}R7ftnmEa*AHIzB8IwsvW4t)g+Df3?BBqPd_m{ zo4iBImvHzu=`Ybd^zm_rbz}II({06_l;EE}w_#p8C*Zt>2rm}c3^`|khJFC)KiQe4 zlQ5eER(oR}+z!1EHduSEPFZXWKnb@y?~O)*f8ulLT4?*dR`=}`wTX+G>wC3KiTjAU`g$YP%x*s7s+GUhO?f|++PyB7L~1pZ<0Pn}98 z72qVzlJ)k3En%mc=Fu*gNq;W*w$@9{f!|O&|5B`H%{^zCvCD3~#~262Ub^{*CXL|{ zX8;K>9$0|R@Sd+I1+-;*#4@?KtL3Da{!1A|MW;&TDxt$AXD4YtR-4~J=A z3%7M!i-$!A4nKf85i^5b=**EMwRz)q+ng?&dNpy%73PdP!gIA=W-IceRtn5?0$J1F z(!+YVsv303%quaZj4@OxiwZae0zoYz0Y5lWXQUfeHdK5;kHBVI>-9UQRy;BL2Kj>| z(192T-`P{DFD;NvaLW6?dxv0xrM(`5LWi4Ar<}jKy51NCRSPkE-AM>~&;Du!@7um7 z;!0>7f%({AS5u8sHffJdGFk!F=Zm8cYTVLm&#WDO(a?N=wUl!2-tS2AR_9$(;$ z(c0Q>e(ud$m+rQ_tfO>HE~99Dtgv<7bwIt(QMv!&A~qiF#Y}91dEa!(A1wfl{k6G7 zKU76MQbajY)LBga=cZrmodk^`hWQ(E8Av7lQK;h5MmmVb1j9=W-kdC7Z#mNCenLPS z6Qi+%QWob`y$QaHLapZtR9Sr4m02&-j9f?EmHW@zgrEUImE;Z)jVB)ABLV4=XQv+J zfBupwtnb1t`Q+c*tsp8XQKlDjMmjUk=CeRmX>{E_z8KHQK}=2R-pt8jh-YhLSn>&K48mg~dg7sEBz2aj9X-@)DHAg(JRKbjr)5;x2NCEsN9^cF{0gX?zi_jc*c= z(AO^9cr)RLg2sLNg+@TMUQ7Ymn4d^93LNcMfbhB6kmCiVGpeN9V&W3{wBjL!H0w zwyLavF*LP60O(s`7P=JUBFe~|lNb_|Mb9jn;bOU{v}q%l>x15WB^7)lN6P(6v7m!% zVmfoW_r(6OtlwdAJ7$K_G6D|ZnL^YI#Z;1&@$G@^f&Gm^woOmDpx zfv?#hWdw*>Zc1W8nO*LOx`k_~)DNIaym!VnRSUrHzGj zvn+xHCKDkU#~`{!kQEorfX{Nm+AcQG8RwjiFrNaqR(L|2FltZCZARKTmewVg9>bWgH3IAlvYZGNJu%_Iv9sJA} zW0|^-A;Vdmm)jjgt6Jl*P-_EnO8+dr-KCeQldra)S?*mF23QLt$U5J~K@hDLa{-{+ zVLZ5o)kUw>9!-T^E2qmiDJ04NJCmY;G&qMHv`pp6wuOwoHD6;!VQKSCeTAw8u;x=? z&rTBjP+rFAuJ327{}}?FYB(;0rMSmZ^&5RnX1%ua>Ns8N?J2$iyO#LM;txi9umMu0 zZ^eV3J33FgfTJQvgm5dO7qeGY>Mk=Ft}5SOrkfBW8HTV8`dqx3)tePr2yih87@009 zy=$gYjxiPYSn*1d#+JFU^}HylH4y#9M2b}suaAuf|B^PtR9Nj{t0$4-B1jcgYDW7y z!1}}rXrkQ9DJQ@}_lNL5W@0+xMO!hO{1p2oCql4&ywn%=qa^iCh+%`wxjcnAEJK8O z;JfWtA-YdI4{p)3zCGV;gL(;F>!biW^SJTm&8z1c^UOFb25Nrzf}iJq;rY+Jro!X4 z0Udf0hz)t2MC|iprieTu&~mFT+dq6qK!pRZK42A~(m5a5Ju{w)x6y5D#Qu+^JVCE* zH2A6TKAUf#dUf?qg81%>>?MjS06c+DR8rlE5acT@Y%t(7h>GLLu{BLV`m;c7 z4<1JxB3}9oVBN^SJVqTRl><0~<5;4{P~^xDf&po|Qzn(q+K0UTvkHH?zOMVbMULjl z;He-AA-)H@1PTC+>;m|qkM|pZ01iIf5Cf9xULdH0af4-M!C`SD_zlrKg?AeQ5cYL{{aAqVQYuoGJEBqfhOl28I%0NuQo-!;`3@6rIAo->29_qj}LtuMMu*ona z_$N8p->2u)Y+BUL4*20VN$`>zgRVmXaH7u~bDcK>vO zOY3;s4FT{GO995>@*|BWJj0O%hM|);wjgoO9wrR=)CI}0hM57GG@)1!SYkZOr7el> zgh#KqpJj{o^`dWY3Qs6_lKSA?Bh2Q4?tV(UT$*}qU|SL454kbBn}5#bU0YIE zKo=F5nCZdf49CJb$PpsI$HsyPZtI*vo-h|~xYqVxAp~<*YqgfYZZG+PL6g+Lnw&g> z!4Kd#ePVJAHCy3&$7uM!m+Uy`i04AQ%ApG`MIhi&z3}xe@%j4QpTq zZ#07PMv_Kt_aZXYlWm2sKuDjN|EV0)-e*7ef&fH&D;Z}VZa@8_Y_{dR5iq-AdD=Sh zH|aa7DE;_%Zn03rVfdZ>y?^w>j(VO1gxtf%)O?-br06aZ8=k|MO|m)vsH)P=4e}2_ zIu1hx?#9WVX@13Q-`@+2d_<)zN(rTLZq(!GPvG->oy5;OLB6|ETSld3nre|I+O_C? z&fuYE(6W?>=!f!%Ddd2$aPr=qQPQCkvP0Vu#b**mFp|E@bKU#?w6)#wt+AVptc1DE zaALDETA-iHS(|Z26B?E^v!~L`BQou1eG`T3;O`W(~ ztge6d_@FVc4?LJ2E@c1U1xFfaFox;Xf^W!X3d8@_6eNpI1pqs7vep5izWt-}Y^|j7 z3~|>q;1iO%Q?BTnTvBu$M5I-AYu6JeK zaMzw#)~ovWB#MZPPZMSSVnG7XS<7;KSM|3lQKr3c1|jO*fC}+Cp5I~oNZ0xP+x#+l zAF%Hn*`OQtxr#R5;lv=$?B}JJzZz^PCx391jbd&--AuAS7QLsasAEN* z)&?pRn0ZSx-}0E)DnKgij(Ywbhb5R|a|-iJI6~u>+wW!+-fbX5(MMC(%0x|b%^wy8 zA4nXRt!CniwCe!)IDf@ZRUUF{026$GfGivLu)IHV5H%$(kSG)`NU|SWZ{$m{?qVq5wWRm(yd*~ZPKKzSq22|7;_qkHw6kS^P7|M2tY%(Bx z?Dp$>okuf=!#Y&Oqe$;^H2S;v4F+z-s;8{v1iSs2xckwCAgB#&xtU|*Cek%E%+x(V z-b7`AGltP}KQj9Cf{scaF3t4G?>2Y=QvV~QvVbKN1mpT6&GAl?44s*n7Jr0VvY$RM*qF93 zqjLgAqiv#UyQG-AuR{-wy&I+a$}}!T(#g&I?f4^Ne%FyBNY-M5)`RrQ*3iZt)%f8A zBH}ClC&Y}NVxs#K0wBLNz&hBFNO?RQFgHiRl!dCGKrS;CzOv}U57SMGdJaK;M3A>k zzc?c~P68Veb`Jn`_(+f0kgtpbkTX+Ru;unDzmtOf3_V0M)t`nz(;M-r=TPW!y;)gJ z$()}jNM(jt+}Z#z^wDZB`(H#_tf7a{6wp!2ke(f>#!B)c0+<{IE)23!)OFR01fhaf z4Oi;q-{>_YQMJ8vrpd)*c14vnf-<#9HT3e^Slzj>#Q50T*rOMe=n=j~cPvX*+vx=j zJm?nWlm0S0k)QvDs_=p3D^nEH+3zu6DL!q2WsVNx?n)17())j(juUvw=eHk3(B(hb zylx^3caZm;5aQZ~Wnw8kX$(+G0zf(-b^v~g=Mo_k_2Bf=lMm+^ z(sW)>&nY)@h@3cR2-Uag$LqUcjv)J{oNg=$*0Kd@GfHhQvenN=mA=4W`}goLNg|m45v~p;*xMSsDED0jw?2v9-ekU+Q~Oic zqQ^)`Xe5gOy6VQ`>F~Vi_Bv1_)zwh|oRslcIUK}q=5>G$O)|A!u>uH2b1lsBHZ9e; z{M5P;^zPc)0hpi#msML;of0@El(PhRw@Ya@`&M2gD1o2e2wZ6~@gVq`#ykEn?bbG$ zv8?D4=uR(XIHbJ=`-q_D`2mLiPL^UT$Q##NP%G#%Wh8t}F^>Ao7S9PiaeuxOC0d=r z_UfuvQ15o%_fTb#JV;WuLc1sp-ajVFCfaH|^Qb73eW9(XnYp#FMs!NpJECN}dFHFN zVp{5Q!hZefVKJ>FGvp&=EtTT(J$XwUh;5jJhoxsT#*lEIX@A*PM-TwsU%nQ3@HjZvR1xB|M_l98uRzy!wy8l!vad63E7cS|bnR^NEr*02d5_Mj@fh(s6 zFGk|`1mAf>jsVKJqc?7M11A<31a5yejYYl0f6Zt5|7gt^%TZmp$0_D$#L87rSD7Q~ ztH`o?3!bvoCRdCd(=*}qXO^f^+!*hstyhuri2W{2x)gmK9faF&h(QERy7rPd?ezCm z7vBC53oXCb9BeZ^hi?(SWH^>vYoP{&f|&~8OB|iwkO1~e_C9?0D5ZQh{o=HS_ED$_ zY*z{E^yJd~$;)FPL8)WW2q7D zdoa!AUC)D^UzQ0H`h^>+G>O&Pja6ov*~VTH^d=rzN6I~j)#>4mBOa#sAbFsakD+7F zrk*~nAZI|Sju&;Pt&qV^5;NYbX^NG`*d?N6Oi#*rcC9F?0bo=0b6Th zpSS0=p?LxM_cm7la(_I$ur6$1yxTDKs9(vu5}2=~BYZR7Ao)Nw*2NbipJH(kW&C+) zsx9*}gbUd9vFGH$r4NMw5%``tX@*1w3;D%OR)t|QJc!3Ok#l>K^b)ly645qk;F)SG zXW9#z$)zR3e?N`L1&xS*XfW`lo$Xpt=7J*g**Z+Gd=BZnXh>Uh8C(=2=ZxsvXrXy;o zkp7h{B1$z`4yoFzZ$AL|#bxEm@z6KRyYLWjVl~uvK!*U63}S z?k?~1?%_ z_UmC3Pc-@A*5~jK9m<;AO{N(sa$s9(6$VvL@U8s(36jyq?#J#BCa%Iq2uV|i7mdJa z0Hw>b0%)q3swNZJD{jQ>l$axq@ET@9&5h1p4mu!Hsw7(X%^RVB&3B>~Hrv%gBz8hG z!6Xw*{r?baF2)oqEBgaG&6Jm2Hr-6o;ZS+Er{kubG?1u*{R{V>3ffv-zv0c&n?8?q zmBJbdUhqFE@u_#owL|sDB3eB&D+0}X(%;9aJJzl3MG^H_`@^u;7^mewLv?15TJ7-P zLaGA&|1#klw6$)8K7X_?dcHnZCem72j#5(c7b--SZyNBcuqq#Ioa&|Gg@!_rL)qRL zZM|+yzQgeqs59XFyf~Jdq$f9uw7ntv$Y&SUI(Pj%ZUaeXg0n;~6SCS1SomnMxdF`n ztQn6Ga97jr&wl>P{~rvPKD+pIU8)P#E12A|MTMJd+^m7^cvGA)fy>nXznx(+?Q=My z=B_6PP&EU7>r$^{fU#;T;2R)@_z^>Vhn#yvdqEB#6XG54bc}fB$?FF;es22ycHT_? zTw(e)N+;!JT=6MxyghK_SZ%F-D3lg+>BjMyC%o+64y6de;@xF7q{mwuPM>pk1b7v1 zKAktfiemK|kO)pvMHcGnttp#6fzWPQR!6q8X1!b_*wi5Jc7~G7-cLqy^g9D`7SsZN z@bhl+NB_y5BE+*D_XysG@C&bI%V(qEf!U1N1ZCa1b9?=o=KPM zNJhy?f<3B0D=%o$h~NIGl4#%4h=U>|?LO(#!Mzd$uBebUMM=TeWWI5K#zkFAe)oGN z3e~`Nn?a+mKetTc)}p(gT@Nd)X>7wnO3I9lo+&iltPVn=9~QY(m$q8W1D>4T#5-*8 zxb?t5Jr{R+<9+E-6_=4An3|E%w43Q zQr=8q=RSImNnAEPo~Je{Y=C6p`Hw$r+^aiQZb6F+%@X`y#IQApQd_zM?#TUPf-j^* z4;B!4!t zCKHl!^C0h^2R|NfL0p>gnHGNrMQ$s`bKfcd+LI0ujOdqoI(c}gvt~9G{;K}!Nt;bh zCTgn32K$Bm9Mw>cw3*S?LMo2Am}~BfeKcef8bV~3Pj-~~IYr!%76p`Hh>Bn0H=AM+ zN|dNgzNmXyA=Kedq`VltS|-I7rS?c~;MT4fC$9^q$D>c~8H}eYXq`f3zw(x*xtUBi zWR+To^jIanP~);Ga>yy-4E)jPZJ#6H5s2wT*T4Qypirq}(uk01=M`!0Dd#qsNNVgL z?X`sPX(K+64B`su%<3o?Y%gbahw0O$YpIM= z&*mD|`zj93$6&6?=!94BNA-gT?(d1XUjBLNVnZs3MQV;2vIkcEV!+ z4kBY@($`E6iKBnJ@Cx+t5+QFQVB?gDHU|)TiO;R%s#1Io@9a+tF*wm@#wZa!-)0K4 zysR1M+X&gP``p}&RO0Gt>=j9nQ;D3XANWcm+NC8O*KPLxu`DSlg=8dMNs-yXhGH^} zwEO)*n~{1AtLZXJ!)DjW@4TM~E)pq+f1%0!2(iDZN+sVzhvFa^G@aOm(v+q9Za+LZ zB>lx$pG}VVR!}gO z37fsY_#oeh>sV$mu;?Op+HBFw0lB6Ah;l(GVCndl)^E5)e~~u%a#|=h=2tb-=#uVw z>e31shnD;Y8p8Llx+YI~+}4g#WE*ei)kcZQY7FM?CB|-a1kZN~zP{Rq_u`mHw?q1N zaV%)ebTPo2k#e=3js__CkiWkdEKZNtk~yi$F~o=J#G&O*41 zCef7Df+yx`-(sUadOz$T#KGlF58nJ(u1LCyw}_Cxz5hZiW%ltPnwX4Jl(+A)Z_M0` z`RC!gYa~CxT<^2%sTV;}Y<^=9p4D@`fQJ&yV^J-P=`ehS71a!pStFj%$`sSmg`Z(M z`ixypzJvjm0ZXh7N@>H(^u?~m)(IqOBg^wDoBk!j5JDO;O6(w+G&GgaOAdTQc&}0a zeajQf?+*9=uyJgzVX@gv*}rU(pTl1mSC=No*$>P!J*&ovBup|ErhJ%XFwK?v<*y)0 z7X0`qF1b=~HIZUqYtiB(9pn}Gi@IlhQhWwtFBULMZ`eYejuBDuvL24DsE<;OuwbERK z6txiM@pHkrzYjlptlAxtU9&6v^6^p!wiLHlFXwgf8&FB^3{E8Yy!0Hyekd+@ha$pkSjB?Nc(h zfLRBJ1QEi5uHkoa%w8t(8Nws8B2z2>w#&}+7k-M=YItGOnw-JV3iAN(*=?1|y#9c@ zYs&D$)_JXyx1Y*TFqwV)aKxyw3zkj8;5x}`PH)~2n|`;s$jcx9YR_B0nL!)L=VitL z7F=?DFH;~y0OW!0mXTC8Uj>qnY2JR~UlggaCE@RVmYh`jCy&)9_oGbWt%wn3sI{jA zzD1n#YeWpQ89OH;f$wDSq^TckK)=}w0`Y^$z7tpLPtLAx_eF)zNeK%M78kT29r(0V zu_3M;wb^L6R_OV~NYwL-D#)?eUsx)_liJIB9+GxWf4kP; zL?-L+b$YGxeu0}DLe%d_yqXG6)P}T2T{qs$au=GgAXnZR{I+I!5@XeGY5&1LVuMZf z6)}Q+>D-C|9Kk5U_hb92=XVWP?q|#Bd~H_wM|5FAF~~i5h6&U|Ihv)fr>wc(E7pi# zCST@CtAK7EnjK?0(!L#k8{I-=9g|f%P?_au{P`yrQZ4`*6nn`S8xYT4Y)K-uw@$tYbs& z_wZt`?aCaM?;3cAS9B`NZFfzbR1fWic^gik$2~B|r1R9m1_Ri4E^?Y`KarK!d2GVS z;7V0%xXn?yRFJZa7oQ?ji=^(S-VBY!(iPyv>=351RlXh|_)*!^9hB5wJb>~hHHRM0 z)r-bG&k7@+J-?s0c?K6_1TVp^^z znKzrfCGRI^K@q1(9ib%OCtczA}PMO>g3D zemqlFgLW zI10y|)`RFb{hpnctm)@_FZyxH(M8UUem46nliEUM4arTLN)&+|almMA*YS&wA5QzK zZS~x(KfU^Ca|#cU5q>Zv3+r$1QzDLJ3eOehCSWi{{mvDqT(=8flv(PTrx+2R@R0IO zc~tJrkujR?d|3-zF5$-r3H(=tMWAGO|*|<${l{syBYE7o5SV27Wgkb z{~mvkDX@&L);w@GFvve|#S!D>QGbZ}oxb=QYNWBU9MJglT8BLr#xiXmdJn@gU1l`tP_|`ARF9q1D)qY3d>(mWO>s?OY8> z(_6hUi?5d9po#pUj~Qs0AK^B^9rB?wpWv=s(Cfs2UjBu~D{ob_Frgk9YJdGGHEb2` z;JJ>X0Rn5C^9gI|_13&N=&$Ja0%BV=7kvvnLbr-Y@84&z@jE;8l5}cKd=7cJFT1k% zA%UaQ2Kz=Jv+dViYCk1vYzI44Y%x=taqK(zjCa?>4N^qm#Y^*AJBVt?CESh%K0C2t zgjvQtx1@(6H^>C2KCPYUf%vXajcEsPgo%csi1UMD%T5#(anURyY`M98lwXqd*;$C% z=WB^KC++mlMX^#b-x&rI4WUUjenzM9&+aMfWnnlFLYCk|T{zs~tXX9$|6SU2H*{QK zSL94lkc5Q&c5)kS)4yTlyx-t8<jqr&Oq@GV=D8r6+>Dv_@ z^Wsl#S?tbw4Ns{?Z^M}l<_uM{$S8JM99f4yKllnY!+s;Gg$z`L#j}GCx{uyJIbWv# zpxO0v6ATk4vjQrL3|sleqAluKWv*( zbGQ&-zv8Gko)O(@@Ml|(U>mcDX_G=OnwQ?KO@HCM?*eArp|$FI6i90AWEo(;Kl1gU zfQ(X5O})5T_RC%rjXgg*=7vcQ8z zbYDugPB|@!p;7A7}`1b|6P8_-GkBvyr^BAja0!>G-D;)&m41G!S$*+|u zG#2se9bXSB9VAE|Jypne6y(HQKRmszf6h%6v@xVqtfISn{Hz`EE%ED}g`aJgg;gD7 zX|`{ouSLk^>ExqUd3LW|c%x)Emph=gi}u1k+=?&JR2X`E+e>?v!angi{#Z+}aJf@! zy;K*jPikHZoelWl#{p9uYN%*^_`9UDqoB0(^4Qoh`{ALuTMBX`(otD|z3%pg;=mzD z6+-~-Wl6-gpuqW$U2gZ=i!b5~Vf)W5wN#IKUr}fn4F$V~3c&HSU?J|M**p)VM}?F3 ze4+7e>)X3rEevqeg`)d`KXq`BOefOt`^8G7s@fXI53SsSQ*Jq*y~0bNn#wWWbSnL6 zSCRTwCSNc;S0#h>yEa_szPd5@Fpa%3H&Rb5k*^9R+rDH>rt#zs`euq!$@wVVET5+l zsgK)xWU~loN>N)VZCXj{L-xW6%rEX8s84h}W@U*aeEffOoi*@|e9&o@pc8&FJvR7y z*!o8!52HjSFjwj&NkK0mo7ZQIM+Ye$*o{+8)?!6&>r}KoZ^I_&BvclULKF#xVqONW z;9L_s$NAOrc}rWR=fI0uy2gDP8#6cc<@5+_Lx%W39NcQ3Pfpy{_67+ zWmxhbd`l>!n{`8sDzU_jusK2R+oOT=)Y~c?BkDFVVCVyth{I{YD>iF+4ALEc&|5d- z^R+R`D4ogC;qE-QWcjKh0JSyX8b&qsGFP{b$8;CuE`tLF^=4ULq*i4)rj>F~7gLW} zEETpN{3I8$WF#UaObpvPp~qAEOa~*jF9TT{mC%G8yJ;Q{xoxtkY{QH*uW3xo4ESs3Im{!>5C>%0@ie(zN6wF-d3fwP{?4-c@u>=--EyG&38~h+6 z$4vFw)UAB*V*>qDkg2eLjv59Xs7DSx#+acq{MfrF3a)%lg&ynoU7Swp%c-z$9(V&Q z-EB!YrsW&|20Et;FvI0>FozOB*|@&{o$!o{VS3>*smK8i#uH7<V=%h2zJU;55^3}rhDkUd2m8m=w5N-ClI4VNA-mr+i zQm%2f4ynrTa$Ck!vh^Ldn-kB&aQzmjbdnMA3Z3k}b@@Vy;^cD~URIf1&=@^csfzqi zgYTacGTe!Ac`mH4Au#5I^1p8~=dZ;*@_geI!J+%yC`4wrIU@(^EnlSGkK|0M?DiE?3yteWM`L3*W$^}vq=!4|r~ z+!z*|xY>QQLILk^Z51Muu*<7#GzPq`|D)+D!=j3|_RuNa4bsxx-Ho(_gf!A6L#K3z zgwkEoozeo*-AG6d-2=mSy!X4maDL#!IkWd(>#eo(A_ok`tA!a5(kZ^j;Fgzkg9fGe zydux1z=Zc7tTDvk2t|y7rRa*6Q!KC9)5q1pzxNC_{9xEtqFC2%LP>8q9|G%_X*lc; z(U(~eLM>i>8+BdVZ5H}T21Lhl; zFv1swlLoD{NQ&IFnLSo&Y1M{--DMoIC!fuAeT{0x=B`2NWy#Dr zZ^-TF`Fk-FZOGO|oU`Rt>cuoNOnt9fTd+sVzhSjzqRIs$;T22jFY!fYd8>19pHPr9 z8O+^`W60XrVlB}<0EOJ@=dA;F!u>3Ez#_2ZG5XPV(k zR(_O(@%p8xGTv|VWVJ4PB=6rnK|FEo&)C20Q~yAJWD6ZuzpBkF+K40iM&+_}zcl|k zNbv0QA8OEZT~L5oz<43GE-ZJpkdf>f-e3CFa6VcJZrXx^qR{d7$%td13q*!Ly7tD}}|^WC)PSS?h~|VHaS&z67CjfRFPSe zQuX{j2TCPpnKEWDeNs0jvx`;)kxd4#Fct7kk8c4@bv08e{<{HEnY?2k+BbCDi#}|v&n2XiL6`SZ z1p!OD7bp|5vWhqg*;58NCWV-^5kL!%!h?rN*vs`J%k04L_MGs6x@eHxxF7&%E=on6 zz~}2Rn=Wh~IeM!^6w80mhn2QZ-RJVTA~YCVZ`LSGKFNsGBPY>zcmIx9eZLW*C)#d4 z7yG$xw3j{#Ru@0{yZuZme!qUWS;PJSv+JpU;xsx%2{^YdhIt!YS3k8q`*qEhnyW`+ zaB@@)8j!E#mtpFELDif3Eka?E-|F(1pd zAvfXXm@0Z%UJw9c;IU#)p35O#;Qr>Jggk9LdG;#1w?WuWe#!5>bWxfp_>RFmf=rP40(k*9a*4SYN)`X_Yy{;DHrX>EYF_fY9W;al* z@-1>_OCwskL_5O_ek#wvvghC%*rx&ROtcc(=e0qAg-bnG1F)`8!YZ~0;}DAe>A|~? zb7*iw<^-tHhK0UCMpuDI(hVtU89aRnn&|>?jA(Iiu)MUj8Ol)v*Po9I6lz~CPxf-F z9J+5>Ue;i6!HA$*5{4&m;41*Fhu;U@DnAO}0KDl=p^9&q!)ApUXk|cbbyRe6GT^+C zR9Us=p3`+un#@HdZUezwZxY+gOqZ#6nA}FPBkwfz$mWF}dDj!1O5mc!%QNKXC$GR5 z^m1WAC}A`o+QB*6?}opVL}W`c1uh*rym+D>GS_V<)eL+W@7)5gO;bxE@7dlzQsb`^ zw3x|@hwlP)8L>)yan`+)7NHM2Evu``an|%T2mqg>cClT5-Fv6Aoz?kaHnPT9>mmJ7g0z4O+|}nmN{j>?J0?Wrn9NY82^pzo1@KG3VfnGbCzqhM-RWg3t5Wv$1^%%-{524|<&|r1ntYrmJCBSKcS|6&i(y9GR*Dez8-kj<1+i)Ms>k2?GZc`Yu z#P}_88>IP1&w&qO*BZhiYv>f-rbUT##kC~#F4Cd-jKcaopJbXp4n_9goPn+Ekw69mx#lbBXeMlpzf3Bz1daKooorOftiAd@=d3s3{tE7%v8FL*+Tko zf(m>j_*iLp%%7JZO$|-gBE}L_``3y0>3F9b7i~KvnXP~>w-x!iqJPYIQ;>`Y|GJO^ zTy-ERKYvP!Y;;oIjKd=8AgC&I^@|>OZGk;K7-XVh09A$p1D4C^_b0AH#HI0MC<(ym zq7N7{w5+oU5*1~pZ+IwgywSO${O$wq3t6zEPVU9Goo#~?`+Ldq(sl;9BsXwAlc=fV z6`I-8VXLSAnTIdM(jRuFYbjffargdPV)^s$T8KR@!ptmDe-VBcl6}cSJc_Frufkv> zpPW6o({;~{VOGPy}Fd#kqNGST?>YJv{`w=*=m<&9t)$Sv!_#$}s#2bObB zjN&F+{}VrZ>s<;wfbUNYRCgo$2q35DX8cKdqa@hD?i9n6Cja5~huxscoESfbHIxnO zJ~-|xBWDNK;<4lwIwZd>g~~AD?v`fK(q87h!GU+t8aH`6CydljkBSaTQCcwL619c_ z++KB>ybLOw%8~z)(N3?n)eg<670*`%qav4uNN*v_S6%jGD`l8hD}pZHUA3L-4}(7- zU=8py*;atkuAj_x+B}8=T)w`q>;BEJ%7ms&)$>h?^mU4oIj;O%3zFNo&Z-+gaEJwt zE5%LJV+y^wE@`Oe=IIYLe$OiX(HMs;9?|$&nmrJ<()@-q`^%_=>Ad@kup$F>?S>M{ zTZK+qX0)QcVZ9+wfOA)m0(gjy$1ZDiTcG6kzGMfUMQT!acIJJWL4``#!U4qevfddb z^c+l>n96^za19gJji=?;NL-y5BXuor4#0iOJW3YO3T=AJwlRZ5$0ekO$4rM`ik!Wr z=6=xfwAY!n9|*P_V#-|y|Man65^-?){SI_xW~v)BIGelpR5wUUhL7rioX>=ci)!Ec zXXK+{%Nu+jlO*!C1nTWB8PhM>mqU%w;OXTwm5RESzZ!9(Cu0^8-s5G>^5mT>JN^lb>C%{_U)Y8zJiNkQ!+u_p}7yWca zWpox@PMjHDj;*FMvf8H6c%~ZiXwuhKx5r|8x8AE`9c&><-j82_(qpdb;~TEc8A@}x z&WQ%^{x+_4=gGvxS4{u!xgaF_4{c^&-_t9soOAC7ra(< zpGe(Re{TQX=m_={yvIRBc4D)Pu|>_1d)b$3#@v0pI!;N9B*O>HD5F6QH;kw2-du@J z5ux7bainA1eHU~iR^xD4SU-ZDO@LNJ=2am0W_r$>W*Aq$JkLSxvRmJnDqt@H~ z!B>++RhXyIZ^5hK*q@%HK}xt$e!#=)R~d1ZSHUOe^qN>HaC4opDj3Q~Er zieQipo%);Dq6bcx8-r&?SV;4 zc5r%+eeiJ48TMzrak$RbS}f#Bj!QxF;C?oP9@p8{O)7M_sazh0&AQt$lv2~6->plp z&pK)Da)}BXXUp(KaqTJ5jOe(Iv4fF)=(IMIN=pPb^JTf|L8OrqVECxHSIT)@Lc zlo@w{)VQmu-;zbGdoZ%;?6CSmmZ+VSY=_D)cwl@mdHs&(P`->zwH3B0O6_uj8E|-6 zIs6O`jBo3lmfT|2bIVq2X;|PrtU?h8sI!xW+5N+^#EnWdc zXzz&6$Dal2lmPu-Pm&o&7i=>ZZ7P`i_4zj;Q_(mS5>1**aZV|sX5!^OL>>!sIbs=3 zhy~9(r&Z$E4}>u@tgI7%W&vpQ5l(4OIG&t zz<}7X1vLm_&8;#>OqKpGE_d$R(VP#CVRv#In4A2MocC5L* z6hC0gfqzd6II5}XIAmD_n#Hs+RPg|OLKAzSe`h^Xg}`|jl`bcSDoo!6WG?h<~Nr1b}>P@M2*YkY;EXTuE&6mjxagJMrC?f|# zqyoD*X&g|cc3-mtcD28yXt&{NH#`Ns468!;KCWOdke^OP)L+v%HCZ zr$gL#%fDxmek|2-0$cTFI-!r#t6?^y3wr`>$uK zQiih3RdC@_R>31Q_wH}iqI5|uSAs}*>Bw%0Lin8YA_;DJA5A^6Uk(*tA9ltuX*|Z(~+UEJDpp#s|_FbAWW&t^< zn9qG9^BNxZV20%Ushp&P%pc*=Y-JN2@1G*|^MZyM;3|e8r46nA`G%(&?BSl z0)c3qr1n&*p*R3}^UDa}Y0snhXA|DJ1U3$fF7d@A%$6_(tc&K;q9Urswr^oTjB!%o zm>th8=Ko?H>?v`|g=wIgh%xQ`Q2x|>X_t7n=opL`!yw=va0*9V{U z02>hB=+myi3HhH5--bCB;{5&8Qz>$R`;7msw>H0X3! zTR;Qb*wNRzmCWvY)1h!5wi3u5BdisQKKN)_-BteMl#5&5w zoU98I!|6wk))bI`Q+_}$yn9#0x959r50u@U$!e*eZ!K?D6RC*7G?lzqqyP#tbDNpF zze9i{3hl9C!(VBJIv!y_%W1D>7MuoARhbU`OWjJG#?pm>8!|l9d4Lt^3fgil^_cXB|vIXb=N122QyB03QV*u|z$RYOKhGM=Td0 zdbA$w{F85m637v4!j^>Vrt0LU{bp*I`&UdgYM(Q16PiYUsqh3lByaF{=dp&=1ysWM zpjJBHL;<_=+U=~44iPA47T|c46$vplZ!kgC+A`7s_>q|#In2zd{ix`A5%`iq4DYx2 zCYwq>NYq_MzfNoeL{MS`+8<~6-$6m)H>8LwCb;{L-Tp$vK?*f0r1+)8b=q|K4F_=NUOZs` zFwkgsn~wyvsk?WWGn|3lum@$r>ErNnQ3r7svkSRt59DmSN4LDI5kPJd^q9f&MVs@s zMNNOQdSmuffz^9{IsqI#Jl1o=EL3!t>bNBU(~pPAI~ua3Dn{LkSd7iY?J z_8-_%2w9^M5( zhdi5EV&3~&W2C};=zKD?vPE@_>9ClRS7~^so&vpBzSumyLXOJJEVMG!FKiT;$j7kb zbI*1>#OGt zX%5Dh+TI*@NCNQrW)=B&_eaX+Mc>;KV{A}fs#lJ;T%Y6jT;Ze7Ox2_}!R!9MD3W)L ze-AUI8>HL!-!H~@u3Hi~f`d45r05X^C0g)TE5#+Dex;glelP`0%oO^@Wp#J1m7Sv| zpsxh>rDbctQR3NgsHU0d(Wy=eg9(>ak(G7hU4sEv)dL_--Tf%2?*=2gNcA7#+4kiA z5lC&Tt^18uC~+xH;yC}{{zbi`K)ji{T{P~8p7TMGk}$V6Js-dRdnWWE z+7+vHVvDZ=08n;;9_5$YGOpYZ#8!zgmqNy*xiTMrK))yXbtBe=?JG|4cFvHl$z%Sr< z1;+B6`*kG~9wx$iPjiGkK-|dkoKygI>#O+s?yYLcvIreZF9zxj{)-e|8+wVSAOj+i z!sk07lO?s3in8k!$?PvzpGRl}SjG1kX4-sDX>$9S@mA&K;)AiU2Zaz=M#|c_w zbN_^<`-q4pK$lB&`f=ULAtdrJyRn6bP}{J8(c-eTXhu^nRa!NTLR5l-D#c>XJ2J1B z7;8iZsiRVn3(=*}K43;?CP-15I>NMgxD8R~1E|k}S<2I6@bMjskfY6|V@q~A)UPovnmVhdHLpSP2wWuLU=)MBY35Srf~MhRvYKhElaR}>zfL9;+&TtV~G{*9pSXP zbq~9Z;K;+*ko&*MwCGNv+xGH7p-ZdBmVq?!{h)QCi@aXLOOVMYlNrF<5DA1b?IX3Z)I%|{Xxe~)By0IdyjGiEzp=exv2ZD`=iu{I{pI@ zlkj!x-U&q&*pCqa-?E0*0lixAQnMK+Xm%`)K3=)dpQ41E>JRlFVJI=EU2 zyNDW0?0yg26K}cy5Z9~0f{zxBC?Sh3uU~+>DaP|EeNsKlOro}B@qM*p|C;DxVaZ^R z!7_XLo47ZcD!Gz8{qEgTze1;t1U4owXrR{{EVT0ZHQgS=;SC;N;*DiTPw`qslz(os zQ{MM`3@(`k*dfUTtZUpC!#x;9J z)in%}msiIA+6>YDD@Z=@W18wXf46>TwpsH{Bj=1C(Iem#fM`$8%)dB{k2U)M%U22y z6`(!17q(Oqrhnw5xJWii#D&oe73d&^R51g>vjjjW__e&ZMogBnleGl_Z#t9%`^E2| z1`vCu0q*s1_J`hSTWUV1_3WO$EASopLYvW;l^U**egrDJWfS+j++lS#G@`j{a%$7m zlgQ6zT%~z<9$nL-i18@p5BVg9!d=nS&)@vMY?Qz#pJ33%fE$^p$A9S_6{BncH$L?MQ zOrMu9n-7)j(G7Jz`$^S_6k>kcYPjZOBoV4|M$fCnrN)~Bt9q>Yu}}Gh8Zaju`3b`oftbDa_J@6=sPi%!*|V7hX3Ms@vwe@hH`AIC3qXq8SVYsq#wgnjnSKct@y7#EU$BZ7P8zxdgu#q;#R z5IHD=4yOd9q`9oOEX>;fE+Fr2mUyZtNhLmjvcJroM~v!FiZ!7;`r7iV{wWKbgYQenE(3o-wB%V9CTK;%g*BoB`&I& zSdgaa>`KwVTPgXw+9D5*3)|b1jCa(C;TF3;aKSjeLE?|E|Mh{a z5c7=9zHhklU9IiN8jR}*5g77;OHBC%ee%@lZTT!EN9);-`Y1s5C*#3QmWwiT%h)>= z-#66Q1?3dR*xt+K_%W{hIG3a5M}XdVPc?Ef~Z!6f7rpm~jq1QNJtfsszD&cr=*M zEV2iv@qt%mRH#nzz{Qj!x1TM`N=Tjg+J?yH%M&$2wy)s<$ zRUpDUX%GB(oL#KmdR<4S%lFVr62^=du7^IFv0vY2e-`L}SJbet_IcBFa`1Jesm*1G z0OObnzLn?kX`9d)t`XhGiXpl>g^;aYpHb~*MYPAE2^zpZk|Ym5O5&M<6Vo(`@|59H z={>yAjO4MGGnh#f_L=3u8S|Pmq+Sf_j5Q;i9u+ z#>CpFp$|qew``wlyN1GG1WE^tAX-ZTzDu1>z;Je=OhAM&9G&oIg|& zu=$#X;6$+Dg%d{JrSb1HdS#tf~&o!D)yU#JMf#2H7 z1@HSvv~(dM&F{y=eeN)hM($tdb3rz%#&A-;TUr9{29fKv?>O*?@JGSmP*!x=7Qr}i z17qHy#$CgJ7afJj;MIw7`!Qt!@w=(Lhdb^e|5OEdFVJ}lfCVgvf35;PBr?}yVPU2C z`8#V)jBr%y8V6xx9IaOO;VIN`l>(494LDm!k}x-w0d84Y!NlK*Rif3AZlgUwERdIp zkfqMAwF}+El(tn&Ww%rmvE_a5X98YlA#sc=>Wolg7qX~Nv-r4<;^&Tdr$HSQfT}L5 zV@uyp`uRh_k##<_OO(mX^{MDyFoBeMlDv!3(yYVFKUM=Tr~N6s5oKok)hp**WbMzX zLqD8ucU)Z3{#-Gm$e{I_F=U|yf7Clg8*A}V(U$O!qAxVlRj@YnhAcy?jueZ_p<{=7 z(=#VwY`9vZ<}^PN7lM+_S7-X&z?+_jl8k`-h6We3M7P@BC}<3g%`eLBUkLk-u( z!9(L)`R#sp;NC zJBRHY^$BWZr`FTiuc3zkw0DZ{RG2$*g>FYOIeoFATfTgr;dLsxpg8R|1 zL;t&M>wq->waoBica=Jqkoaie*Uq|3xgsW#{F~JNSFFDQENMytsl#dptO&qvZ4blo zyd7s(g;yaD&_YhK05pX%`&Xf#lLI9cy7ENW-1%vDlg#A1I5{%1w^@}0CBZAW(VIB% z)R0f-&R5L7=h^6djdw1gt;DoH?@h?5TB|_LlcyENAvo&bV`vFELo#MG=B|_>1Fih3 zWByOhY*{}eDd~1nAhz7Gyx3| zD{(Uf*@1OG)cx}+M27VIr|91OWT=QQ0;^xcmA|xlrYQGmR11vfBE`dofs-WJL853Z zl5%3B%fm8#kh$xjw86uf#s=R?RDOJQT}i!_!)#S%k0GV~dJ}>f%!W=`UWaVkIPA;( zO_aNtR&u^kN2lpmmzE*0uUYF$0JlE;T4S1C;VU0e40?e7i}s{m}O0#NGQi{JYx zB}tPN;tT;&dQFX(a`6=_vd?jdh5LXgOC{-Tc_Nee22=Yp+b@&uE)18TP1Fz&8Wv@( zqR@9ZH`<7Ag#;bkF=mc`)wstnGq+@bcd~6;V84U^GiknD9c+8o^f{-I$^9#-xoDzJORX(Qtc93Bw4>d4L#nP zYq%V0hv0l*B875$hhF<405#{&(nVdX6JS#FwGn^;1+rR%n-W+!mi`HZ%G{4(JXrEp zzPryVVt4YCfE&+U6U2uzlZwwcTr;7Df27zNNSXNeGUctap?p;B2j1tCu-q&{a)! z(eat}#2jmmQQT(MOX{z0YrfNr6+G<}NthASV*_3s%JWz{jk_7)BKQJ`<#dG}0a3?qXu{3Jz}YJM zcMV9sH2`i%@6lR=sf9g*ATL_i4$*Lp8Zs6PO*kNP^MQ#BYrW)9(n_wP?XYi|r6!Kl zVs-D8-BdJUcU~mtViVv8C+ALkVX4j^HnY(FM^{MgU^oAVnp0A+$p{0o5;NjVGR7VK zOEs3Qh>{ZmR+1by!X_pc0|NK5jhuaQs3BvOGRK-anN${E`zWWR{PYbm5a%qDo~Ef* zL$0^ScT`^7Zhmz@Y|6C@lg*Us>9+ujaa~)V_!eaF9pJz3q-YK3(By5=R5tA_-dP*9 zd8tvvFRUsXb>wilPD~E}RS%X10qH(yBYUiL__FIc^ftVY;KfKQwp6k*aoNMZ;7V|B~{QhLY!`=D2t{tbl-)r$&PabI?xrNg|XAh+9%@?f-^?3f8{lQY;%iP-PhXfq>czD=(%_Oa$R|JkeGb#wkCb}Px z0|Hm}G}Uac0QaQ6|LP~ZxnxxMXg2*MhS1?^mH{A?B}D{Hzj!{KVO+b@7e0CyR!btsh1@EJ zu3&4_Ea^S|i+nO8xp6yu1WgR&4vHJE_os0DItHF}Gvc(E9>S{P^r9=$%CnUwoh6~r zFZcdX@(|pDhlA7?E}pYa&;1tfVKBn${7jo?VNd5`YwrPjxAa@2$*0}Q+!ZVt^Q9{v zg|7QA5a!#tL;bBQW*j8=cpk%71&(qtpOkDAO9x1aY#F{w(8=t+b(lh1(moypd`~iu zn+~}B)iSt1dzqi`{}GQQz($)|L}GfCgP)(G^r&KZTKVk2A`%XSct_A@)r;w92|j;d zSZG9|`$F^#5My?B*iv|Od#+w7IIO>Gbrr!*C;-ugXYd~E@YlnpaH+Tq6WK^g));ig z>7wx6!(6w^y z?x++_AWJ)q&HCrIlIsY`4pWPd>>u4Qc%U}+{>AJ0;MMeoqVtx9D4lZG?cDFlGpIT& zo_Bbl+RZD91`Xb`KA4i9O6)R_VFBV!H5WjK2#6t;k4lQ~Z(EqrFTrEqCIyZLf7?+v z$f_5ZPEz@H^o{(yHLOKw?2zesck805Q4^YWit|}YiWEpvM$T+wex0V;%y)vV=(j90 zhQZO$Xz9kJRllD^Bpf+)s7d7p@&%#`j4zKEQJDa>=ykiaq*rYh z@4f5Pj$By)RVm<-S))esQ%DNKI&7<{1NujF@bwkIo&C#I+;!CeHyxNkPThzn*@)M%N(!w)91iUr&Tu;Gnur-H)cBOm6D}` zVefE)xs7aEpIMvrKh+k`tlu?s4I#9=OdW!O$B#H(J>L=~w1Z&vI^pEogNoVsJUoBL zxCt*nbK0G+AMMVVT7m%IWas0gt*xX z`fWR>u~$@RmG9nfmG=MG8Xt^D4QKvkk@2Iky3zO=ac(x<8PfV=oit&748D&w47An4 zRI)QP+wj=+Lr=8h;=F^f%=x0SXaUYzjbLnw@+SfQ*S&_bP#5^T68@#diM@SPnaP({l;Wg5R?7NV z&Y=(Qnl(u+z_U&`{S`yzbJ1lVF}8|pjx6|2p6}_Scc(sq{s<+AV*Zb{Pf0cGO0!#B zoTe5(*W-JTy5mM?#er9*2T#c0#@AasJX7kk^s%lx_L&l(BB%URRHDDCAx8LIKuN_w zX`2YdZZ7W|7xA3h|JJJHe?b-LkhynOMQQIs_1bT#@~xJ4ac@yxK0(T;3%U~5wg8Oqci1e_BOfw^ewkGYdoMofvICPP8VlbLOL

F+vErkdsx(lK##;Q|E7z;AM4YyPk)CK3af$A4V2PfIxW*n0oDeB1?m6J0EHW z=W{4Jj6w@|l<0bq8g$P08ycWp+1X8I|7xE1!UG^zfj}(=z4s=^3sBCnm*a4;)d?Wn z;+mXe?)jIV6qu(dolj6p@_IS1<0xQi1fJPiDQ+4CV6npLm1YigJiGH4aq-H7sZj09 z?5=y4zK}Abngh->HW7P=z8T;~>ZGT&2tAclYVrQVqW3|Ov$rOq1E6d*le&fc@8vM_InXLTDn_qJLY2&6;5k8-)XGT!E+0F_j=e`IX7Us(_WcXnX ztW2dFe=9HXA^9^P`+T}9P9)66hwOMUqeb%LVLF0uB)*{Bi*N4fP0bO8(xU?eXzvOA zY|=@XcWpQUYX#XXWFkwZ$B*xb-omHc0NF4uMRcfyy#C7xRJEARv;WYD^ZvHA8-R!T zlpI~ew^|EZ>R`xfq_IG%5YsZmkC_aC_9wTMmD`!iW%9w)oulZF2^<*Af)FUeGHIxv zLB8;0LwoOh*1WVgAOK)-j=KfM!tHoCIexM9Tqlc{Tkb=TD7d*rE~zCQtafW_P7AB! zq>bRwUW1Ajw77z-K~|`1p8B^QKh}F`=UOea5>z!^oUSQ>D4m0HJTKRUNtUIL{*pPw?scA9-g>y=K$7q$c9wWC;@HqWw-ZtESo~aLX8t>-8Xt6 z3K3uy0?`lq{`g7A!0{%3AHGm4Va1B6#lN0~h|MK*ofRQYx=>2Lp!{FUoa_5HlKV|T zfJs}g&qDG@70vk5sUDNH7?oABY45+x3+fv(v&Ramnn0Z(EwD_k=o_TcaV0s!{H{$w z;LNvOXnv&5dQRsjcByo~nrQ_A3pEonC1`T<=hlUuKj}Z7VihD~E_Si(3yWLqnANBe=#zV*x zV9{I8AnyLn?Os2ncLMeo4~x#E1h^rbo4EEZ1Wnym$d8;6-Vlsgs58c+fg%#GgV#T)L)%TF=dqU#eO|u z06xz3Xzq5#c!l~Kz^u9#-^n%9jmkO~(0`cuGS3V>B$PxvkI;>sE&VmUv51gg)vIa- zZT_>1ohE3?f|@LEW)VThppYn;l@nb!bp66}xA!Q}d8v*7FcbjGDfO9dnz6;y$Kh`w z{*@C3Ak*~gY1G%LGoeW?muLQSO<^($d!7R4!D4P2162IQcsu8Tqtu&&V2kWFhujmufm+M%y-aHY9%ZR4`Qd)S3?)4Cz&lmAWtq4D!ltdhxwB zDN`GieSk;bTxU7Ng|yTGGxvGwA5;b810|VVAEK~>PJic>hQ-{Rn|FxB7jY-e zMuk>XZRXyi=`lmh5SHA(Xm+i~O+30-u5kS@VCK@!=3?Sd5v~AWvn|9F_#*eNL$(f3 zq@T_JIbwZojj&!3njxseb6=N_v73FL(?hewCq%cQBf}B@UQ(2 z@w0i_Eb|i?$=BW5OajkyL7blvn?8ngX7igFH{RVyog+3*t2TSDX&IfV@{-Gi>jC)W zr%QtB;8&)iJMh0S@!G>E2k`%Mk;;{kg)yi6L>exU;AQQ<-1vow(ZejK>|WKa$MmJ9 zcS-P|4dvuHKb5`ddr=Jr51Tslj-#i#SdSo8B<4`UN|*(zfiJoqOwWW@ak4m z$}+CHk!?IHR-#KbiSZAC2HAIOALnzD6}o~;7^!0_)`j-Vin{boU&uyDfQbb10bqQB zcoql{~<{}AH+YkBU-x1*>e8-lNt|aFVD^AF9iXZZDIQf7?&bG z3x2TnA1hy)0I~;gzJri;oA2Eg9gBUR7cRJtuqSr6!cE9?I^6i2{hgVB*$JQ_^CYBj zf)emk;ZeuTPMp_9@MF#(Gg4u|TEU;v3L?zi_E8AAx>fkw=0!SZo+)=+AOh`_7XPfZ zHqQfgI{9`MEAp14-;6XDQA#O)NJ@#E3O8E3QCPOQ<2`4G+e6xfFjfbUhR%!olWHG* zKi1avyph0^xBYiNc6tdn)GVQ~3Y8_*l!xhK?;JeT(Uu~UulB3$S{|!XgAm*rJm^pE z{n_Rdk?&PALJu%&h1L`Zc|hGV$wol{ZJWg<41+cbz1Fm+j{GOBOo;IuHUNC`Q`khk z4{Z9+Ttx&xu4(o1{&%`X62ao9Uy?QC*5^of8Yszw0pJM>fNntlRa8pB5yplVay{@T zbD0Ey7DuP6q6BXUr8I3aiWfc3hYj5jjz3WPg1Q%>K-Y{tdnUvwdDXu z$hav&tPu`Q+<3DTee#nDu9Sz5P(EVnk*O*;I zTuFU_VGzXKRm0e#9Tp9vc?5ZJEI<^Dt^Mh~(H7_cTEkq_(wc5JHskIcLrtpvn!#VK+~O8nqnvD(9WRj-sGO$1-hW)~-) z1JR9_o@b5|se=Lb&|C#DbsNGC5b*g3NYv0@WyA=;@v0X~1NsnMmP!>kSqkjQ>4E=u zt03xv69U*Vd+%kQf3p~OXXAnSAka+Kg-w}|V+L1M4L z9u8T7ZT)me{G)k`Xw2m|mbQ=(d*Wg{%okWE5p|Va5hd_0o{b9*#L~(w0~Wbnc>(!e5ck|w_`<{r1Uq& zh||&_v$D2xT2w=urDw@~4aaK`?eMy@P$$iXiPRC8byA&b7!b{zM9FGBh{hdxLwYf! ze&`lykp@wBZ`K1(IM`ti95BGeC|K}E1ExP7n}pLK>M4L8%6Tpzg5@FC*(QIMGTLgs z@}L%T_f*qvR2-oc`HieSrXt|X`n%qr`mJ522HmR8&b4(kR)CL9LETg1>l6VX!`_C# zB&_gW^6c|K4KN;K)gswPE0QurDF%2z)hsiwCF>Or06>l2kKzNpQvx|XX23Yxo_J6? znaj^^U8k#ie$Q6f0BLa<5PbN|4kk*s5v|}Z;EXAVle1Da>Jro;LL(CmwL7J__b-`e zh6KRS!;$*xg z58!F+Fh{uk3@qCBvU|*gwkz$ZF*pD>+{zrbK3_nwk9Wm zRWE{$1wUn{Vyj#f7UzZ-k*#0&j8PKY++Z{Sfl{=b>ZYHI3fReZnfnK@6e6nc*s)O29}|CY_QQECwbe86SmL z$g8A9>BRseF)TZj{T=@vWK`QFei6OKl?mll7;@rNYQP-3WnA09qx8EAH(71o0R0QH z5L5mS$bC?ZUo_k}pq@2;Oar`0OD${wd2xzq3Ha|tj6lV~+MM@HyYGDDfiGkVaMC#N zk`6Hb5Jcz1pb~X>c%D-qVG|IgRa2Ct>IVK zt&eOT`Rk;ijfz2zLsD2a_GW-c{tU>z$4Edz>JxG{D4ypRU2i6DirdNkQlLve@to`C z>fU)&WA_9GTw*9N3In`J*WBEc-3J&h zkYB&@s*5d{8@Z6}ad>~}|CoBquq?N(YxttO!;9_)=@x0EJ48gfTNIEk>2B!|L_oSb zq+2?qkuK@}7JKjedB5ZE2S41wI@g*p<``pM(W1?;(+A8lf$=&5GqSj<5%Pf~q3)Y> z7~@g>JX#bWtjnmhwy2|-Hz8HDQOMxlT?inmq!r7<2YimNKX;MNMQSzcD*!Kj@g+i~ zY<3|&(Fvl3a@+}xwAlivF6t$F>uuAL3}=2kPRt382IKGU+_x;0t>w6~tYVU;yIos| zR<8lWw!BI~NDHe}>#zhq7*JNCH1NGcOqY1R)Fv%lI z;y&E-OeSt7PBa4~ciT!~m%%)5-QV{t%!T$~FgYQ%vIagO%L0ek-TzAzd`JZlr!TlfW84~QalN9Wqd?Q4$Wk$;f$I*k(8X+$8d_x z$W|B!7VdGtaq%L`VK%GGtu%^9Yy3X+rKV-TS>D-#L!0nPz@qkrFk++{bN9CSMjwt( zr!gm4ngaq>QB;}JwcLztA{-3~Q#-v*rrtn|;;jF`_2~t7$Jk`@7#lY0>zN=B*jffA zFl$w`YgPi=N_(>mSjClWvdeP)7z&N%f7TD1RI#PydU=9h%v(t-e6-RfdGG2^scJJT z4kNQKj^EP4$zd6*V(YiVy zywx(f)x^}fQKQX**b3CZd7du>iP{x?0F98p7_yibv5Z*?=ks1J%cBZIJCY=Vj}jA5 zco@f9&7m*Qw*4U@xg$WaL7Xm06lPUq|4Ey<-9ZWa~JPa}uejH@;@{}v<<$Kei3rh+R4eJenOgl0ekiX33si^`X z-mcJRBgz1ayv;%=vO``sU(Q*|XkJN)2C!VA*Y)5C%5{NGIh zvz&^95!DDW>M!YmkO{Q?+XR$1Q~SMOX!3yz#tfZPTX3bkuNzFam$+m0>O>f>kRe+6 zs?~m@Qy4SE4rR}aM%z|mhs(UmbFZ1T%;@C+2F|mwr3+MA@Y`QI8niADd7AH(M3~d= z$K+sn5CvG{l8B2R$FlLlbG=CGC1*;;D|l!+>NiTh$Yqshs^qew&Z-@Buq^YmlaMx- z!S_IGH5-qI?%qt+y;}R*LbRf+0}XZ2-$LV$YH-)c zRK02J3awll6d$ve)!1HzJ4fx8@hzVjnF+1lQ``{-+}$ z?Y-yvUotLVFe8^PwdWejycdo)W=Q7QFM9zyMz_CR^H#4~2! zM)S9>m-oSyeIIrrb&c_AY&&Xpn4*H9>qMr@*zPo>I@1nVe z6$%eLj-9SufO8yjvD)sXOKPKpo4q*OnMfiP6k3TFnfQ4pX>{NG3%l{!KXHcy)(t!1 zpP`?)OJ#qxvBykoC6tMbF$^AfT~da^Jr)5!X%mglByr-f2my@Pv;rTdzJ$^P8dE<8 zTdpjRgo{oU9sI3kW&_{^FEKZ!_QYh^mXIbI5xt)?d?wns8CKWoaCZy7+oHPq(J+BD zHPAoSsUScd7p?{C5ANOqt^m@3i0JF32>p-mAn4REcfYCLIw}q{eN$F=jeD@(fx(9N z-tLia`zOFP(jsvm?&S#Ncbfw$y%4ioMSPcRC(0$9E`~M`Y8*zck3r`QczNC+{5+(# z6`TWe6-&({k?1uYr&Ug-lo*?*Tg2SG_9Me`XFkK}2+Mk2$-=CqF#dA^5e=E-drs&- zp=WV5=)WO5Ht3WzT(v#^=4Z|ks?nwh_Ee~};PWR4Rn$x(fDv#33@C41-$!`sRrmH` zh(s7sNMt@LOu1zBN5JsKZ->?NOBOM##Aj*hx8+Tr_Jtkje}fy_F@uTV`rwKflV#px z(nb;rY6fY4ua&t4Q3fDa^N_=9Y(~Agi8Xt@3pld(mLHO8gy(w$NuGE~4fnOD?;qI| zzNV=o>QWcloU8*23P*P&8Y(9Bj_hPcT;P@+>2_0<+5p60c)9E#6yHQmZkHES(23A8A>t$YzCVw1V zK9!lHdAw=a$W>7EcW|guq%KzV))R9u&{{Jw$#x? z;|rR^=x}pE#meU@4MJcy^yAer>p$Yt^?Is+|9Nm~)xhJv)SGZG&9TU@rvz6?HzwJb z^tcuz&SObA{xfr;1ejb#N}3MU58xb&o@yO;&~sJzVe`gky5%#%u0d!{BQrW$;Jy*l zaBAy&$wzoQ6625?w#NJceD%K`_f%{$3@DWFj*VS_mJUYEuU5Y7^%^dn{e(Mdb=yos z1jcf-YGShaeS_7SnJ)w%PA3Jr9$uBycl|0Sv@HEd?Gv1eo z1n?`JChFP1X;7YgXU_s$5Y)!(;#IheZ*s zjDK4PM>mQF-Z2mct~exbQ1RLy-}oF_jR&~^_E5GOq8~&&+JAXS&WoRWy!{!EkJOF7?3XayUHPpF(sM#Sv?y!1AyS5wus{^`%Wj)3SEZ#cpV~t$5D{6*x z%a4PnJ(@%Y5-cfz1AaZlg61Jg((#@FzAEq@Eia+!S{+t^tkz`VdV#=C()MjS`$c6$Uu#;%6o^t}5)+ z?8+(}e_2)S+dzc8w-}Yb88S~2;z5O)!Yly1^Zl!55(5vz!+W$az!E^+LFrks9x2piYehvI<4|dwZiA%>Ajp=Z*(PQABE;7vTTW|@I z?2ZE2v!wj6MJvu*w{_@A{o?o~nwyh^MP07Y85Aklo)x;7DW=`;c(o zqq?*Kmmiy%^pwpk8LQGZ#H^~3X0S5srIDF=N*#F6Wj}1kCh{DsPr+6Em=73Evi1AI`Q)*HdTD@{0#hRd0Y^4I1%ScdkfxQqL8=U;P_JH{`1Tr+4a*lFSb^Podc+p zke*OHMG}GlwH>(PrQfTl>j9g?9K7R*Cnm-e@SB#Z=hq{zBXQ)}_o>%kMYD^z6#J?i(gmkiqb_D|XhsV1oV4|qsbM92 zQ?*6sGjiZ=T1TH3`W118z`~gMD${mUMJsw*ct-u8c}i;J1slTizy?uAFH+rC9kEL7 zXP8|EW6^sPu{~1n4p3NLt$)#d!o2HG&RAy^aRD+(?K|;p7Kq#6^bWc}{R7deyNQ19 zp2&kLgY2s++XY4yB&u^B@R(rDS$l&75q5kJdslLY3 zjFiVlfkFy6X?uxd2xr<@Wf8L*SOS$V4>Pk-^P#cEi@bb;Yd{)$V{%cSay&F1l~`0O z%=)zmoubtCNfSoiCbWIDgJykY?~EjYia;f%I_|iiaFv)VOPuHRqJDJ~%fhrZhOn$m zt-6mIK{bdXtZ95x4e`EZ&6Z112q%Jz0|HB>iQiAP{451f`Fp`s`fZ^#Pb`qaQjR<~ z>5)Z>aIaWiaJ<$6yC2}NJqm!O3M&d5gL2d@?fm*b4SCf11;&4Yly8b8ZtP=#na4U0?S~~m@Hc$j^;P2b0&tUko*g*7mz)8nBmRSBrlBo0 zj!XevtR00%%LiEnoPdUi;)i|4H;FIaDJWME2kb5|y%RPe&}6$jz{=+W1c2>(Kr38p zts6M$eN0&Sg1`&Dd)FpOv*C8|=2ymYrEWw#jpr|RLC`k(Vk09ZdU z>}ICc6^YnH9svrsufTKgcA^roI-^|TOIM>84&V8)ACo=Gbo$!Yp6#rmGAhHc)21lUyi*(i^=MMB;< z%%>_79^WTnE}psz0s~WGU<-`EoaQyQ{XkdCiRf9Mi%>+klT)M~w5X|J@;b*RIx7J? z>Y`#LC@Y?x!82oJtOiWw)EKhelF`xzGGbr02KcH6Apv9bwI5_awk&}x5f(JAJI(e@ zQK2a6;tJ3!UcQ-AeEaes&@kl)~z5li7VnDoLqg4Dj8E36h`;H#u!71AHpZzDYkz})Br_yOc2 zDr2x=4P?92OpLWD_&L4BpU%i`p-AMDavL!XGCUYI)BKKT*3@V-D6_-|7BSnA`If{c zfS_@^T17Dr3mDO2v_faA!t6u0ZIf>Id~%e`5E*QgzFQJ)j+UO^u9f;tSGa%1MP6 zQO13aB|b3Z@I~~6Byet<=Is3JcM8uFk@@F{1nigP#+Se~1PHu5k9>bxc$%`0x6$w6 zq|6c_X_G#AzO`Dk_eiyDk*lD%W_0-5MH!xrP8m3E(%b6|5XO44adH;^YTgg<(M8r5 zzycO#DH}NW(rH>C4slox+?gKkT#Au|v(c0Yh+a2J3^MazvZcb{l(%ci-4}EXC=+&*9yPM%ZQBo z6?!9`3>`orJo8fall9pZ#9NznjaHrkbUUPZzzaf77HK_@(lVij!B%Hd&P;+7I~h*s zfBYft+0u&fi(EtsMSOb}A3?1>??5wli& zk2rCAq#`C;i)Q(_ZerB}!hwJt0Y=?;yZ9{DROW0d6YUDXgJASmmfp8gqqVZwi>)ByA zG=CTO&e=Dce#(UZ@TIS#$?=}NDEj{G`3@-lLs7in80;#}YacXNcVCqD%d{X5K;dB( z2kTbB?h2&pAH3blo;Q*#jV;Wyv0`dW@8crvzMS-oYDP}Wc$6%TUHrMkV5s>J+}mfY zg3bNa$To@~H0lB2$yoFu%>1lJOe=ELe~u~Z$HL}cz+bwxep?&)!_7E|9@R95KYOum zdv)j4(kG)OFY|!cd4;h(-{|8bww_HJt@d2NI4pzqVk)S%^?hU5z>}8#s7}-U?KrtG ze{%*mi`v7Hp_$MsdAD#QKtr}7(b<;v7o#%Gdg1TRFF7edY9XE9fc*(3a0j|jP=GEJU zR(`q-0Z7__NY$ROzg49awmRec$`VFJ?trs(9t;+IgA%LH6M1L%%HxGcAQdfx4KLo0 zxy-@7EGmjR2K82NfwlGq8q?W#z;9}a*&b^E)f6sDW0T~pnn*dTP$ZWvtFyS8tIr2X zR4u?2uiFmncRB>;L$XvtuREyBm86TI9s+;|Tu>iND(yYg9O+kAkb#IKYhZ){fP-lZ zhO~k6%69IwhAcC_kjX+k_oSpdtYFb>Ay1gZQAzZ;2scUdkKv=tq4#ZAWXh$2g8Hv( z@;vCNf7FXJbtT}qypF_0d@t1uL$F}|!q9kQ@+&&Wc3=>|qVM?TP5wj5FR*;BR-V$2 zx7*%rk8@Ur!Ksdxi41@qn86SP@$Ta1ho>bbmU@7k8LC9^92u4p*>@suWin5LFvCS^ zZ4bdJ$*{V20K+bAP+v|dqvPaVThTLQamErO&rAXu?i(FHjuQ3ewq^tgm7fVPAyqq# zCGefw^C!$Jx~;CM({dL*;381C%P35v z;3xY9QVno0NffS*9IU;O`I;inbKsMg9Vk|4ixM^ab_Wa?1Ed(x=#|WZE#UFRBBUAY zzMn-LeV4*Yu)^m(qop_|i%!MDk7oq41Ri{l7Vz>OcL+p$;$r zygqxiRP0s_oOpM?%4Sja_{M*uU-{c$bw5zLcMh1v&21$pt=Wijl*laT;AmCeG_Pv; z83OQc0K*Gyx-LU+hA;)V5TZjg7y&{osa$!YV^FLX#Fj|T%Dx*o8?V&~?E(&vY^-+2 zAIU@ojb_c57-r8iV~PG8(C2OEMTq00ylIrMbUhbc8iba6dblpPF_}EIznc?NY`4oP zvFkUhS4<~+fYtQ3oOoyXyDC_9N0I*0EUUJzbu!fOHJmtYWqT(+r?yqTIK#0oP*9c5S9w0w1vZ-N*X9+~zV+ zuVn)j$l{px1Tn{R_TAK(Kd206=B&{JRYu08823zxTWHp9hvCGGA1=>o*t5SU56gL- zUdcIiF{6D@`NWh|12_iSS|%|F{(KhD3^-)}T9?nN_dzdmt^A(+#@(x_xuKKyv!Ux|7#R2~-uRjM!HNMC zr~?~;%C`p!xHncHfq?4oe+lIOPOcLT&Bn)dt2kdJk^iP=APyo&>F5&7VfU46bdiG? z@4dH3;bbwej1X;m?a!8Ymg=GQlaTEUjD?*Mjf_zGTs zUz~4@L~N>cj}zXl4&eyNBwz}BME>41Ap>hf+<3c&^N0I)b+c)R)j_<9JFX?TRk|r`r7t-La2W#Ttk5Sz zhVa3%+@fx*Gge4mtfsk&c5Vgr|H~m1|24hjz*Bzz>NYr$U*yiaJHRaR!BZEP5>?FA z6`6>Me(~cfvf^;vrH4o2u=nE4ujjy8y^0;Oi(zT|HuH!1VZzm`NcRfHd6Pdu!O=Q3 zi*M)lMg2KtApX7v-O|qLP8)?O23|jkI9XYCJHdrF`W3#N@hT(1LQmx7LgfqLxfdk? zpNfJ^qYdKWVX~Q}mBVm|Q0@oMFpKe}6YY^(T&E(8j5F0;ZTsmEqnbvL}C>oR&cXC3=fiv4iZf(oA~%OoI0U)n^`n7i^Y>9$^u`Dd!;`o~gs z>a=jfh-Ogd2ku{MXZP+R`R()S46-WBsAlaEu@~pS;D~PCWF3hRt;iAamh`!L;zUW623J*4wuFsx0 zAqUaay^zU}mEZIF#QVd~7QJw^yb1}^v_ z(JEM=*9V90@6y;+Xpbot2d|3yIx@G7a(GB#^~vLbv=;*p&LQbv67A3*)a3fAX^&}O zlUu4=UVGp+kYXAGWShtJT>{3o=$Xwf_~ua$=MjzXfG2JJX`((*my?vxqrk_4@gCPf zlJoma(pYQnQ&7OaknKFE^H^fca9h^fylnKej-$o3M9(JfqEH_F8TfXutaa%bSQwV; zUcz!1)Kvgy=F5mZ3e=EoLPqL$1D4T8Vl;tbd5T{}KEfk}W)}(i0wHIdiMJs30Ca4U zNXpp*+oc#Cl8xR`p*w9HuC|foaF{*8SgaH})ztJNOdr=T=z@}&_#T>gGT83|R-FFK zC`-z1;6?`PRY8A)yz)NC=`ei~K_=rhFllm z=)U6Q?lv9IN^KM@cTvgC=XR6OUcMWD?@n3rMadoJ0bAN%KNz^4W><)W)O7y_je!B- zp`+IHO1!=|uL0$Dv3}OZ7!}JnvXO6>y(<$y0Klda4%BTks@Ew-rIG&!wfyJ#xM*|` zrQ@P>W&3fkIr$my;^HnkL+Ux~hg`s(lTag4enE}%w4Z?HmEcXw@W=e;FD{Je{ydJM zHqqfi)qubzd(rXDw8qTn;LWQDtv@ih_HAsh7gDc!)_QJJg(UHy5I+dH1=NBx!yll( zpXVqa*7lf8uDlhHGQSwWRp}lMMsaQj_5e@MOi$r?xEIJ=xDlDBBjx%G zC;$S;ZtlOVdh{6Ztwdx$^k{(>OZF6K_jpS3s9-+vP%xlFp_fgU~frH8HUG!XmtdRI1{ zClrhrf(1yOh0m~&H5i$@wHWfB_^@t&<9Azb{4p)0waE1;OCs^ysWZ{r`#zxY2pz+% zpnZ4zh-4JbDW*mgA;ihSIn&DWf9VGi>EHAdoX;ToV?^o0HoaGK@vcNtm;CvE4hwW|Z)&#me$Ne^yyg zAFVmVn&F?M-q>}dPxe(uG7m4!VB5(mAXZ=PIE8t`C!_`Hr$_KdXXXnv`fOKKdAx5*La=4JH^$3w5#-IG~H@L;)LL490fUI)!3M z&wka%$-Z{B=&Nq%Bq&Qpz<@BqS-A#90xfWbd4TLo-QVil7?u@E`Z@b97M7E2qtBlC zLg@35Jyb$Hz$V^)%C&Ue{`!+@)~~%JD`?~|Z5;TLn@j`Vk&55kIKc@r(aXXq!fEja zfdbqx*1INw6Y$k~fjr}1)C6FC^#9hm!X+;roV4u0?>fm){HFAihunlNyzelrIHhkc zCwvz%Q0Sa2;7uGSJ3CW_-lr*^An-l`yegjRpVvUy!$$^%NSguopU$lzdGFOPBt3VV zUr2Jj;Okdc;-}d9i^H3aJa?;7)7X0Yu1Th$iikLu@6>$1U)LJ^mT6*%uxKmnu4E%C zUpNDZEMv?HAm&$+jP|+jf8Wa$83@>_2f8Rxg9&$gvntVOF6@446R=(&jpgl=ue*i8 zGi{~;Vo&VLln-o*{5oKtQ0TIWvzpW7c1qE;XtkylY6eOGG6%RrVpFp!-dVh^!N-5r zdRnE$AgVF;OD}kr9~LLtDDE4(s80=F@)s67o8@e2k9v}EuMQ9fX&<)FN7xIOt@r;^Y^o7!hy^DM~}pM7aaiu!q1MQ zF;aCZkvQ-_!LnQ*k9>S=zJ&aFTi87t z!Ha~5fofT>g{E(go88Sch{#yncjS zy-`(1gk9+YJ50wpna1SW-aa1#`!=82@e_R-R&yc$}wb zCBNP8d|ta*I^&~80c_~;Uj!2Fol9C6fFeStCro4JI2>yen#<|_n2+%2x-{OO)jHBv zQx9he{P3RE)nk}F2ir^hK)Vl27#u%oxxq36of$CaqAUd4$y?Xqad*}gnc%44!-UF1 z3f~a|^(hIE^mG5o{^omO2$Av=OOiDZONL;>|Eg2%u#eV!pB>?+4uC|>NU%aPhTK6) z#-Cg#E8TB-XimTKo+Hc$7V>bBhV#qk&y4AXw!RSrklo=9k%+Zv=stVU^u@`7s7uwP ziwTSX|C{rzto$?QD>aacEgWA8_Pe=7N_4^?>$n0_P^&bSMIF&Am+OjL=uVy~ue{-t zh$MrNlD|8!%7T6s@G0)BDZ1YoB^rCwAdPyfh0nB=26t0;*ybyeeS<;T(eisjAmnZ*E$@N4Ntn0>95X6g3@KMB00M13%uJsu{?<-aSCROyMbdCC0Hqn?{MwfjWPPnpesOL56=?M^*T_^UbUOL!B|m z|BavC1o?`V+sI#E{`HpL1K9kFJnkRCrk|QIbwXa8$VGNhqSeM1^lXiS$kmgoKeC>6 zUud1M#N1^*?nlYhFsX5a2S{0pBUS4oXwIB;%S%U>yB{7!Jub=KnZ@42+zC50wS2vl zx6FBlqqg7TI#X(M)O1l>T-vld-(+*t;wr6%52NPp8wmf)qot+A%-d&?)?ZWs)(>sf zGm|0OkGe7)Qkrx zDIwE4dJV(zd-`w9*X`2zm$dFBpuCFJ*CLG_ z;|DW*y1m-8RP^Dj;({`PkYWAUMjYMRi;t0hwlF7=Sblv4w<+i&1ToT4=zMd@!#^P`wTpRAFgltYJIFV}tW6zrnqPBC+8LLq+d zC<_}PhqF#%c~dE_`=Xo$6}^&CED0*JHP1mm8Wk(ZN6JA*WPh8Lb>71LdIld~uQ4wV z!LQ#d+6gnFzs62I)0>hfgC>^<8`>@ytcwGShng|nyk702 zM4?25)|hLnSk@kovNgw>EAd<%!$;EySe2a$y<2&APQJQp^GPBZ`Bo(Brg8tDijoe`i!_w_MjgW)G7lw4DvhU3$ zG>gYVH_^3eaa$@x4wr*@MyT*;&gVU9&&Dj3+`=nc1Ac)xTU?pVIinaP(D4q5Sieq5}N0!Pk1g zhBJh|EwM#a*1J_cuYPRpFOzj;5!YG|4^Z<`QxVG$Jq<%B#)#^B8LwWg*1+dw9XbKF z3G$k5Iww0EqfW6=RWz_L-&K#$ct1D?pB+`n2)e`W_8CfLtyT|syu1=WINQt8OEyx2 zm!%G1xlYEl@}lcC4F!HXoXj(REYWN~bDGfa7FB+)AP4d`KiHuidN&c*92g1w_{DzU z3{_6s5OlQOC3$>N1J;$H7qgFx3RkYXf3nZ}>!qurPV3uQEdhb}Lgb{xH47f|8+kt* zxSIVYav3aOsmH7ejKA#fY}tyupSaM>FtN*^aBZuBQJDF(;xfP?kZm2*I%qjlHsCR2w>esLvQ<`5!KqFzqB@a8*_XHL<{K%sSY`tgyO!tz6HgUv6- zXY51ejw62l=q&7g9L`z`9}@jJDT%pfbN`Z0*JW2Ujqa}l5JY96i=>8Dohz_&cM+cjT?ke2_a~vc^rS4C`8^(W9zQRN=tdORT zoOtPCJ;ge-nGao7@wafJ-wf3tHXP zXPgAwg^|kA7vL_0-zq8pP&~V;Lz2VPkj2%FaK`jQ3F#4#s907BJ4NJ|yV`&VK~xDD z+OBg5Q zg^@wvV#J>MtUBa)meD&5RZVpWZb!@-?w@7%_#&{SYDyKCWpAZ)2L1OHjpaNAy_jL@ z@+<0MMh<69-XWV^*rp#p(1!N)-7p-Z3cKlupD@8 z@YwXTL%BA8mY;D!zw0)8M=$tM)9V8 z{nml?UGoT>Z-?1q{vP5MHZ&Xr*Mkf+%;7d8HE9)-T%YHrz1>im`jTIQ4x<`{5(45P?33BzepP2w`4V_ST!C2F3-> zd8og?R@rmk2a!yz$b4UjYS007O$W!a?=Nl|Y_jO<#XRz!z+9hrtwp zuBg(&oFA-OVUWc#LCPKNuqt_3>z%RSatmmJ{DsjOK>6nLmt|<(Mu5^KSI8-o2JD zTX<)mhO0?S)kqiqong6wdc2Er154T%F|~;X8vzkhj1b`m&++QkkVW^$YDDIZhIVqcW`rA(az4zE84@M3i>jbAV>G zeO44Bh4^~~(vCiY)lJ>Ar{cPktbSJ&x{9XZyBw&o~!;bgNdJSa`c^hWP1;Ov{wtEexK zyby~Tgu}21Yu7#tDp_tvP!`FcXLG6pGtdzg<=#KlzmqI})5GlxN3;Ntd*p zg)+zK*-+h8B5RvG>a&}EKJ|A*BIWml4-^5;Z%>DWnlF^NLG$7deQZGw{Fp#E%W|2S^4>y`d&&K87zzrSyKOXI zUfj|nUKp|75;B!u`%1b~l+ttjw&!?r6znU$lpI|p$iGAPPhHJKG=!VS$5;C13r8{4 z3=_1JkmsayBUM6wMsP|vkm(^3vIjR2P}Ja+WWxSQ=of;jcyCyO8o^4mX@A zA3jt`VqjV#R&xJfl&v!~Eyc*c=1cgqz{%W;Sf>v}(Ve*=0Rva?5GC$oeO;`~`$`XI->xLhDDrgukP7fBcRpq|x*WGuyA$M9O!9>yVsh=Esv-(uhqm9~%rd1il9 zx;#)_XMMajjvl1ebLujXpU1uDrh;pSY7WQfc^EfrV)&(0s5NY|QH3hn9E9dSG>>qP ze?{i(S}FOBr@&Nvk_>78Yi;nIy>M>SD|=`_P@RUe3pZl-LRPWvb6!w83^IBf{2Wn0 zk#it5u_0ulx6x_DuVL24n2Rf3QMPgrZui+1>7)BcktKt%pxs(*fme_8@G2JYNJp91 z_f*`!>`QIX9`CO5*Qw#GKQPcJC_aOF%WZB*dW=A+7W})IPxmr^9G|th5oPa^zHwO5 zh$T`_M~zql3w3|TFcbTm;LdG@1+}~RyslzYf03wQC`MV*upq+eA;Az&t7u{Y)>2_) z;MiKCiYFn2M07m+RbI*o32;^<+3A$?Ft@vok0p~o`Xm3a*Beys<-WxLs#9blnSbh_ z4J;?j6ap9!VOCGG=2y!Hv0vXQR(y;U=lLj8UO69a(PsH`s6tM_(Hhl-MXA$X78Vj{ zf|$!m7MtQHCKaBXd>^@G6wy(F%rPkOI1sQvi1mP8TXIl_&`IoFdS*Q5PLZT@tNNSN zpZ{yl4~8&9sc58^(lGBG#CVH{L#{OO@n?mf3sOIZ69C;qhW7XU(7~P=hMO&ML}gs4 zP)kKbaVE1*hcRw$x`RwuyMrP6+o^ioh;8L*5)O@zrGdGP7!ZlrE1wx&`1QwkhWFws z-}zZIrUW{RFnO&Zjed7;Nianzk&skWy0+hv{GDJ8aQ{8Zve)Bvq-i3T|Lmb0Q!T{8 zw@Bz!IYU@g6sz0Gq*vu*ODSjl>I2#~`q;9@JBmKgeYif#V1$Y%G1bKHyDjOB4cNKl zKOUjCC46*UFjai+(iyVrD-F99aouUX>d*UI!-XQb*;DVbCWkxy!;mB)J-8BxmE{ix;5(e1a9RV*uxept<^?0>sH zWU39Uf71xXS~_?jUe73EeeSO$dS{WA${LV;O?kt?U(dCE0d1^(=}V{eviVYyMV%Bi ztdbS96QL;5m=S%I)F6tsS5Mt89ERq6XYsE&7cVKg$N^6mywu+>3G^SJjrYvCMKE$9 zNM99OwpfaYgGGzriu{Py;|ElJ^KV6N?zK2OYp{KM6tS>fPY!($j{yYZ5UaP(9grjV zf&?<6{p{XfO!jQrB2c}H`Ej(bth9B)$~x>@N(8n`suvJ&_tG2Hsq+^^f1nngi@5v1 z&9xYCOQx&8*IQ-4XZ)~BUh?BIfODE+=<-U_v>*kJU!P}fY2Cs?M1;9_I=!5t2QxQ^ zI}SID2vaTP^FFAzVx$(p@UZ6u}N_ZLkt_Dv_AdqrAnF_rx21>eoWuj+GGad!2t)!U-az-n((UTJd z&p?xtde>zSTZ7{&m1T;Ll2V$tr_gHxl@e(?4`^k*8Od%f;s}hcai0<|%@kAD%E^gY zeo9QNY0xmOp;Rq~ZvVie@J#YQnF^bW10S9)5c_YiyMn9C=`Yr-eJ**Q+nu&ZgS(E- zi_@2H$10!U!OyZ9`%sQk{3@R>qb?vWFTvrkuwwZ27B!BPD{db*jtmt9nm##R8unpy zIebGk_=w>;@rlP~_FM?~-{oRfXn%3l&d_IAnz~8Gu4fuc=qS^_t+-GsJhY zXIQ?rI6Y&JH>C3Ea7FfKNKk>T5Np!((<@HTMwo5VF@ZR4);`y?m@Io4D?hUMFtR>5 zP8#kxKvCv?TidZ5^`r1&HS*Js*Kd~s2zXxx=7CxfA`USoe#MC0h0|o=T}E=XJj8hz z{c3X-7Ue;0ADdQ=Bc)vc`|(SvsZluhIEoy+uBp%K0YUEmK(B8FYZKiE94xRr0pXxm zn{R5Q+ju@w>0WDQpksf0u#2@f9m%p8o(pl1RbeT^62Rm6Y|5gmx!N(2#cL>CgQcY; z9+)R26)TPlA3_~4+-$Y!9^h>G=7kVrC_1bO2RbN3;84-M8%pr@itgLB>z_eU{o7Zn z!^%^CK2R3^rUt4d%5Zc!Od`JcK+WWcicc;PERKfS-_iKE**5?C(%2ui6hUiA39q$v zfp{gVR7p%0aa7xh=-zAYWqp3RuQNf&=Le%rN6t~s4Eq7I`ctmuZkQOq0D7ck z4D_uwk$qF3X)wCDAt=Lj`{|)QSr)sTJ=kH^$M8G=j-Va}Ulq;jIEZJv2u9o#+dUvd z{m7VD@>KR<%{;6l6rq^ECyabOH zf2)1u>W)pJxY^CYh=j0o=c&+=(xQ1M^9IMz5i|Og^t+@fpYw{(k7=qKo(F*?RSEwQ|yt??{3Z3kIv6797qccrI?L`M$u)W#QUUoCBCxA86OZ-aZjPy{* zX>iTmwM`?I*UEh=|D(6!IHZ;yBQlG*rOK0Ps?~|Ukd|Yz8a_U1USy(zay(wH_Vu#L z#X7};({dBH;?z$z`eIaP~g=a`Fx1O?tmf}6+?GKx+dO5W=e#{ zMZb8X@VkrDkuq}Pr+RO}d`9#iV4?E--ze>CORC=Zcvn#jDRJLepTAZpexWfsD{5h^ zIq|LJ2b!|J#xq%NO|m#@iG4PH78G>SmO1BCzv)9pVqqGwBa_sZ$B8685VeqGnZ4Vp zcBm~qP6@wFw*49c9ObB|sjDX(h1Y6=~qNIVl4}*VsYy4`Ok{kC%g?ZYD zAunamXye)V?7pI1{^r7GB zH8Tj-geE>4oVhJ8UxZWID*pmMJ47uIo#lbXk?yT}xInfv8{9iOa%X8=G1wMa;5A!l zhe0Q85~O5^&Y3|omqR)H!}e2GpsfkFOv72$%qPP`j5U&UhsrtGBzQ%VO^J6=7@5An z4j3A+nJ0Y^oK@>^Aq=UN!_Lm3NoYL!D4J+3^o(F9Sr|hc@Zn|-TV5?C&Sk?GmZ<2+G9Q2D%DkAb7tu@sJPQ;OX-*>iFXH&~dAFo#Cy zaOmC{)z&s6LgjPr9%)3<>~UZ z1|2uj40=eVujw~`#io5ZR~EJ}as@$mJcI7Krir3DpGYp!V>DZ~0uy%iUp09_jwNy# zV$r|j=xV?HWbBmNRM8Ex!=2`ixU?5Gi;d@%(MK$6JxOf$sx-DR$cUezRB!A``7VZdcl(IdqcT=*Ikww<$3d*oCcOgi(Z~g z+J_!5NIU|7cJXwyZ-2p5)4RXxH#aVzc5^_Fl$P%94(U{+yBp4+zxRLEIcxdBFN)4RGkagP2mj^YUZA||ZDQJU zgfiULxla&tO|b~)^_s8`S}%I9mr8Np(mAaU(aFED-U>0fc=Ge-H}gdPrXO;U!%vkt zdg3IugevSjY%w@363_e#hSzX{7R)$9y@Di;*K-nIPE8@!$Cq53{mDtx%>PpR60}>B z>E#Me#>*Gpv73G5f4Bp(`OLLCzFA>>t!50%Rn=iopZ9k}do9APS1oNjXT*X#qKPE# zh=iIbNai{lrdTqfl-i$ap+KANt(=Wm?jK77O>2mz$i@b%u3y1tbbPfazW%7;Y# z#cg;lVf7iOM&X>Dr+c~m&{X-$wSgwh;!rNH|0$$O_rEWBFgoV5>5meGPZoRUAQf+VM^1ABf} zeVR0R&+~Cq@d0?R)UJ3?LGWJ0nNQ~5+d}^?9!-CWX_p-iGbMYa&>(s z-?ntT?C`Mws9;Q-w2c>iid)xqIMw|a2bQFDmd6xWWWx|!nRJBtSse&j^yy;& zw;1WU$+);G9Kr^G-=BK^%q2w9SB}v4mU&&*d_{Rd?Izdp+EI4YbxryCce#*+14%h4 zP$v4kZ3A~~z8rHAH`+3|Z)S@}2JQ}0Mw`KQFps(4&p&@*6s_-(1y|qA?KP+}hKFYn z|A`L*_)b%KSz3#!xX|(ZDCi9PSH-)rwU-WaSi)U*0T&R0zdc?ww}WJH2YU>X^LJ99z#>^ zC790=R7t5I!dbUx&oSmt_(ld@!xVKXoP^zG{b~`=Z)S}TRa8hUgCQ(M>!E)?oT=1b z@oheU;VGR@;8H2$@ghyj?Nx<1Mwq3VgFi*~OT6u$=nRU}A$y(n9!2{!6}gc#loyuMZ;>B$MeqyfK|i zGZJ#EfUBp*E!u1AHz&c-XblV$+1|P_enIK>wl7|ht3Dzyo3BLJuCr-_FqPYs#mdqS zQkjqkwYx&dU^5PY27UjKo?&R=}C%;O4=Do9hc}ukTp(!U(kFq(AO6 z3nrK@5CzeOv$hdb!aK5&B<

sJh6w^XudW^5c1glUV1fE`7e6?ez$L*-RqVd2fA~ zTZ+8;7S6RHz0UuN}+!ubqoMN=7}01@I3 zc$+}wwGj(yt4W;Kg{77vCQDYYZ@H$o0A{OC23=!AME?(=3eKC$zDTPQ`g=7mOP)M> zR8+;u)=N?TVF6Oasy#BG?Ex_Yg6?u_ew57D;;QXS5wlrGuncwWjb>FF|GxT7}5DA*3fxE_3jC*Pf8r@FD3Sw6<_l)a(n$4XFTb4a_n z<|4C0SE>2b#(LQ#g)V!04Juq9>}5* zi*M#~nXLqf(JW~=g)jBTwW2B<*GKn$PMfJ>*Q%QF*0xBn6ET+dqgDw5Topg#jAGT~ z34bNJcYDn)16;(_lCs%H)cul=!oAAXV1hFZyeiz8jqoVwS4Qs(-!>r26tXj2{=;!=PO_za3c8cmkrrJkA*av z`hY;4{}t?qb}aCYG#xD?u1HUYDu^78Q2TR1pulF}-(A}46#7^1MZ)L8k%4GG)gCVX z;YDQ#2;8@K2XAgSiWGS)6F7kFIDjt3Cq;oc_-$m!L4SP~L1W8pavQH)$R>WY*#{oi zfYqL@uiBxJi-J(a5alCp^p%$2^q=}Ab@VYFzbFbv=0~xTKXM_DI-obmw-2&f=iK-0 zNb8}#Kgr7#pBMbWAu$&gr!E@U8yK%wz?@Sj?&}K`!TKcMA8kFDjWh%Gz|y&`N47s0 zsO}+=EwsWQ$=G_I4#`A!eMt7NV}GbV)KpzH3+v+cHKI%@b2npy=tbJeTsj$pw|_eT z7#L*USu$4oVR&BO-8w#2=kzq)YD3dK+n%F)!pnjkX@jsK!ttTf)@tOvppBEM-L)65 zZb`|RcSUx0i!%J{MJEjm2{e+8md3jfSbyQ7HcEPby0isv&s{-&UQ94DXQ)jvn3&>U zkHp76lE(JD#9)hI;@s0FLpW1R@!A1LT;=% zWrT7Y*GI}_3B7$*geMeKKren_1TaCP5J!up`M z>n)spu;)psAw@>Y-efWoxWyPPy3SkUXZH(P`}5rN{EQD?o_9k9!|d0v&%t583R?fl zLXqAk3@swy{Z1{;2^YrNX}|}V&A#Zwqm7m?l)w6S;HI{#-<7ng+az7+Hao!KC0P~E z8Go_p_21$DnyOOKkN47wI(moiVbTL?D04hDUe@ zc^s&MD44<)17^|hrir_sKhXCqtfh@2;3Ikd`K`3e*Bzc{?gMQ#$NG`eu6#W^LNwjn zl4;yd4<*>Twim~=-1U{IT)Kk3*NfYklYgJpIi;wU;0TiKE7iI-T=;w{xh&lISH}uiBwWwiUfAfFBbf$gn-(EgmWk|#>z3D0oMfPGI zDrUcCy(Vq-iVoxfOd9Bkc^OcffYAx{o)eeG>(-VG3TB{3;V@k4lD`cX@5`EpXKYuC=e7uY75Ur;lkZxz^L4=M{X- zsSuC1O88mQK^rQ{8j;RfRvSrd-|hcw?b^crVMUDlc7 zW&!cNU~#Ws#lcbH@X?5}6zOd9R?oPYNsgi7Cq(cCSq8|bCND!@sJS>zJFXfk;%v^< z5;YvxX5&I0o?zadJ*=k6mbboyjx(IH6OwNbe`)wuLU9~fovt23S$@yfQD8y~zcqD@ zlTY}@futsIAcK~>`_C-F_FOxKh7DEFCkywony9U>V<_>>hC#clu{4PWBd< zp&7#+Qo5!7>!}C+GA~GE9q|Qr@w-v-T64oou}VU2hB_6tT@O=2YZzN*<(+yl@End3 zcC)J%N1ev2Wg|IXU}~Jl(=}L7SE|(tz{U@h!CfgIxHQ+8CJThQi=TK?f>6dZcEYWl zWc2IT1#Tq~mTI`R%;y(tr=K`dt98+bg;-wX!K4>cvw*QdbCh>Eb@cHac&b`t!HPO0 zWy|MpRFSX!Abe8EvVrsWJtQ}P%PkS8#;j>p`qa!IpCBJ&?b3W4ucg5FBhBlg|3;_T zY1{-+w86uC3i(0fJ|d5zsT8#&54y|#3O;B*2K}UzO%)?0IqrH2--F(N{f^OTtPaGBI&cQaGqsGKJD6If`8QD_`U z=n18akf{7=_Q=p|b^+Xa*J>@_8f>8>Ew)73w*NzB=-M z@kK|E6?w4$*G3r^Ke>Ut_HvB#(pq&obB^C`L~g-e6Zv?Y;dAG2e5CgkpGl@p32$%J z!V{|8vsIKFKdW-WvtKlM9np~7&3KupupeLh#rb}Y!2kN8_IIM_pL`93h4e{Ez3DNg zj|5HK01UV~r*iU*iBa)?SLJNJ-S*RGpTYe(}+k3p6`Y#U`f+iZRi2{#- zo%%MiVAREC_3jX~`*!gWRx-*Xu-Sf$xmF+F*XSYuC5&q)eZ)FGYF#CBi_i}uZV>2b zT$QoZ`_Dyz{8x$wnzRok@-=YTcpdk4wS-)ZR>@4Luq1XOEpdm){ReouF z@deSht%X6%$TJszI_l@VN8l#_aR-^}^Awe$h;;#e;L(6#Y6lB_`=74of+|=EmQbjg zL-@gAxBcog4&0VCeBJkT7|&9TXNQLpxp--Ydl1 zI&7Jh7as@99`^dGY6u-BMlw{Yo|v+9UkkfGg+2VawyGFo*l}>zZ%mc4QZ0M;8V#Mr z-=8Z8Q#2~Ud<;B@Dv$86rdgHQh?r7wz)0T}aP$fNTQZC?0SFN!+B>ogb;owO?A^d+X`@4hdC0O;P)F^W~tf;GxJj2ISh?Z=$z%Gvs)L z@7yae9sE<4ud>!sp(G4nMK&deYfaaJmy5Tr4`-PP-U0zB&275B!N%S3&U;Sqhf>GN zota&F3GFa=E2DIo1$jcU{(9t$kha^$&jE#jT7R`?K~=u(XzlDZpOc>@^nI+l`ZVra zYzYL_4cgu^J(UQn)@2*^P?wXuS3LSoxDNhe+`mhq9V<$ax}(Tc7Ie& zJKh+&w%p%K%Z-3>$=6>M>J6{N42SQm*HTV2OMtflb(jp+r)@Pizmz`<&s{;z_ZHFg zg40QIbW4pa1XQqLGIPHCkS9?mzPbyg@AotRE1kI1$EP;1PXO$q&nBKyeWC zinr%6p=JCK-T0dGZ%G%e)&i#IzjYoQIvl{BE1>#kxc{QCNDnm&l#hO5i}2Gq!0za) z#UYTOS=~Lxeda2XB(y!XpSAklEENV?cUFiS($#p?e%l*N(NUj1&!~`Gj^4Dh!FXeD zd3Mt9wTru@Y`+;lftlz0i)XnIro^xCfe41M`>B?PkBalJom-SW_Zn3{us4!TQlFVL6 zLy6w~@wG93Q#}Cwaj;EN*eu;E7(1Vg!JULGF?=l^8TVHKvc&)IDv0SI@A4qqgBxyR z@-P~z0GryE^=D>kXAU|`sqJb>HYfN@;7p$=66Fi6`b9AT_NB}h6egq0f#X>!Wt>u7zA6L-z174+VM5E zteN-8kDBiNi^2xyhLa-2-?72zEal2qb>p#)I|HhQc%d2FeX4Lt*4X2V{h9M`ps#9= zXGDSKy+XpQmetse5vs9`!cb=IJ-E0ZTrcq}fz;GlM52KkK~WDg;Ib|q0kK^Xj#afM zjMaLH;p4yG1=Xq1jqoK_rMAnT02amQ7vGAc=wXas61bM%yBZRn z*1?s^H>}>$?$a!-Os>Evc2T^DGbjy)LkXbfHCk}!mj;H&rNjw5 zjDV-8X1a$)qRe=v5|j>F1<j*Y92T6O0n<28&R`27l-; z^)oG8Sfg#H_(c_CF@zvZl(H3Ha}n60cXGhpCnDgr4%*4^+_Y-%vN9p(dPl`wuf@C- z;Le9xF4~o3DLO-By%l;cb&zy5mMeuTP&Ge8$vAc*hcqk1g5Fd)+Fakv&K3xx2isAA z=JoM<1p{H|4XdF;GZD~DX=5PX(iNp8M+XQiY2uNw|KGiCNgbp*4y(V%xVSR@{6XtR zSe4xp$cdCF-##L(ggnHpW})<;^I#@}S+3s0gzyj-Lu+hpCTwv8Abs*Gcxig?Rp@e5 zrb2C(Zi0!OvyG^e!oFH-D5a&DAzz9nH!**n#eQd%wv;%u0+DK@OlRo!Mh|Rz7PeWY zLAhYprcTIDkNx!o!AtUYMzjQgaXil^f9DFph;Y^dM%8v3R9$)Zx6<#i1#OHr-p%4H zScyStb))fs3T>AMPhnrA^)ru@MUKH<&!Gej)P}>3IqSv~Px|6VZ(bHb=6 zVS^R=*R(IrGm=BhsNMpCfyF1 zLs2qoC8s2oy^)Anem7$%8iT8R6*Jdy}GHZs54M`OncM@3TMFt+P zN7jC36iX6Rfaa(vU2{!fwBN-7V6fNr(L(TAF>lRz9#z6o;98ML=%Ef9=%$~|fn@+m z1|q5mH&zz-^`ifJWez*UdIl`3arQ<6X1V9Avr@>*u+3!)zR1t8?Cg;H&k-3@uC|H% zp6?DWl4PjmUOBDAji9wYwY3E*C%uN&1~UVr?N4gAqJPNYNbf?qKb2>BB2{bxGb7nbnp4ff2iSEHz4$}*eh z6~c1(w2-p(g6IBBT`)0}9Gt@Md07+--^@H<;9Dwl84HQR3}H z6#w4sms2kbY9dguhGMABBNH~bCNr9K->PQ!G#1O#+f{ls$(5`n!$3ZNN02npvO9lW z2f;H)j`%G{|LB!{x(5^zt1}^)Y@ZHi*`A)z`8GUKq}GC$58rka7>FzMG3OfQ*RcoWn$SsjaZ`9HY5z@C<+WtCHJ6oVxUWtmwj9C zS3eMJ*ZY%~$eK6myB&{-qanglptVuFJNM$R3<#{(S!h;*EPu7)v;`_DTp{-XGpcEx zVuSoVs4avkCBS)|bG6=dIxCNpW2O2$BQ@k9mGfoSEEjP4K7om%%DYwnm2`DAvRC6- zR>sLZwz@cVJYGDelAwg<>r0W2TmaQm`T>_f7#-O{q8#vemhY97s%0QJ5TMtL9QElD zbfw^tayd$zYkb(KvGf`UK$VkKa4@h?_(>IvI`%DM3*2_hgvm;^VpKSjN2eQTj}#o> ztxq^xfdaCy1IBx)=aM z8`&-PdbrEVv1ii4PH`h1jZY7;pr$9Hvyx5}>sdB831gbaz;CT~?FChzcUJ2V>4-vr zAq*;K;avIUqWKnWvh_5Y3C9$TVaG!YMDA8WLZmf(q*N@38v&>rkk%Jd;O??+y8P@H z1hD<(9Ix}R%gV}!@o%?`AY*c#lA0~gK9B^2cB*J(roQ|fB}#kzwsf$fu6@@y&|y1tE%W^9p1uy97}M?%4|-0W8_Be z%@rNiPcXWL(nL?u6$3ZU9czllANpw97q!7r!NLcHtVv5TF!wU$Ig!JNe04I7aN&cj zn3PMZ3|7`QAybXtE2_8ZU-njwFAP5+)-)=8;$NEau^sdwM_GY*kfAk1I6c(5n;jQp z=&D@Th&jpJu#S0B1?;MuL@N9OKfbvCEo)Voi!YM8Jo(aH)^kBGtI@sZ#+vV9OoQ_9 zG4aJH3rriYJO^0+->op;Lu2^&c<68TuZCpQULN{2Fi^LBJ%eYCm2){8kX$(Z%~$Cl zh4?dqlttUq^4YzU92t&`&r-_KrhTu=aYsG0MRUrvFPU%oT=mADp6{ck=1wKn#tW`k zym1HgQ1Wcxfi!LYI8y{|4fG>rA#Aqb6DQNjegVPL<8YEh|3cN4zR63`F;PR$zjwA5 zZIT1k zov6usu>D<$+Tl9yINQ^rQw#~;Esv*x_gph8;PvlX@^R+ zoW=SA_cDS&=6K3bc-)qjRyy0O1V48os9|wWeqRBZu9c>gp(ov>GJ{wB3+u{Q|D6Tb|IR|3pxtah zVMKb|QKJSfteXw#&wZ|6(UIGSy;6>c2#7l6d%h?=zehielZCb{bn{xVmADz~-RUwP z2;@(^V5f3xoNup;E-9dJmiJy{LU}F!m@rLl$gTx5%3j0A2hAnjY=AU~EjlfENBQL9 z1b5{VshV@~F7Xk3d@rG!@2jKn`yYcDSidFvhT*V-9ql*tB{4xuL8Plub+L9gxC-2i z_DHb)z$wTASzHn5`hH5t$-a7({~&Z9*4I@6#9R_Gqn?_P9GvEj&M#ekPR3%(bqglY zMoQ}x8m`TAN#l7Iwh>}sFCUnK{w}o^DG?3g ztI4lGnZPxPaP)@$zUMu7(!qxZLC~{mBEj%hnbu`<(c-r^K>#5TLPA0xqlBZQ$UT~t zGf$MbaSE}5Y_cfj_t=T}VVfbXc%sjU5Z}soZ7x`4U=k~%sc<~8?ID=t`5jMndAosL zyUX?{LHQuRgDMXVV5Fxz9YEFO8*@k(=h8N>C<0KKfwFli9j*Qu3a~Z-sY;%j{SMo6Z+; zTrN}*T>K}#zgle6R@*KtZeA?hhtaY%x-A+3@MMLBR5fp`eR`N|+M+X7=gpFhaU-%B zKyEq!2)o8F(U#__oNzI{quB3`ey371d_ShjQ2_SKUA}%a39MEabvf9j+mbc)?svCC zA#dX!Zv^05=18B|3Jq7uamiF%Z`Hw$0nb$|<=q_yaW>wF5kxdw;qQA|2tMgvDf@i) z+>Mc%jKwkFWQYHO?>d`?nZ#Qvdm|i^O@Ihw%!mqQ3N}1xpeU#Zx1%A}2P*|)JVjXO z>FG~DvD!jV_550ubgt{Sm_b9!JGS}{82F3*wIc*XS#8$Q)9BcrTH`a@+g34SK7}~9 zdEmpj?iXWe;Z3T7gD=WTag~bLuX7I~k3#oRT)VPmZ|UvsT=rkr zVMt~N!gN*$&j|wVO&VVm4wVk03W`4LKg8fiKnQCH`kw~jZ~OTK3(=cbW0M~8Ok?W)K#?*~PhFwuY^|V&$=hJ)6oo`bu;|53dCXAOF3!Y8MK=v| zXy@8+qMkZ) zlpD9=M^++`qkL_b=a?cOywO@0NndL5p@hWpLercjVa7c~tgYC&uY|O@`*pa0~1$kx(W5B$QMx^tLN>CpF>A6(r zN;kgv^ydjHPyVPeWCj`#YUkG#cFH%w9hQZXP^1hcv?@K8*V- zrAe-XNLrRu=sTfQE{d)=v@d^V ze~jc9smsk%U){uJ%-KzO79Msa6Y~_es4PW%>KA9+q@ zv|+cslys2%JgeCT?u)@QkU9_l_7N4mfJjj8 zYcjsD-r9_}YFmH$}w_TeQ3J{BNQo&6#zz4r-|W zgSLAAE1WS9n*BH{aYK)xtDrw0ybn(+O9i~1!@_}gPgIpLF}&V|ep*Y1sp`VBJv`+Q zaC!Y|T$_!&U}+w=!lR*l$EP5EMSjF%jD-z|6Ui||AzYqccKlm1w2#Yr2;g?Wq+az7 zqSDfy)ZDcBO5s;;;iU!#eJ1GIS$J?HT8|x9kX@ zqTs>qjSRyWR03(1H_h?ge(2jmm9O|m;ReaAhkFIq9B9Xu?<7oSyx%s;ks;n*7epH}#P%R)+X5Nq`rR?GE}$t+TyXiIYy`6Fh43#o%f97at`J#kfW7ED#H zG%WfuCt6K97ZyGfb~`Ivb}K0oi|3JY539xYt@oY1OpqX0nEtt*KeHslCL=|q04L_IlLgl9BmE;;-{?Uvmev6aO9a-`H6d1wVe z9D)STk?JY})OVihz7yd?FUDr=Ib<0l%ukop{^K4ufr8ys%O;%2k*3s1jlt;@qP@dI z23P~&|B0*h{PkLDhe_Pw`30l;k0tKSY7qY^;i-p2hnK(ROrrsR+2R>+&JgZjsQkS# zI$-~Y)3G*Z1j|ts^>p`jk{vew7)Vvofbs4iq=8$s1#AF?A|JF|M66zw`v5OqJBSdp z8em}t)Ps^Be3`kS( z)bV~xTfmPG2aI*}i(wQ_;Vs?O)y4!Km%I7sE^sf6UU_-;DO9+~mKR+hlF#jIkR%J& zid_Ifi9S(j_h%_j!Qqigez{PdJs8KqocU`tgAahuT1rO^10IiQhp_%1=fZitusRvj z4ygqv$OGIi8reO6TW!&My#E$wxBTl<3Sg4UVD0vt|MG13rOi8kN;X?`kBV$;HNg+Q z=m)L1`$g2xy!rDmH;7^oE67Q)I5T@;+Z7k@781e}hBf9~XMta4Dl(C>_fybwyo)q$ zCs+NvvjY%F)7r(bcnRqx7Za1h<8FQz%)dNSHgpYLWBo)c%`G;;iwE~4TIPV+vf*@* zWG;`=t)w@?P}|pE_+Ec;(hBHW!>jniFfAeM7`K`_O$U(=zI{C=i z-8)b78tPpA(VakyFMo?fHZLL>Q*P-{vPV-P^Al}Yzvhk0$&TdU2iD6FOn^qY)7W6! zKBJR*-Kla?T-`fc99$ZhZB+AyCH>=jx&EhZSRxYFW^&*JX- zYQ#L8R(32{BS^qm1H48qr>lIaHzN4=7iNM&Itvl1oL&Kj*YCHaUI)U1{DEk>81Pmn zK7U4E;7O%Al!fiZa3G^_DiBT70U%na?p^g2C4{;gGPKe=Q2x7fR%4zLr80{mj7n7} zfE>hs+DKG>Ty*|%?HL;Oa5RdrI^?8A2Ak%k+R7+1pTNU+;OkLUS&O1XP>}B6KhaX; zZ{2?B`J~&na}X75+~;91ggzS2j)wY&lhSm~I=h||L;u@1UjLC_)!57**k5_9%21W+ zx=7!9vJQ!W3bTMu=yG%OUi(fCo`*zT3*Q>ML@)~vQC?O;g)`HfkSp{vQ%17agF9yp zpm^_e0cw;0UlC8-U?dOxki)Qi(>PITLUW4zA(P6v!G&f zbwC3KFSAyS8aT&u-#UM4;9HJ z8>l(tVe~Ux8krdn3&DBANJcUcMA8sgNuzn8-nU$;ly24_e^?XNTYb;N*Hb;3ja07> zacT%Fjdxo4N-~eQ7(Yb$dul?`59aPdzr6QLq}RtLR>BD>n*UXyKNtTIto-EzAJqp{y{6}aG0BW z;i_E?t%t^~QEQ&!MdXd0W%_EpAPpt+F#_i%LJ$LTlsJr4IxR4WJti82)JH=eJT)Wd zb+sZ}mUIIVmrGvingBj_3b_x@moKTxZ(e1G=DLmSL|ZFIghANRo(40gJcr`FhfSjfXCoX+5Y)p#|Z2W#kP zfd@pRk1vB-A)G~q7j`nxic!<3lKqklm7A@YBU$b1$@!tWOFCu%Y( z)uv>+=ZfDreEvZOv~ZGA$8KCFNr9-@;<^#|Kd=2zWu1BQI(F2asiJ}L&pDLvAo5(( zV%Gg!;mc}QX)>m2IHQ|akZQX`(Arnp#i!ot{h7Kk}+k`XZQkPkgsh1i&EM6%oT5k*ZS6}s)*joQuP0C<=wCNFsDFH!0_Z{G%Z zi%={1&UeDFDdUYQm_p(ib>ZBm!7HSJ;*W z$s&=L%+%R5AaW+ima;M8UeBemo>UtbJ_K08g~4EQd;U7uEM3I^x>!|c?ve1F z@5KhwfxvOur5fF^5uCbTmy2rk= z&scbrCY05y5xdE1V-++keF00mbJy+x2`AE@2V=Jm65=eEpdXYEdkgYbq+=OK`^X;W zD75HmVJPC*0+V)GGM6yKak#BcUHL_8k8t(t7)XO^I}l3|&G}jmyGm2`d7ux3k6V~> z>9%}dM!|FGFtQmc0z;aIU%Oq4^~DIyvoUMFG#mV?;)nHCm-2MS69ypyi{)(my`IR+qzWhfDjQ4doaGkEFXwUd>5bzTU1 z)n?BNyS{Ys$bYR$ry?~iuw%hZ7VH1W;}pm`I6y#r%EtIEXQ*M29WwKg(FcwJXRLbX z!;(=C4U33g3IYR~KL*{83G~yk+#4*84WBjd4c65*_6(jZ>L%HQ!ud&`JX%u zKa39?`(H0?lAO+3MhG46h*x89X=5hgwFLQku* zW9!9IX5bouhl{H<_P!ewuEg7#=-$m6|K5J%skVzQKCqUcrfB%cgqZS6sKU|g#+~g0 zLRcYU9@tX0lmnuOmNtZI=rO$CIS+y-D<39f%p`yj^uqVTyd(o$m<=V=VCIDVeA~o? z4oRHhJmzlkIcCVF%icV-N1el=srN>{#$k*8a4c7Z}1WLJXoi;BG*oZTX~g;*m8yhmTsDHp zbX{#Tm3Z#UzW2|AAC+n7@-i>tF0R?TjU`@2tYanlQAhM{Je4$hRmQA#@klFLIa-G) zT`!ei@`lH|^f&$GK(~B8DWrXUsR^hG0$VLWTXq2Ug<_V83?~@zH+caW6Ws+NiE_BN z&Y6meHUz4m+s~>`HQ(-lz|paFv(}o8 z^w|sy>v=|y>@UIWHR-aIeVqO(m{?dQ72Rg=cqpWVJ^i8lh@(afL8_5O%&Q(hQkTtZ zfKK4_IEdr6tRC^ANy{HfOxuB9!`LNgqq=(csTf4gT3L9sWu9s`8M}0_5|vYa1DCu7I@$=muVQ=MP{V=PMi<MU2tbW0umkEP)*>3{PdacOVUZCY*yW0PbKQ|!{)3tGiNJqA3*L`ffxw~qqwJ-t zgY1q>U`_HAW}z7x?#omZJ)aV2*l<-_0cxW-h_P0NJ3X`DOPF&rFbgK0f5+>%oN8k& zSoNpBkz+t}aRmV~!$=PDIKS3k&?`>j5WeF#k!bCb`m?&O{03a`K=!4Ke$Bmd?P7QH zLlEYy+S%*l?Dq;h^wjkF^GywWZo+!mxyH}tw&<-4DBsMV{$6sfX*4+GMO^z;D_9Pi zY;bSvvAqYCcUPMc{oIzO}dW| zxetFM)H2N8Fyql{eL(qma@ov&%#R0WYB`~$^;Sk~Ud2j_b}zS1K7mnlwyJQR>|&&4 zh#X`bKW+n$MiV#YR8jE$21$}2*;RN_u1p5-_#l9$t<$-%-tNX?=NF2ZzxBb?#2ee0 zk}ZJ8RX57C#NSu9sd0EaUKs!SEVPq$#aOv6*=vLOq`L1$kLBC%DE!I=5pd*oG6~o~ z5)}bdadfNOnfM|UJM@p&d4+c4rG7;Ls8v(xw3=?&NvRi})axuMPs$i;we%q`;PYtQ zEXB4i1uL5Ces%sPSm3IQhvGq2%4IJt^$GS}8(uo@{eodc9mw_xjp*$Or-=+O0deIZ zT1aZg*^=KBg=WK7(?-@(*9M)zg*j_pE2G6E#6L@{Z1eR@FF8q(QGLq-;Vs-ox5BLz z=VxD0r#gRR0yziF;H{OvJ>}_j- zaXn;DkGLP{bX=6366#+LKr^EIL#)k zzpsDF&WJ_Nq6c?o9$QeM$@{=qN#J?5#v?qEmw$^7O>h|Wf_e=I zbNVZ|?=+ZbI#c{n17iTVDv(a^`dI@-)PY-*@2(lZa(w&K^~bX*BDeP0%p>-iHKw(i zHg{#36=!HgWjxqYwF!SHfKeuZ-T_piX|q zCj^6M03;H)RlLKkX>vEi0&wM#N?;uV%nx}%+kDd)9F9!wW*u+%o9rHi>SlP0`Xm{w zH|F#0YWKC(rsYHAeiX!ilHP5$e%J_G%08!Hg=6+y3^26T3goPUsa2K(w~aqssz1L~ zIX8b-B{}oZao-Pjqb1j^=uc|Rwv(N3@j`4C7j@1f0tc;TX3NxW5rHY_3aH^$`rs9H z;+B#CDI-nVfpZMdI8bp{21$Y8bm$_{@PBd-e%?4#Cp|Rkd8s5ylZwS-f zYX|@UHx%ck?&hW4a-Z4r;QfP)tAjd2p}U>ebq{gkxKj@36%3hGG$B30B^}^6A}%g{ zW}q+OE5XDL-33{Tz-KKqH}-ZnUL#&(w)w3rTj8!aNb)(y*FIpPSWTs#{79az#p=VI zzWhb&z;F~9@SdA7Ve6ghD2OB2h|rgqqt9Y5azB1mjK$B-M0;7v@`jm2pnN zNtqYRXZio&i#@nzqoUTsfClHwU&FrF5kPy+#4S?mvL+JWKv)ynnwGP&b+L2U?aYYO zgAfl%Niu4OdlA;9-(b|b$@rBK$%mYET2-O6Vc^C1+lP`O_k5w8e3p)K+XJ)jC;-8N z@h8Y1)ob%irTtC;SNdrng3bqbvW+)WI;`rf^C=)_ocMTzFCQ-&7VbeA@`39g?a)b- zjOmPBr*2s}dw&Z4z5qlf!cdis^`3S^O#z789dxG^&%cZEw8^@Tyu#Kb#;gn6&i6YV z^LYm?w?7smT{qju8^Bs_=7J7+2S;O}yu+sNK*+u|-1USAb zcxlo->RyZ!l_Y*6UR}*Q!1ttroLFfYm$$H(#yp|xp(P+^8{z3V!@#}UyWt7&DMg4_ zsMh?!Tp=Nn;4Lt?p^!YgS}^RPu?~ps{=y`uU=ux>DR4|RzyLlT#04gJUBH*ylHG{RCOe1en~>Mv9T6M(xQ(F3Cy}PLt(!% zmI1yskkI%H3;|>TKJwwB{Ptj=UIE-V>=2$9`P%a&`(CV$E5wc0(GRzLQR_;Fy;QlQXmA;KKgS*f zLprs+y~}U+f!wFrP|$rb)JeYaRs)y6kBJi`xX$j>WckkZO`fGf9j?F(HN#$8n=A5L zUc~jR62>r7Ase3w>JH%91iAa0gZastW%nh#1JKAEI1{9Zhl+NLUdQ{~{>qM6&A7_` zsFk8q{|9 zgG3V7nQn0UXCkDHhlks@Tu)Rr(D<-VG0vv@mV4JN#eWfo7098cYT$zBwQBFO*9dNv z38x-fXnIyavZK3Pd59h(IbJ7z^B()#zfF(>|qI5sl(Vt?LOiF5FW*@GM9C$Yzgt!2GQS9%O{dgo-kj)24 z#+A6eEMf?_ zfGQ&wUW8q|T!YP&_S;Fl8Av}0I_oRkx#eGL?*zr+Zswz17^}!6Du*+ge73epIr0k< zMITS|_)-PU}BI!4^a`+N?SgpFu>KV{SaE3vn+t2}WjUCbi&} zy&TZdsNF2{V>EvNoX%0}4JSzd_L7Gpsymh_kZfJw>*j~^&10)PD1R~g3Z+FflP}h# zE4_%^xoK$g9fw8yGPK|#iC_YS8$vI9BD2f5LihBWO(afn!BMWYjs<@Lmx8#*p?^KW zM)9`LVGV311b}uhXzbqMzRh)nroP4h`NX9{ANtk3pF^nH+D%~pP z8rLrkw4GF7K!!;^a#@zQh;ZwkLCj2R^cJ^w(++9Su)d0R z4jQQ=M`Pn~?;7A@Mz!%Rix5$Fw!JNfo53@xN7(QgBWMM$COe3g z*kG7axmjw(PEz8R>Ih#A&aTD^Vd7Udi+rO+s@$%gbDeBK#L5gK)T_FsiB;~&vp|46} z5?;f8l4B&$G3@+?Zs#{F@KV7HPssw=SF0-n*ozx&^?-S~ES#3V{=K~#QiAqL1&i29|KvMqAC4x!uIap-12kNv)Bxw2V`U! z`df9~fRrCAS&KRG+qAfgqXZ1dIK~pJE*{d4Zof$7KA*cq9SBJ@@qv416j+^($K-B+ z)~wD}Ci1Nnj~aLO=v-boYU`c~vmdgKw*3hVmc0#!w`j-*E~DV6=$t1L3vYt5dbooE z3=sNvV8y1INm+Jvk^{69h>$}WNb}Bgy>rWxTbJ^en~u+@p9Y{49NdrEZ#EtLyzOAo zd-lnNE6W5@K|{Ifoe;UaD=+u|Fm={{QFZ;-r;!dpKuRv88$`NAKtx19x}>|ir5i=M zk&y0gBqWEB?i{*?7+`>Bdw+j<{)2hVIcM)rto2^L`gaW!K>H9f$}VLXAdvs1-{QK_ zJwt3~$PqoZqLWtVJ@WYIMf$b_=KR}NW(eW>YD^ckQCeWz|8HgLDQSSg7}}^3KQKD; z1lpd%h{!ilGKH>-Dm)7j)dbJ#v-`SC=sM#5dstZAU48Qf;~nfM>e0*aco?j5=jbX~ zKG)_`3y8oj7sqIP6C`rJ(m#|^#O}kLEHP~{2gs1avyrJFyrvt< zi7UP|k4+B~I5eyx;uFTS$H2?i0JQJ$;gys+XU#Ex^B49CXcz zQj$2r_@rvTC&EkEkpjB8J#I^$ul@m(Ib4HkWr7Kzu%+vgO)B{sMM6wR#)KE#;0ooc z)IH4=EVY&67M}flx1|15nL5*4hxlmp<&QU^3o}n1VEq_nb8D0zMNo`W)DC-f1eByc z)HM5Zq9d10l_q8QK}u#j43@>j{t0fufZgkSYLrrqp2l$272n^&B2GT>P3TW^)3s{F z0jX!?e^(@bjWySN39|2;I@Y?;mcc}qc6T|sANQJzfoO>T-H#x>$n2zywMtPl89;@` zg$y^CR#)M1(6MVy1v#jJ7AiM97NCdK!C>_cp8ubmYu-R-Esm@!;Hw6%T)+Oe8_0Uu zx|ForVGH?w=!CJ#Ji-`(JBEy?&?G@diCQI-&kN|UkY7&|_IJt~s1*~rdq|7}X0Ll( zC8$}hdjiHLm0Q%4(*L^Fkf2m%T5FbeQ^c)W+TVA@?IT_#v-td}tAlcim#kqKXpltr zoiKspf#$Z#trjKsb3%A0wQBgm2jzf6x1` zmWaEX)}Kf!1fS~Aq66!NQE0uVP1b$bn`>7&pe2<9qG^%Z6FxG`_(YShr%bdxOZXHY z(s6^FpZpgjkk80fe!k7*CHk+HqW!mp{DW_ICLCu8{N_0^62>V?pnx{5RovsjFeyq4 zT#>{^&2hHV*1H>~&pz8_E`vXLgb;ilLV_Jxeml-m z*vYHzJ4=R&A@c|E^@|Pm16F_epcmkH?fU+X;Nk2O>C6lPyYn|5!=Wck58lTX9kGGp*+3`9JU5KcQ_g^VGhwd#bieri>wOH}E2`waYw+f+5CPE#KLk>1K{R zZVQdF5Fak{aET9QhU;pH#&Z_Jmfv2^`Y;|K>OIf8y>f_P?}yPM=D~JqB=hL=iZO=0WZUQ;M@6P zkMT<)X9K7yT$zJpIcpk3W9gJ$RXPTW76E zG8;>JE8`OQehiY6c<%G!uhBP$n~4yQ+eoZG4s0NnI~=7;h|d+X?kxL$$!}Wdy3&gs z90{>tN^iOVNzD2wEIMJL75(@?NomTxTXQw?GqVI?-@t+rA8(kG?b|aftp? zCq3Wu$xGoi`iPwe@zoqQj8*I z6VV9OT~(&zlXlN+6nl4p+0^*1DY~hg1AHmjc!T#R>B*z@GjArERONJ##oSK#o14?{&) zon(^~=a!or>~Io$?oq7|f(AL3Cr}uHrU7iY)ROm<$>xy3u0UoV?<;dnfa!s#Y=WGi z>Qk}8qtT+M#i+PW-+9FoE{i+s_xy+83(C5@d~?>g8Cj)MOgYVw`+%3El4z`(dvq5? zFnT9E;Y-U3#;Em1t1K*y*{&Yl2ls&=ku6}or(JjTO?OA2I@qgGfCH?{zfch7v6`+; zbvkTZl%Vk=jf54waj&cON8R%sdfFM_@IE6T<5(uzJG$XW*5D5@i@c{~5wc-KHWTvW z_=p!uhZxnk>ken}w3q4fi7e)`Ha-QE4;h&u16&}h+Cbb&&iNm!oErb_YN?>$dt%B{Z*^yLG$8io{sxqtpA*Qb)2*%L zFTni9fYTCEY=@UP^a;^o%^yK7)K#{Zhsy>quVX@J7;xVb2EO?^)#ay%RR0cL&%eGW z)1ntQ-(wSu(~J_m1jKJzehR{>L=guU-z@ebzqr=ZnrQ)I=RZS5wiu`72eTT_UHpL+ z{EPKg98uIvfp{;FqhH=JS^yLrThUZz}6Z&fon%33&t&dhgdA+8f!qF62t@W zQ{Xu@ZLdss!iP32P=#W)MET?<>7U+7SjAy69+LrF57_GtN`t~ zy_kvq7hqZ=6Zvl~T@#cp*z-+w>KX5)Z|}HEtX6?t$`6j#-o^L-_3zB*T=_9ixNxfd z#q6I^rFdIIiqM>(SK|+R*Cm7rG~>)8b&@|YG^Vr+aZ?qr3HiGMI*|OlWMvF(@&=kX zsJZz$v{Q^cPk^XJ*^D85;j2-*I}y3Z`T^t8Uu64 zqa-oK7j02OE50bOaLhhiZ7e-$-rgPpSDe7swQoz)@@1t)X@$>Pds@1Ps8!)KiNF2T z?Uy-QA7Yx8UnHuEp~tqauI03&nM8lSBPl^0gcH|NL>Eh5hDoP#%9!ZMNS4@O$LvG6 zHoA62MYfRb#Bt!meV7!Bf}ewu0p*f|J}{09;=FfQ7S zfyU1SqyA*U_L<5A;T$Z{{&_92Sj8JQ`zKA6-VGbs*_?Kr?&}L#ztIB~fC@te@7MDI zA-QL366UdQ-6i|-oCwtD{VGfa^Nog{Kzr!T&2Wc_7s2RL)e&eTb(AGuop2~Ci_!x_ z3}9mGKeSNz-x&yfUGG-^3P3IYqFQ9g5;qQwvDa}*0EixJB%Yz?mi0?`&wH&(Ks*hn ze^&ZVwW->0E^NA)u+lH3W;OA)jSxsGwcq}y7$$(?gp0e5AQGL22Y*F z|Gw(@(r(Xt!ogxePF3LPma^U5`FC=OF~2Z9m*OlyL`@fulmQ z8L`tD_fgE3;FVL=PwVsW)mLonW4)H>7b1+b%>+ad&h+TvIM%LZXmp^$Gs2@$QSi&z zD^5ochANAAaw|1k_Q1s2!f9`Q?B7{<`kQv~;bwQhRiN>**XeeQ;o|m73O^mib*99# z*68O8zOs59U?zZvVhr{~?{KL3@k`%FwaNVIVEH48%x}3l0Prip$XN!|5fot6RkgDC zYOMQJ&=mAsB0kwn;p8w<`(>aMG+>$4Xg@sg{#f(cN!__<-GZZ9xmPXrtt;RY_?kTB7`a=Lyd1Gbv3f!puH-M z!2-ZAEwMjP?%i?`1 zVEm=fhri@_WwGSd&)j6o3sk$&$dT+-p|SD{Y|iPNo^~HLsax-T*VO^Fch{y@%Hv@; zG~vXzXy>zmykf!|jL~q+%?gQXv|>(*QtSJVTOR698&%JgnVk?nQf&%(&vbs(@GxsM zhDM@?K2Vx~_={!XDw8pgZS*}s2~ZKVh(E3p4OaXjn0$-$zXML(2F$+j%PPd!B_xW@ zY_y^c#)JYC`aWzGrafNZ#!Apf;Qn;7{WIJkb%Mu;45ZeLqfB}pn%y%(PvQ>iuF~R7 z^i+;AySz`7T!M_PB5-C#|5&&!zKrH@1F8ZrBcYnw2D@vK?XW#CYCZ(u?E#>wHE_{n z09gSJns4AT!ZZ(6&nic)Y1F&{K_%)jLkt^CP{D9-3^`e^r>8z^`QiTd7W3a{*ZU^U z)B4s-Hko~}hs%^p$Z%Ij;K>3MAp>(5nE&~0Bc3R>kES_aQycr=}2M+@}tM$4d301+2A**`_$7;^m3Hw;c9@mX>lja;c9b+(7^hz*( zBfdRt3;-!OHV8=lhQdHOr)E_5~Bcw^t04#Ns{Zk;BX|jVMSEAb8gmM?KC}?5D`kk6rZ8<=J_@h4Uh`MXX-FMbFVAokp0_etuC|W(= zt-iPlKNH#dlVgDnYoTfGrshiBsv@RPz*$*xJ|@?7_Tj1du5^l_j?i2Q;>^a@G67RR zkOQF$WZTwYv0YoAS!WLN9KB5*VEMkzD_35|+#ZPc2EW(9*U87}VZr~bf*P^S4~XlO z%FhE^A=EKio8Q;*NkU-Rw+yb^bne$~2okAhXP$n;yniW@O4ey5 zdS*~r-dS28qRq^W(NB)jK@K$X5uG$Yg7EEef&3m+nHD2mP14>GTSWby?LhS$~5 z(TJLO?cc4Z#HNg`*F{(yM{e{(+0H0R=svl)Qae803uKsMk|++2IHv zTX)$&gXn(@?4p#KnLX4af2ec>2RSjl;@-->=li(aa`gQPr!YIgb%qEAz{!H>9T$52 zq^1IqGz2J+XCDrxFRy*7s$A!i8CO=??_>_>Ruf%U1pp|*k|#!oqY$2F&1|(cC&qi) zgIYnx^3axw+eifDAi9XrKE7?8mdx3Q(S+7OZ zgT9y4@CFF5`Q2rqTb0S~G*%7r<9HzMn7eomIm&WPkpkRHQhqH3{y_m<0kof8v-PG) zgqgwH_>AWMm)nR+BfHS$io4bEP4yCNZS!PWzommEWwSV1C@8SC;-!XDs z9}i@k_G<&+#FN&tMT&gch15kZqf%%pW%ivH{+q{Ll4)eDM9}o)kdjNN;WYPGiL*MC zP!=OushS1a3G%u(On@$ne{4hDl8$uhT7#9g??7U7vX_bA`Xi(pArM{^E zYT)bTYyD9@_qJ*y$QwxC)qY~L(!l*@!O-1;XtfW}(xY`PKJ8lpIbDl;^b^}rM)O`= z>LIkK)lw&p$`@ebAh>ss)^U3fJm4B_l~t1=Fx_t{B3M|`g#u@NEoyXzj$S_&z? zn5r5MEeQLo{+ISnozKj~!yrKWDo5`QleGo57OfyeQac6$9_I};=mFlq&uIjnCB#T2=D z7~lA}`%iBI5&UjYglw#Q9@NJC{Fs1)MM-bMxYFNlxxU^um$;T)`bPi&j4KeICAUvH z-ciu2WSA~n`2taEOad_;zRENn_E-FGU`q;etT_#F?Nga^D0OVz!@xFxsu-`{V#W71twU{Qj?Nsba1CqtFgzywA0Eq&GSyOG% z`rh`b3_hQ~Wzm;Pdh6D20*meaX3sVJHIlC|G#|mG_a_#|c7aO|9)_r#OY;yXE`OmpWANXSLZ2%B{!qks{t-wUgL+0VN&5`YwtJey#PBn|C0zNWxyy)0fapHn_rhuI!VE zONFn3LIX$qF3;iaPWe7b3&75T^+2-b`!gN9Ak^CaX1XX;Z`C@TH}6^9dW@1mq==bp z@9oZb?<|x*`w762{v&k8uLu6G(LrUcBnZcuxypcFHIDM>Rlub&Q2)tVquHoDJgX$= z6>(eR6nlOUeJCqAlX*t*6y40z({5@Hm_B`Qx)5(5=<{bWL-hsA2u_?eZOevY%Ro?$Cz+i=&?rQ8F=jfJ_Fz%NFjYOm}}_k%sfE(*KXwf>+Q<9 zHE*BuC+4zw1LA7H$?*NpEg5j0l2|S>_0hH{KF6NqfL~i5ob5r5fV2zP$%l*AqWX?% z70(YDfMwyQhRta^uV=6`V7u6wJB;0%PVH14i|;jarE^AFhAuC(lJDYK0lfA)h!b+$ zc9i||exYSrKo2BP$OZ^>(LD)}C~MwdkYS0)%3jYKuEfp?*jW*L0uoVqJR6X07uKmP zu6uK2U4Z&#dCfsHzd`S9bLgn66Ej%8#p$e434c0VUIHx*a747mQXsTi{>imzKVPqb z7b16G^3!)Ln1;*I!qdMrz;GWUbbMvHy5iUWrv^lEg5#S8Y<~id(n*(DfN*$3zF}BP z^{ucRhvroKH6*d4IIdG80bL91TzfLhy4ED$@PmsO*kz2YBA%Mlq(lW3K0J0gshXp0 z<4IY(MR*Zo9i;Fq@IQ7H7fT%5e2d5+iCS2qZWia7{sfy`Dm<7KKzC+PFtjU*c2mZ6 z?`TF=R{|Jo2O0o6;r(T-0MY{$X-XnE*u=gS-iJKjK){%gB%RXrOv5Xc0{5UeM>gD5{%tb>_yz5sBM zd$s^ZYjQsuCy2F?Ra7Q%O9(Jj8?Y-FWCH-bXAEArzXR>M+B#TV!n+0ZbXMG*u=9~I zq>v2(=ch16sRvQRIaf~Ha$n;6u%8t~De@b#Q>ZQce~1PV@&B7b@1`ea-nGG9rzAKU z3}VB122tz;i^(%!bZlWby|s!Ek(UI?;td$SvR7Y9)^BI6)f+{xO@H6`i!oOUPr#(y zbWb=eNC7@m`QWs#=I$#-C~`)%0jEt6v+K3B0zRhoIeWUA+S{4!bweU{ z3-YsR01Bp380S>(>+J`Vu=kbquF9j+v}z2GM`B-G`<6N8UREsx9l!$Vg0^b*>C0oADCbb~FHQ|+nP1Ba;t_n5!Xhp#XX zg{3#-8ioV(WXbv;k`Aq!{wt?#9a#s#dCH0o?8FFl>j)tMO~9O(~`SpnCl;_XKxsvUm>z#82e7!_c4s%sErG z32td+ErDsZWxuc1?p(wCHD>sS&AtIZqg`t>z`W4S=i;`syCi>AjQt}AJXT>j(A}=uvT?c?lhps`HW>I8!$|r z%?5&Z-){V79;`8v{zff#loSZEV;+{FKIT$vfJ9=%gEj67kh=eEVpFXi2?&`wxL$-s z9GcYPubtH%>rpsq_o{wYySwJWm4BUpl&=l6C)LsEWGbz> z_}!cNXZs7%8#e@%sbWAgXpsF-b>$Mah!)saSwN&d0GGymxSQn>ba|_dSZxdgYRs=j z4gowC&j;po4+ucORmqz;Q^6|cFAE2-w7A!7(mpC*k&T^g|0ujBu%ZWZ9ZEB0`JOh@ zv%Dvf>^U_og4+{u`w$cd`~UfMO$Po4X`Al`xx}yv1J0wSo1$s4J-bGf-$-2>P--Qb zb*ghH;2{C!Jt|P6c7Np;`}h*btGVrEXZ@aHQ_r^D=)v@ujuQ2fcRlGu3c;e~DUhFd zH21w6lJp^>7nlydFU*(xCLr-7ZU4u=Kg`4NgK?V~A1aRQ#UaQ|b{_z$_e{Uuk?2e( zs3=kfx5!;7K)fQ3_KVoE%7D;ep5s3gEKODD00)=GIv5>E>o0VX9ml4m{@X%4Tw0L= zdu9k=pJ)-iP(bN`H*c=(R5)}SwdSv0p3KhpyTVu)I3j2slYoLb@ct7@ujyjL{03bjx78%LQduYYqR)lzYNyW7d=H-7s}sIX8lQ4Ta9Cjd}9RqypA(+3)f z1-zTWyCp@#C*R*N3YVY7eJ<(m))cK>&o27$Z|l&YmHj;v`|vYXD6%{@Ak*w~v#`@o zIP>fNtqV3W(BxS1a1`jv#r1$`0XCoVM;U`7U0E|xDn1{#s2@!@gKi~LMaRoa6hiv5 zLTD6EiZK}D95%xBrUY6?eHjbZP6kK-Qvs9`GK9i>AN_IZcMk+l!}zju#x-t*_c;6!9UosXD@>el9#`5ezzwEPzuP1VKgyz>A~4anH| z23m%Joh^xRv|wTmO@wK<(-NuTmA=H1f5&GmlFIc5_k)^%t z(@nf9rxrP&h=-JAhCn0*`5G3;-KBPomfLZL^U3JQ(p?7BQ{34R&usd3ee(JQcBo#I zw7%3V+XS0;Lzv4-ynZ$CO&-dc?tzQWO;UGVRN8Uozi7u6D=iQv_YSf}6VVOIA@IizgA6dPaTGokc<)(Y%tR6TJO+2IL= z+i~JMXWPDW^NDOB);JLxqV%KWi@fgA;S1<(a*(pU+0U=uROoh!@p6&yzCe;h5y&(^ zN5+cvjr-c-8e3~dwwBEW9~X)bUHmvs%M(P;t|n`N0ivW(l?Y&*>LS zJp1^CUc~q91D4_pK4Q0mY2gDN>2vbtiBBqPJ?`S75AkB|T|YOxX=&mJ5Qfym6qp&v zbe*BAqH`B4A+wtm4Ac^LbIplAh~8Zdi$Prfa%u@USo@E#Q;nh|64MH`vNmqqi+vRQ zou@#TAy!GKID^||%p8xTKQHQX)fW{h-cZi*Fu*eXU|jMz`_P2QuQ7i_xZDZY-wa=g ze4!|sGj*72=%ugR{x0HoGswbxYJJz%o?7pRI9F9YyZ1ltk*U0Vk?ERKOhs22Xy4`W8w;+20#sKQQRluWsWTjQ6HOX5R;2^RpnPKAHn#bxGE;zVysDhztk?GX z`1T~I^6J88ebVuMHe1J44fD<7E#Kj{Sua*54Nvojv*HGbcw7Fak8%f&R5k`ym*dN& z(663Pec{8&W;uS1S&M}nRW4J6!kE0Lt?DnQUXP`ub{4kGDQV@LOqf2}<2?@hi+u2Q z9Ud3BN2YHS{)p1&DO@31kGqeoR-pZgC7g0aBT(mL2}=fbi8J;gT`d;?{6EY=nvQ_)K1}1UmpFX$vJ*bE&A+&#gsXxxahHLF z6o91gMoLXV;JkvyufBEv()JtIGR$RwGvAQ?OAH$_@klH7kQ@LQk{q{Bf1py92{i?QP$!VT~Emr3cBWYu+U0kE9p_ z-#iePpet)REw?_9<1@LERnNugygO9;o7jAI$F#sr-k8JPb?|vj@O1giVt9a7YsPse z48s1nhu&D>g-D;Bxy}&f@E=jcJuc16RB&6JJl=S$pkdY^Nn$fDMhXeM=Nk54&fpcJ zow7#2ua-s5dLzYg``G7VgL%G_-hP?g<|^a+@VIej{c!ttsADzksoP1|7<&J`4TANHX?<3Y=jR6#N}mo8t9$0(jIB zk(KwRcht(9C#@#=8xfXR8GMc80(u`^KW1&_$@U4FdeQjZd$7^?w-dClvlCllQcMNr zaWiADsr(Qd5{jjQjs?Cq(lPLg!$_0f8XBc}5~2I0s?gz&05+Z^1-=`K041 zpYO2dq+=U;94N7U?9lBpf4(v?9D^f`rKktsJR>#smrxgb@S+vI<>OYvkV6VV7Axg0 z6ZDtjX^+L#5fzfaUGwj7zK&HQ=$wH~ROB8a${5o0R;1F7?<2DaR$BiCz*=kjD5-QSJOE$`$TWcM9+0o_VR7fQ)96{#a zdgC+tk%-j|S`lbkp`fVM5m*Z)S!>MBj1{O3^*u(P05z(AzsnMy?EQiE1mk3rroI zjVIfkL`at{q`Gat$g?|s-Bv|Ici0Z9ni*or1n_(6-lF6R`@uYhU13bYI~T#VtB>UvWNC-R9MqO3^k0?2k#~2$C zsxt6DTH8&~8_v^p4;rZG>3X(Z6O_v!?W~!0c@_>AsHl+OwBOBq#UXKbTDt6ibE|&2 z-*{pP=YcL2FyqF?!#kO@RrGdy1|X$Nm7BT6RFB^3VvHK_(`El-Y48^&apbTzNB?*T z*Mh;q()^wJN4{FOgw?FJZi$r6`rq&0&MBzIA!eiGCrj*36b(ot(pPengE(I5ww!0x ze#b8q%?@4lF=PFZ`Yp~tY$@9I2y5tLs>%o&y?dfsLg3?=|D)^NmgquO z=@+&PtMz8IRv#M-^)@!h4Jnpx_3lrvi2scPtmZPNIz8J!!a;$3dkY8acv4XJ`2fyA zSe1=6+H977D3`(KsQoY3ej1|19Il&pw3*@dCg=|rYLv&`&6LzZ6!|sy?-irX!Z3WP zkm~T1&REzQOvPl81Uv8HVbzm=y39+t`PJ*Aze+j zqmqWiV<`=zp9hJLeiB-IS-Pi+?;;WkcQ!jEQY2<% zmP&JjLv&88x@0P^dg>T5bR|@gnr*_%whfQrYx~v^=GN_wWbY*Z{hpG)17pQ`hP!rI z`pcDeHnEUU$0=d_KFhH`Rw;%n1y7bV^yVWaxkk%B8MrczfQr;+Ds``d~3WZ((H znCUi;F`u5tT-xCdRG=L`ivx^eVl&1f3+*RKi6KcGwA%B8LW#~8bPS+~6ZW|u(r#L1 zaMpjf*5EI&q2s?0YSqu~jsb(;!YQ3!q>5Gf{Ua zCNasoHHIqpM{EU(k7kU^YW|ZVH)9(mqxrJ(hmYlbCDcTqmz!t`dAyN4QU+(nMZ?p=tpS3YK*7lS{q-G6ziX3&n0poL z68e05m+oM+?^={0e$?P{c%JQHz<`Z{v2-`j<>C%0r|dd;oC=-BQ!!yjUVK&+f`+=d zDM}*U^NhHGo{r%Y4ikFgXg0a7c=KeVYj^%yVX0qJMJ~IE$+HjG3v}6x&<{_vaTw8M z!SjyS@3ggyVF6dB8m(Wsa_eF67f2gcx2HSjUeivo`aRTzz;w8c(=-l}{b}bJGMX>z zSh`Ml_Oc*_-}MSin2OGEG;U`7Z2SJFm@On#wdu>}_D7h+1AI$8%t?PB&p`C=;Xe7F zE%oFk@w1rDqbBrtPMPiIcjD4{pr+66ctu?VVfTPQ5{HE0N1Gh*D?O21N}r2`QMZ@U z;`NuUv{|P|a>r}J zh+|E~9x+YNpW$?xqPB5nSs1?0JMWsulvnP3pqQ0nKM@ABf(j2CI_^gnrnqCtoRyB}_qUFY zSt~A5uCq$+Hn$4}Oh0}Rv@bYU=bkMoiS(aNOW6Nz`Xcb`J+|cbo%_#m(t%tBryc6iTiAWoLvtpCQy!kXI@v47_2S@LnVhTRV$AMdc^Bn3A?~d7`Ubmr(WCZNgQR4&~n`5(3m3*`H%i z9*mii?4!C0w(T^Fv4cu}%`GHl+#R*L-#f48kDE<>m&kl5*3fTS_f;QDUNLai#guu3 ztEKlKDQV2lgCfxzHtIj`_pa;b(S&y#^0<2Fpt|_K#+%#T$Du4ttfXWv=6ihXaW1<{ z;!ksC)tiN#QxYT+G~YNk7sksnmcrWQPg1CMq&Bqw8BFBI6du3i&d@s%B=(D2cvU;L z$~yylj&sd*^x4nH;HTAsQ?;Ci-NT(TH4YUW>@7+TJ%d4|L?y9-hySP%g{qO{04Y=Q zMr4BGHT)*2L2&YS_qeGJy*FBlp!qJ%NKU-~`qXz!Dl}8vKLq3{!ef{`y4tfRpSj!n z3Hr&0&Rx_b3Q7`8X+IO+cb6IeuQS{?j)k4Y(kak<|Cb#STZ@}A4AmGN-=??uq zc0iY^C|}Ht0oP@nOzMg|w(g;Qn2H5wbB{S^$=eQtpge~|W9ge;;APu56bi98QQllh zZaLeE6t}U6lu>n77km4z-)Stz8AHrnXm5V$drD)qkhrqEjN(+t1m zkG5d&l^MVIt-m1n$Nw(1_#v8wF{ME_3sbozQE*x3-=?aHd1I&%YmOkr>oq`fh_88<`R`2MJruNDxl$lnm^3c@epNGxO+Y{W_*Ujh_wpQ7xWi$-DTo*e-O2P`!c&TW!xB@Xqtfz~ zwYEC>28;Pp@?+Cca?$(Y*8aNQY^dMyv^kj)wyA{sprHAJpae$?V=&=)!~fJF#+BGz zo=BX-Fv}vuUh(T}dM7d)DM(gni;_-G%UsN&xbPW=fCWC2x=|C%-)w_R*?sNt-kGTf z%eu~<$Q&0rF0wG|?^gq{$(pqyf>*w^Eq~fCFH&zRkvu?(01}7sYY!()#6!eq)ULmx z*=|>z2KyabNv&?|E_=EHe+76=^GDE$#?m#yJAEuMbWe=<5hCl+M%}$HXxd!yJ1)X( z=Vp?~M|a8fjgI}-wvUxpU^Y;>XG-|(UK2feMM$D3Ij&{bo9pLATw}ZUaIV)Y!UaPD z?&ca!lYcs)Zx*@}8_WBG8pry2BBW05+hs7<_NRs%7e-JJyQ?wqJLgPqlOcz(u5RhY zg^j4r(=gjh{h-w$3VpQG0hqmB{cWd&CO2buQ>WNeR`!VC?Bo8oq&QbRQ^tMPSvk9& zC#eUup8L^0x~@ZW?f569Q)XM6-8#^XF$QWlOx4!n01}-f_*qaephsQgzoN2b(oDhJ zrNt*}D-KJy)>#H38#PV@VcBBiYAGkPobVf&QCgi^KCj4ukAHKn%PBsaqGO2rTjGiP zuCKGmbxM>(>N4X~RArKjV#rt<^b6Qa@BX3ORoT6wEUGHC(}7ZYip3)pPQ$NQbUKV* z#AMMuwSlZEk%UEWaweEsTZ`H|TW`2@%H99HeyDa%JNiT1pA*}5EhsI$j%#ouN!{V; zdM}<#DXvzi-l=lsQ#Pzei?1jU#zV-T%S=Tv)ty?4{W-nChU&nPnnT=OVU#ccQfU>A zxTkb~?E~$@3nIG-<$FeflsxwBH8tY=n;CeU+;sguv522_yc?mW70iK_vN~;o2F?MN z=sGv?t=G8ndSfv0Ub9-PW)?CNjf`#l5lPa>4{2_RSi;j;5wW%G$HDrt2Dx${X%5Sf zP!cnM8c7%F6H*$|1*%8UD-UEt)&Nl?QzX`?ueTS6qF*a4>(F}9AuA2~ z#y+l=9$X2HU!51yUC6Qj`W@(#tQc5$=F0S8G>&TPw{KY*(%O$44Uy|y4R12Uee)P` z2w$9iBkx!PKx6$qTRvc1`)RI0^_Pjji{Iy_Mw>Z$T_dg`T3-Y=yY*(cL3YgF*4o5R zD{!KZLLce0(z&zQ>Ha${r)UM)8PH#OdaL0BmK1(MBHlOE4Hl860)9tnX9F*vYe}<> z$x#{pLI#(y)cq&LPv{Z_xC#@IY6^k+Wo?0P=-*$&%;gY+K|S#ONFEIG92Ps>{@t*D zv{71GpnVN!T@=ARscRWR(R4?X9_E%=6XMN7jn>`0YYRCVQ6s-DZQUtFL2c)v4>m zb57pKM}Swz0MS|Q;pHkpZth*yLd#jZ&5Z5*f{1Hu%IyO!boEv3>nhLBdWNtF)u7g6 zgN5ary(p{L@D&A29YMRAove|+Y<^W&6CDs8Ppw2ru@iVFQ>mE2kYp=KenZQwfkq50xE};@J#Z#G z+TBjZj%|Gj`AyiWE-;e#!?fuzm>6-UI7Kk*>0PB6`$kb2Tf)DI;<{rFZ|a#nP3Km$ zf|8M$(Z@x<+mWwDov`(@PUb=9%ec!qf-w7)=Jqk@X9<^Um>$^`u4y4}*TLac3j;%Z zJvx{aWVhvDKYE)|>xMc>7UU7|(*;5v-1r_&J=ne?Q&<0pVf(;(KWjUyd^?i=&fcYL zz`ahpL#)h|z!cJYj(Ko=-9jP|e@9h^&|orL5PWPkLlUnkBU^2A#!T~8{U|7-l|_@K zzxlXgyqf7hpb0tpNEvAk`+O9xq}Raj)5De?_5pk<8QgZwDQW)ekB)_$-5y3YvOcZw&1?dZoV%-p zvMKfNa@e)+T~?-n&N878-P**;xppoqZfHMGk$3>*SY=PMGtTvM!X>g#|7qOLBv~9N zZx+M^d6-=yeLjlL(3;RvetcKJ zV$9$A^mX0#SWZ~_KVxBLtme}|)pw4gdj%>dwYd zuayX02I4_S*%ltkTiwe%E<|9z+(D&G2nr{Fd;48@+d}r=r>`Q?R?PuSB*R3y(Ij?8 z_HE3HTSNH;y!c#hy0M_-8A&}M(Ok`LyzM;kmXHhOQ`b> zkimbHlm5!bDECz-v(p`*DHtm7XH(%#%f|->T8|y7z$>(YPI5s+7 zHgxI(-%3nzrYY>Cn!E|=jD^NYVx!2&Hj}LPd2)Na=TH^S>SBsCt~dWxud43Ykv%!> z#nAX*a2AY{*s)>Ps)x*{^=uTEJq zzF98%wKWzAhKtYfq$9kCVRNPaarK-0kZwS3y98fG;3S5Os-cBXoPSZY6!~+3Wnuel z%{@KGqrGhc1An{i&FE@lJLImX!`_h2qt#YB8$ebwGGw3_#uEO|Jv$NEA#`;U8wJ3_ zI-d(<7=(P!@$031q+MymXcZ!qX1#z=CY?xp1B1C9LG!t{SQl3R;^c#MUHa1rgW+9q_Wl zRJ}G#y9^#x01x}}7EF!z4ia3g~ zcA!jK;^L=8?qKzo(O72jhhZhKR}8LjdV^UDzn?W*IgNm^p1gV$GNeQkFko;pJ;UD@ zIeZ>tZSSA6mmnhiebbl5^+MQk>$!qD`4Wa)puuk~XKcscH|i%GNv;2Dt%uU7VTiU>c2kH-moaki!k?I(&!h2Pe1`n&ZF7OWZwvbZcIyZ9Me zUe9;>+a#v6Ay zC=Ps;fn4Xy1byD<1hbSwOS$5xuEis6Vcpe7+L0uLu7r<_DI(yB)H;mT^1? z(K7^9H~E?~TZ#lv_^Q9%^M_T}r>EoA?M)}!b~bhqznxy{(vwx%k7UkEmo(5%);QBGHr6;Wes4c3GAnyciMD-+cRUspv} zCgI<*Z9UctVWnAOo?Z_s)ODVAM_pef5JgA(p|QPRxe$H_`5yga5baN>PL(>?5RNyI zOtvK32TfDvb99TGd5 z15aujJ(Uss*~a>7err8 zZO%H)kFh6f(I_s27f~S&`Zz@&ytr5+mzq3OcsO-6gIVq<2u*RhU*XGao}w~8u}D#& z?2?02kmJQx*hU*UJEKqsSsw1ne^FJWLM3vp`w^G7B~HK-x(+eNjR#?9L)Ub8B=%^+ z3{L*obnAk|JPxh82)*=xVPQqNgl|$jFJUaSq#CN9yxJsDt+QyYne=9cC`E0r8xN|!4tjhQ zEf09fCrj3U!;^n&|9>awxvX ze-~p|sXOQ%Q ziF!jl(;57rU2}y{N_aCmY4OWp%-ZpjVPbY`tmN%K#=No&kV>I+?Jtm}`)MuO<_9R{ z@ub=@-3I{!Wz0rVg;f5pwTffYIqTyS~%qQ!g(QcRK320=Ou!!Z)pl+ zVH>qzMZFAhTdRb)yvV9qciOIzA?=T^5B@eJ+%GvYa)OtxI>X=3iLKx9QXCZP5BsW$ z*$=&*iIq)y`{SArXeOAKB(iHQ`rkTRW0Hj?%tUiN7#+anCplvoIZhlXY#d(ep3e~f z>E$3HX?7eAvvN4HGzF~*-PY7f{nFlgO)XnQBA!Z_O}L?qG1YoL9vvEQA^A~3%4_uC zgo9R*wmB$ zeF~d^tq^e`!==g4RW!TR{2~;M?j?2*hS~IuGW(N#%yQ~HdmQ#*UE= znWYrUIA`1Ql@+dEUfZiV64#lh5GIboKKNnhYiPQ-uDXq3F$t~7x2Gw z_oI&!`}n|$K7GT)>5^-^8G`|ccH7ZdffR1f)aq6qgCl}IvTWymR4pC{RTvrm3$mC# zzB0>@)Kt3HF?h-Did$rT&r_WMsH16WkVoP*!Z@Re(doV%_Lm5CqsT`+I zVZ2;_=C9t&!Pfvg>!$QoVK(}6_P!u7W5iQBnond;Ze=H1>-A{;t@;J6jY(m|Um%UN zFhbOL{LRpcOh0Gjb0Z+OIl@B3AVOq8TQ z_arP?#934GHbmFQeJ8=X!QkZKYOdgwJ=IOQk)W&he4A+fbYB$11Kv^I=UgjvC}Yp^ z+xIpvvIBNhjf^raJdC1uGfpq{(aX>8Pn%mGZcjHW;}aix3I)mCjeoVh+m0=E_afqq z3vY4OsCf;DOtC(#Uc)5K-{sXz3F=2ve}o|QGSVu&MpE!i^jYxcU*_`|?K4XT`~jOb z@GWZBife)Z?#m}W@LxeFbhXn&Whw5L{_RaRbI}YDqVhe|6Vjzr14`r^J7`%U1Mkhn zgIVL&B8!X5;Qd}<@v|%F#KkX$4^HD|*@e)CNK+*j^Es;0i-CnH0`iAHIqh!T^X2uN z@f9ziN^%PdbElGP?CNh}Ipdk42c{stZaCs~2Lq@nLLB6)UmV(psD7^Y-vE+b$I?=c zB8BzoyBWzWOUb5kJzsrJKNHTnZ@=OQ_ITXP7Y57II!E??Y$_8xoOJIi#m!q^N6bz6 zaPK<5DgVI%quuXSQ^@H2l0B!gvZ>8!fa#t{r|mi0?cuJKPb6E{*sE8seh%{{`j!0A za-Q;LEQ!XJ{Dx5xFJLTeAVs(AL^rH_U(*~G051?!A>jcdA&CpmDN}e(Y4EPjDJUea zWn_o(1d2qN{rXL&MWodkx{-v(+u0g_UMIh24m)t92F>IVG=R8}gO&6y=ARa7hSqNQ zl$N9)9VRpi->(F zP83uGWW(y5fugh08)vcRrh{2(RSRS~FaC zBQXy3g+8vkH@4hxk(i*zGnF+9`ei1DAn9)VZ6otUyoUCr5(lsIS@WFmY^g{Ly@U{a z(fpjd=k_y zVWX8g7&17$$8|#rTet3V!Z045NdQg1gcMWwxZ41v>TG>*KH5P=WdZpMmY!7gqSgr3 z)nu&@XUlbs2XX82#ItaRpx01QOP(Y9GURBqsjw#1Jy~cBI9lqwSdF>JiZ)4g52_)K zuv>EzX;Y_be_9e+Ts36FCl#1)TOX>t@(P*WBbTDSSytf5psTO2Z(Ou}XKZi9Zji5q zB`X=0HU-3OiXW?`Ntq78vIOO7EVvc3;Ll0`9c2nv;Zg>C++t|7-d2^JPzrY`7IE@- z^%|}(H@e$zA4CvkR&94tPnU}#UqhYW#Hg-gXsR|mX`#ig{g?`u)ZQI`;mmwLT5)bV zx+7?2zHq+1di$%|DD40=(z5FaC2Q>@4nCZkHO3~4b?y?5e{$kotqjx(n(|+&IINbw zT0iR^xHgrCCQ_s z3Z1zJd;C|mFNR0bd*kZX>lufl?ft@Fa_*oVbbia&H)cpQSI{Lh4z#pWf?4}O}Z2;sOvK88J^T?iq7EXF*((y0+H1jo0^iBa2UMewG5KB z__RxN^qt%+VgC?LFp>Cy*ZTbVP!DYCQ$;BPqVB?PomgUGggUmIe|TRmrc0w^x+>dZ z3>0IwRndS-Ss|DsULR%csw(`$)>lA#8$Jf!<5sl8UiuN;`}mn%l5W@cFuWVouxMbz7g=swYx5{?<3y{6EtWXV@vX zLuu_@VTX~r;85|IJ=x+Ajb?G?Z`4aWp5x=rWvb3?@sUsX$k;)j6w3?yat;>r4;O@p9TpD%o+YMW9 ztD=soc+Wc+jFTH+yYgFLpa?CaWx#*u`6SFiwYY(r8mh2c21=>T6Yvu|Y+Z<)p!1~n z11!oIq72OVkB|1*wZcm(oe@!}ki?qbyHbL(<8Mm%wfTI^-xev6IMLZ| zlawsCWtpJ?y*TJGf!k$So@~UyF2fjeBI!K(&XRh-^T^fP{tZ1+6LBnFi%WE@ zPG(}39(ZxrtIVVBNX=^(^bN3SpASODVoL_wW%AeeGzr-U34rv$xC7Cd1%VExgzhb) z(M`AQTSMVD2FAz`J?XmJ8PkmAc}cqE(PuLG=UjXd1Yb?%p)qLyvMN7$m94fI#sLn6 zptuSc%BOPb;6~r9)`c5+dQ$h>vjtu6?Fu62i<8vFux!it&GD3ujENug1Ma1z;@EoO z^Z9mEn;0hO%RRQ$v(f&Ygjkgs`Ien^*lLHFX(!dW2^Vl%NM)yhj+Jt8d?8MHN4Ti> zn=w&wpW$`}$^1@J6X$E^yFv<*+R&gC2$!g%8Pz3zeN-P4)cv%?{$l@gj%^%g;NIv8=K zw;a1aP|)09NYTvwXH6!q)CLO9Y_5N;7Q-=zyCiH9_eOjFG*il}+`08ffbr@#VIh-% z8NOILvwAAODPru`F#8-y)+kYZ*=y3i&cfx*$nUS8O6-u6Gg^RVJClE%c8Z89 zv&^T`r`&1km$j!{KHL3~-F*R4YlaJX*Ad4 zWcf}aH@-qr&;0?KftlV)ob-w=+K<-;rUUIDPas4( zbF5`mFD)k)j`Q=Knxpr6cZm%`iTGk1z#d?|ELn$+ketjPk6rKMVRdK5d65$|%fH6% z<*)N>9fA2$tKJ+JEVYI{wvs7?QfX091&Mb(1kAhznT$ieCH9h%>NT(JOc#X?aw;%D zJ1HoyM2N)HOene5ms@k1MFBqya73{5=vOJyYMx5-gR&Q$hVk_ZUJy1OJ0X%~t)7WB z8;wNUSALtofp8`(RAgyLyogu0@T<(x#^#oRN~6KcrDO@+U8{8UWvgM83HFKZGs&1i zzJvC}^>X%l3nF=u;1=@Ib^xI~LEsv1(XOGwxDqr%IdYvramF;}a)B z6u;42uzL!~+KaIKdl|14s!cvvN0LiY2xq)GaBHcotmd{d+i6^EjK-ExO43L+Ijz^8 zBkQ+Rfcn1f8)@vE{>Y>FQ%Je%oss3E0cAWl{u$?amIZFa$hQi56KAV@k8x>X;zr)+ zyOZ(4-9tR=RR+|s1D}@R@!D!8{X^;LqUe*lhN*e|>A}Rgs<3R59~P`iup!H{{)dcl z<#v5lp8KB=-WXZIC4K+n`NL$nt4)-l-#rUpS}~b47B@ckOAPa~R4ChL1Olq@HUZjv zE(^Q6QMivweJ8p#m;F`CSu~0a?AK9^WmO)B6*GPU`44`{*cW|)U;pfN@?KcTvmC+< zSKbT>{Xx>Zswpe=q98Th{)MRNq11lf;z*HP5f1jPcN5rk>zz2aVtqTxs;<{Rj5RJ4 zY8tp>ip@>sH~0yO=i>Ua9Jf*D-ZFRkh%1p;xcofYYoG+sM5I#A=IYw^6_1_NmaUvy zDKxRH03cnXO^7ypnJlKJYQd`xp7`@NoX9IixX?hU6&et2S^i9qv-yIo!=F~ zx-+bo9d+0)oxBccHM-6pr?)zM$8Ba7V#?Eo*;a%Z-0#pWGeO0Ky@Ngmy;^c=zF9vV z{iVORC)qK~BO{T~(lOgjKm>J{3zllp{kkfp#YE22x^vv1C|?+5gOd^~lBOFvcV;Oe zF{wA98VA?^=a@i1MP+TrAwb~8SOD&zp@V$G&c2XEZp{E_!h=g+LfzbiQ-On{d*6RxpJ+nR{1%GE%j}S4+EHvBU z(Y;J7UqI>3=P-Wu7N!WP%-hT0lu)AQ-ILVb>q0qjuTI17pPC<5E4jJ4cUPhrmsW+jy3^aM!N5Oi_bl>#=tO zVMt*P`CBJ=BVOBd1(=17jLQI0hWq2jLavqHf+U_8#NQ5QyXuJ~B6_VTfm^8>Pd|cl zaHUE%iH`a*^3?S5g)7~AoxQh!2v=2FnbuHRS$MC#H*??hrzN6yyycw37_UmlUF;n> zM1Xe!=@{8@<@azwsdvVCf`(EZJ!;sX@LjD}h5^Ou-mXPi>{1YPZ2aee+?X@Q)kjsz zw(I9PwO~oX2YE>e%hFhBd415ZRm?7BPpX;MQ}?=Y2zJkUT>pmMYk{z!rVV*j+jWsw z`I2Vp(mrzk74EJ`tsAFiBg4kH$}1xHb#&WC+}xTj2d#t1A0r#_b+b=nh6>O~ehc|X zGyt!VPHE`umC!GGbV38Qu?vF9g>=<(8+@@s!bKVT0$q9TL+aup0Ih` zlh?ogq-wt-52~m;s~q$8-Z^c0a5-rDKBYbsxwj4K%rl>Bo7pUZQdPl{F73tNU(<#s z5=st<27WsRSGE|=!H!*;@}mw;X)ah;NkkwLO5D8bUlv(C2(kz)FqzNs=bPNO z=tY6X`^yGAHrCAhs(M6+aPXA50I4slc!Q6n5oRSW2sr*97o z{qo)x{_JGt+xb1Zd#A=}w@lS}&Ir!n^CY`rwkR0LX;3BW{+#SY5#2D(px6OTwt9~i z1?yrdFvc-TJYUSsq=>rl@Y4+*D$XeA3GDEVDEP=-fT}H_+*;{X{evR}_<8ureCml? zGB5%;0G={|m#9QO<<$P^yD&>4uKQ9);LqT!m&|S+;q!DgEp*O(&w!hWH`YW%Qe=|g z;PN-8mcxf_eninj_ZpnVhfO&!_JB)Qo{3+qtGV}SeHeKsOuFm#6c#c&gIzMQpe$

BF-V-Sp~fhu-RAjGV-;VB5IN0XDON=a4sk2pSXIOVSaL} zCkl#)QoxOG(UUtiPCCF0oJHqdFvo%Mge|$KtXONVfq;rGV zP&bvk)pm`b1p={v06~lH*|qj@a`>;~osBeQeMT#_d0YKB?s!M~uY|MdJv=Z_iklAO zdaA4yvZk(_$7zA#9q(o$0J@nZP&gYHeyhlgQ+RC7ZZN$;OOE+Jlpf7g;B zx@`Wr6HFain|7_xterEvLHg=RUT7_6H$HHs)OIUi9p$ky`7H{Je!`!?TwzfAy?pmF zo?^)5)H8(z-L%sOvD=+iBCI-`&GV#m_IRLA2wuD%l4pkIicaG^ud&|B@8G@e(Qtdd=Z6|TvPlUt?@vkWbL-h8K@WIR#>&djWWK4gY&tUr@sHmW1-{19_ zzmJye;497K;KGTLQL-;SW6u$pa6CG**s<$$Qz6hjAlzM!fh#Mf3SqfhRAqF_CeHlG z-DMln=9xa>08F?(*V9jwS~w;QsM}T<-0^kK?wnY5h+JTN`tAQVX+kFHYZaj#t&&t^XAR%j3p=Yw?9DGO>Z-Su9qrB+ht1n#++e%7s z?=K4Y2GT{Q<0QW3q~QVsAO@qxbg*7Il9(iqSO(|N`1zG|_uZv*!ub87dSo=D)QXh- z73a@QlhK;~VJ99%u~l>ckGpqwpS`J=8pai8XTUn5m87<8vJo8_tv?f`50pmcEr4$_ zw=C)g7ghmfug+098RYRHfq3GOStxU@KDbrza0jsccMAcihaaGNXi2-1&**KJGqdOG zmJ@)lcY~Gj+lN}xCo|V$byqC2$8BiZ$ncJmboyw1F;OG;fzsyQk}$(m-BkVV1!?LF zF4YHv#iYg%R9HSdd5q@ORqqpZ;^YRUqb-sM2s*T4bBM)VZ)9z_=5a;;^&kNx^8Z}d z3Wo8(gj?onUXXj}dI?2IO#XV_Tucg?&JXyvHzs(jZ^vH9VS{DL*<^+gyWrqAarqwYoqHx5XTcN7g_^wM* zk7B4EhKZ>Va0coxXJJ9Wk*ORgu0)7#wKw650hRUKj?_F}8nuS^B7(FzQ~&WaU&Lo7 zb(ww85+%%#h$*5$U46ItygNPyW*{0HXsi3>y>BS;sHnZ|eQ;)OIBW??#9#;T&S^rw z9141=wom-;$Nz75->;SGrd@>tXW);Mv`s!?4&2HYpG56;QQbRVwA@ebU*2uz>RWqZ z?Gc3g1A(3eilwF05~#Myzf*p43V*L2AMkzc1yeLy3~U?tIsmzO3=eoTVG7lv${Gc8 zDOi4htreaMGnqth+f{@?oDvgL()a^CDYSX$d*;+izI!LNaCCd^U6V=2w%w9FujV00 z{}p=}H>h{qd!PiZX@6Dq)$1}x2LiJ(zY=?D4h*?ewbPj_siD6A^*WLN^EHwlT;{tL z@Araw(-}~=pA6cT4ectHRZxE6Co_Aa>0?|J>?$dV(p2Y-Y_iaVo$Gn#bi1D945U8d zN<8444T9>Mk}!vN8qgjQpn`>EcPKr7x$;=9*g5HnoQXb9Mmo_HHL zDqyfHi8I6tIf z@%~Ee;GD}%}%SeA%0 z&%bs%ut~fAWtV?^`Uo*{!CXc42-j_ggo!yFY-2i^p-8zZVphR(d1OT4+4nz3)Vv z=yyHyDur>BdHh!;fsjqh#rfxKyn?rp0|939sQ>F3MDjtBan7{*^RPdyOo>?LWV^gT zpZ)kQJ;z_%!3_zIzwKiiuB+@fH!-;v`Lk#Eg`>;O*)=kEi6k^_h$2}Ie-^n5qrzRQ zW1a}Qfj?Y(+YDpj0?nXD4_jwHQ6xlSmJLZ2%(eaLc7jU&O?iFZY}WoJ*r%a=`gn4z zY4_Vljz*-)X8_f}E17?$U6sxCzMa>ho-=JW2tF%Ty}}ss2zWed1)WS(NUH3<)wHpY zn?Y+P;2pUxQbyVtg*-*a=Yb#a?#DIzVP;5E%!Q$n^zEEPg0t?f69WnRq<_u#wl*i5 zuLyj&wMW2Xl);@G*x|5g;z=8-S(1J__BD5-HP7N!UAph@Q#T;$2jb%um5UsKo{-Wh|{MtYap(f0%&-x1@`H_zkr3ACPq zSG*f~R;>*=I>lVPz69n_O$Z}|4gy!5PP#WWldNuc_%L{XS80LNa$9S{&r-{{d|r=h ziy&!CdV7AX$|JTiOHTBVb}{WQ-8h2J2At#?(%*CDCi$IG9&G4MG`rmwV`|;)?!e6= z_p3F!=K;UWYX_GlQDlvHj6Mi4tJhrw!l&QN<299eW7YJ;eRmFc?WZe`)Vza9N?99u zmh#_Hb~&AY^4Eu_3~2fZCY-?S>5gCj>(4PVdL4op@heu z%vqac?Ai4FRJO`Cm|++G;frvPZgJlkDSLaNEzRd$mr3`EYH4I?ly_9a57-4UYBQIB z;#uGH))(5+!WI$XhaM0MCw8;mfd3^#M5f}b+YlzI!)7-)0wkxwP?(h}vBU_pi-{p-Yie&I2P4jVII{i`152_4y;3#dWKfkMRi_x15TjqHHU1O!L!%qv25-fezJpwi-%}UsJvLp^HO72GO6)-ZjN#iQ%m*{^ zH-3KdItpGQvpz@T)_{Y}L-jY4R*v;(#FN8d1|uTfl1nO%(E!{^&Uc&Mt!JT6_Cqup zpzVZF13ZZ;huuRqDW3ptOV-LlbF?mO-6^cI_sI(FXjv#D+K;j2sysxv&hY*5qPdjd zhWZf5P5*no{5LGdDX)GkT|E@-wO#`|_gE7%!bo07s`d?;%j__2CtT^No{|Fzf1{%5 zmL!Os(Kb@x@gF*yX!)GO1O!mf^K)uY8ZD3i(g!^tW;#zPYUM86jUbYQ)onEOA(aYbpK^0$ zlkLDs{j+`~kRO#Be;pZNd34U)*XY$_H3$T_z8sIZ88O>??9s(@yP+b&HYJ9evU)DR z_1Wh@G2<8)dH&Ne0F)YKOwrPT#JvdX=s_hSlRR2{!Bo^WRnT%ku`?CF)2gT=z-M88 z>y>1ZzIl|8%m4OTPu+@3kE_c?XY%bc#_@{-xX?|>P zW!g?j=$k@&xU-+U(Otw#N`FQA^H7x%9#F}73>RP}LRTwrq|aUVu7NM$#)T@rh|rgc zS~(B~@|+E4GDYdQ4cKlyJq9oJ7S)HM|Cu#C#Q&9}Y~Oi?YzJGNR2)PVh7xNW&G@=& zY5-JEqk!G#(|;)3=nQ!rt59OZa%VN%6b?YSz(k_b`GwI%$W!o+Qk_|S?2&7=G$Suqn0tR-!2oe= ztMFvVjqX9m$u82eLq3S}q4aZ|>x#=w5cXWB%U*0)S*s9t_Wpaafn%EWUzA~uKoNVC zxDPF?r=-L&UwYMaOJ=3D@W%E}l>jZOIFFgZd0GGE1iluL+Rnd98$`9=~ZWOlZwl97RO%&^v<%UM16GN zV3gaMO+P5o=MY}p`u*4T_clVB+*zKHp0>#xw#cIseFY`x@4(m=hX2kuq61Lqx zm`t~2MU@EJd<{D~BnC^}PX{y*hDdkrUYU4iEQ2_k#RcxzI}HcjhF5Fjz-a|~%3y%= zr#EDv<_^+|s6_9Q){e17`5B=>e3_`}>6`p_zpeNicnS{VjGwa%wHdvPUCBW!w4Dj##zO-t))ieA=aqC8X9J3qH^Zec5JriPr;46?UMem+ z&L6ksSp>@syVVcL|JfQTZT_byrX&~m;b~-{+hC`p^qq4}ExMP-b!%LQpy1OEHaBQH z${bIyUU9z8BtredFWJp3%`gnE!hCTcdzZBgYqTslss^gP^O^JY-IYG}9N6(mpAZGM&$HJ>SU1>$+p- zP@Z@*GVHA7pP~h;!o{)(=`XMYtcp78JC9B#7lF|~tu<6$%-W(*`zX07Un)qrI5%!x zxE5Z{KH%y_+*%lTGdoT?6gqUS)}^}z-R61Yb}`rL4|Qjnk8&@#y(N{d2!W-A17z%3 zr;0DvOJk1V^(4ZM;`uT;yr&BncgeRkBME~6roU@!moc@{f}5ROW|E7ZFqXL``6CmbXLIG2P+zW6i^ z2fm&OGLr^JqK%VA%Px+KkJSXUlQ+`f7Ymtn+Ud;1(IJ_8`7UF^W_Wc|7)){uzs))H zDYls86l|F#jO;pXKR0W6hySAw9%oY}lOlsMx~9B@E$9~$%G`xLw~mf5@+%Sn1p7!Q z>a~uLc3FHz#`|3`^q1NiE&YVMcmGc0wf*;xc@dAhcXuKXLu01$aroQ<720H0MMQtL z!xp92>4S6<+FLPz1Ha8`nY*#%+qJwJHL8B7GktHj>eMQDwAlg(&^UJH?_Rr0&;`c|6FYH zc?*@~)jX8S*ZNdvvj{T9JsT)?0B8vb!#Bu| zhHQXfv$OsL^*snCDd!JN;Kl^ii8zQ;)8VXn(WXrgd#`oGkN+Cs%O`h7Rj;KGU@Eyk zJ4u*mIt?#h_;)6XEj;_LK!P?sbdB!o-ksFUI;lhhjRp(Rm!vlu(x4g|gejGdUPnk{ zt{tpZ#jDr3ItYGwYq$`Q;Wom8u|Qxg(0ct2B7g5Twsfm2JmJ19@>_r_zM>FVp58MW z1!J2Ld-CurBcs%2X0T>RbU$l+r3377rJr>6qfa*R`^%?%$ORh}VJ~mKGPrX;94->w zBgHUn5y;4c`J3Fabdl%#65rNhcSujo1yzI@dGl55NLmgyc0q@g_UcE*4Z9{bPQ-Lg zfB2}wu_eh6UMCpbV04huQm*$A0(2UnHcHdr@CAjbtJ@e>P3;Q^sw)gRFJuEecF10%`QwF|aYFFJI(6 zgZ#FgBdV|*@mfU~A5z9881lMpDwybG!|Qjh3fA4#KAqb2GHGhy5~wX`TbI_9dq!QC zdAxA$C$rZ@=f>b;x4O2dhSzuldZYaVn;}Q76MqjE@1EhyOViPkh+M14)t(UwW)Gzg zg|YRFU529_FIn=hCI>z|ObUA(*F}`4b&u>tNNB!jX<@o81V^#Z;-TB_2OX#{03*9l zF|*+D9hZe7wE~^ciG5;wU1NQ#9i1DwQkp%hWz^G)0vv5n3%TefIX?XaVE0Anie4lg9 z;;WpP>?Gjmb{9C@0O@)74`7R~)S2UPU8(z68$G}mS3{*T8(n`Y4#AGurXSj&=gy8j z2DaVnU$OLusR^mdZ)xln{rSnPlBz5%F4ZoYf1kBP3l-bEpkCss&(a+8rV2@96H&3p zbai-8pmPwlkbpEm_XSG%GR!>Hyy{(kahDV|?*2}?+U<5f_~-M9VW9sz!zm4gt*oSF zJj_)VZ_n>#G%Rci6#M3?@m^SfpKS;^d;CJG{=ioTdiVz!0A57u~E2G$9m)4eZ1+j?@8z)~0* zc9!xtJ^|WP?te=k0MvBd0AreW?ch-3%~eS#5Ct*!a zgQyfy+LXXmx^DV@Za$OotJ)NyLcQ(aL0TWawJ}7fd&GZlNcL|<4~~-pt;=GSnbvz3 z=c_`^4xEX-FTYmNzgKf>&+|s*>sekj4Mp#1*@%m_5is_THR8*lJ1yK!?pws)+Ugq? zZ35@hzkl`r=fBuDrqnTg!@_rcT10RD7*)S{L)q-=;W4TgcFa_KY$k5UpgUQI0!fA2 z{-T|l?>_sqpu|q8Z|>?l{lF`x%nOO)@1SO8jIV+XW9ubYI~ZC<&bNiWHftGCQrX&J z95tHoAf_K@K%3;mJ1f=9FZXka$Y$0vl1^(u?7f`<-t72 z{XZkOwk0Y$Y%sMu``pi}_*laK)O&KEAn8{z5@eWx@Jh+I`MK9-L;OoFv0v3uKX`@ zasnc?osi#g?m-~>k#)_ELEK>%?!4vj$-l?xKQCh6ltHoe{$P>if}qqIgE)L1rTJyb z2(!9EQS4@;r?r0qYDjX#y^I}?86rOtyHT@#WtOn{#+k&gC@cj*qA}b-t$1GyL>@77 zMKKtA!c=UftGj4qnIDaJ+>QxE>r+=~8W`8lq#E3>Zg6>D9Nw zMU=3PMN8(&bpPhEj$p9Ah{tbe03AaF?^%0{ZPYAA8lsPeG&pFr4%Z3Zy7;2YWIqA0lX@vEPVM zwC3}#hrTRcvF%{qCFxr;k=^c}=}7J4Yj>PD298*E)~+$U4mdmrB5fzzySV+Qzm#zi z-xyIn?H}=VW8Ufofwl!}EeVIL&a=^F*?Lhi`(z-;7)y-4hU#oY7q2HfYNo!YVB>vs zF5Om0;+TQi%bAJv2!K{$T+Ny5QX2s$69<%!NutVxX{5Z6VcPRBR2wdm>5!xFi}p&i z%`cDK%zuEte^+Oe0TzO2q^<64r|SKP1HHgd5!n%}El1l=f)it=_Z8J#Z1vULg7qvh z`Laf-6-9JXCS$d{kPTr^Ac-E znQ0jkiB?v2lcTcBUxIb^^A~5*iV7GU5}49R3g$+V5`Tm3mL%*$Hjn@$^Z=bS$f-$= zVUR66(!#R4u#}>Nj5#myU`O=C+uY`eE*u%P(y*(#SCz% z@(-mcm92xs*>D_s&kc3*N1xCCUQ6~{3RsR|cOV(ZN=bUo=0k*yeOze<<6Nf6QVPYZG_@{yA&y9dVJV9+Zh(Lp=o6y%1}`Os~d3`t-NZ5n$lXj1IKQ#)>m(^D>J>B-)Cf zuW_-&@ce}2IX3i1V1)XLKtLx5`&Ch{D5?mP>X92y!)-#<_A%L_TM zMLe$ZHywRzVM7F@RgUP!thlvU^3#$=B!JugPKVZ81qX%5t^=qlauCQIDEy}M5WS*{ zgk!2a4ZO(ypVtJJABl&4$_S2*qNPLKsZ8L0J?OqQe()9hUE>_?QF6p7O=X1iah@J3 z`N1JCcGQ58*Qa;L(F~V;5Rr|0M`Ds^2+T5!7vD=d{6Wji_0u|x!JcYM31r8W%vVTq z#clR2V?5l6><>{*&%(cxs1#d#Yu4g->x(EM$%7G9PGTtIR|L}7rvV)O(ZmF{v0)UH z?m_$eAtS!W2Se=yzFNF`y#zQE|9gQxw!fTUTm1<9DrxD0Q=B$e=RK!4ItR@7uw$SS z90W*r>Dw8YIePT)&TKnZuX@XObkso67Hy|z@}{JwumcNyE05V0n3MxYVd2&h5T(R` zTNLq&IG@xX^Z-vHR5+sB1B2D!9eVP+g-zA-OCP6f>w)}>AKaGTo#YVt`C|Z-r)OaS zYjsCxXoVtffK}ha=0GSw^e4akf7tPVhncr3B3yF%=|`AJELe`KN~#tRfB8#P*R#3RTlXA1rr4+N-qQmwYsdLIyV)ujtU6W_S)B^ zSYD`Iv1WFJUfXk{0t3mz;HvC!A?4OMYd-tMh2c#5?vtl;)md<}oJW!NWwDgOw1nJ$_ z@TCXIS^3XhRo3j8;4fnM!0yTS9G?P+Ca{zHlxnCH4Fu)>-+c$m-W04j3Vn2;^vw8K zF*%({EWtZqXwJ2^3X|ReFFt_!^pGa4>Li{w|c+2*oQ^EuG+ z{QI5$*#k*FJccs@@k8uN#(`!Hll`dA()zxI&#uZS4<``24?4ydB8tk4rC(j6`(~A%IsKu-|ogt zW-^OSsMJ;gzQ~W9-~QXx-ZJ^8-y6EZuN5)D>;U{~*jZJCwIVFzq?(fpy$NtdX&IA# zq5VG_J;^F9vODDdk7J|9&l*WP-7dcM{5Y>kf!hxk+aXn}XZ6Z!>)Q|lYHAWn{SUBW z0HcWB99wc?03)q`ye5z$n2Qyf3;)!Xe4&$q#@?V3fuvj$N^MX^iej<0iQO44y=X07 zFU(^C++3EmhuzOTRHP^@-l^Bj2|jf+wC_17#6Zg<5ZI%l`fmvS{sh4|2%;CAfWiLB ztf3qh$NxQ)AE^?5e@lj$or!JXsV!jxEGr@tiFR9Og;{2Zgv4$~{K2 zL||+bL?GxBFp&eQdsFqj=7y+S3rs?Z9w%Pk0&kl8quSnvCp0q;r9T?78KwA%t;bj5 zX+xh9g!;eE``;Idu)>9($HXRhxDE14($xH#P<5I!XnH7(&#!3Coa*4kGh@OFyB+3R zMY3i6Ov&OdQDw9Hx4E$K#1)&57}k~dlY)*mLO6cOXi+*p^}Zl8v;Z8u4m;xfqVOV` zr?RtUR(@dfr`8vRmCPbJm8g_7B!SdJvJ2P)zP>_yu0cIEXp5wDk1<3?0jc9c0JNBG zV7q~>GF}77%L9iESS+-t1hj)=@89dS4POfV+7toeT^?)7_=;s@2&zBGt;2B>@@m^$ zelPi1JJ=Hb-`D!LER+-x9rgnF(DuUbl*IGf>-!7gDjHAYLp^83=euhTX=oqqp-Yk| z-O*8s9jmHK=Y@&N`<*l|W0&UY18FgKjyyOo=leW}LSudRC8xwN5=!DeQ_F%=Y?$Bh zd79nu%vYdrC-OgLTru-IQoyUB(&O{pM)rk?fR~YOYbQ4QL1O9HC??tCMS^1@qGUsV zA!uTokIrW>>=bbuz=m!pQ?{&*0wd2UEWO+dW|@0^xm$!TMp zZJN9^1Pkdx<6rRNpKYKgI_Oiz;m7?F)8hu{R1&y~MXRBO&AB6InsJ2?EeD0dZ2fyKDpKrnLsiOpOYHpfXfd((1VD+lT(9eqE3zetrG!k8 z+!r?#2+>1pBlFHm1N=VxEAH;c1oZJY)*wJ|8N}QG6QuB#-*D{@+JOn>4U#mI|GS(F zLOx~KtojS<9P(N?i!L{4k8s?dDPG79mF@|@cVIYbP@&a%qSzA6*2@!hIH`d9o2?QW z8H%53dFreoWldH8*n4M_E4k8w{@h0An~k% zfT%U37hlJg4E~}q8TNnChsRHkzEt^Bke^rdd60+g7iTBxKg0hSFWdsB^rqsx!a6z z2IvFeg;TE={K8~~!g)^pRGt?IejO)7q45BXB}+%7b1*V(kJ?@0P0`^ciuF{=a#$<< zNFBuxOpb&IBf=xc9PL2v|`$69TDEcE;jTEtBo+FDTk&G=VPgI4S;! zN6a0`AcvhZ>Q`LX_%qg2;CC2S!3czjfiaV&82$S8LJx6XoDg&^HPyMceWwBduf}wJ z;1zq0UHepi#x?-nq(1D!+V$5Q&!8BDsg@ePzs(N+v*Sq6p?*3rHgFhlb>3gn065pT zSG7=++=}m0&H+248YQ>Iz|`(*7gX_)TP`g+5;H~XOW;>=+Fp*Oi7Rix^r*jLXsU*% z)7$%kXm#eXp@Zi<9q-Z1G$|OU88z1`xFpy~f(^a_u12vVx_%-pXb`0DH}tg=RucIC zBp?Y~??@L-NVYQ*Sa`ZLHIu8Leg z8LK*&6ot(gU(tN`w30Q3Q@r^-hy0|gx19oJc8qfyY*P)Dpqca*Ko!JYy1ea2*XmKd+4uJv+oKjqi zYYP-DZpGal?)uI>XY9N8IQLibBMjCYbFO#3^2pBo%W^s|vKycv;NuN`lVxmipjhBa z6{V-gL|ZtooA)tTidUVO`Rk%#QHq`{AUiENv3^?#qJ3mz{X{VRaE^E{F;pP~)#t@O zFAJuSawUs+ZtQe%FQIpJv_F2*V^zJ8gzlYi5ub|t)!^s1?W;b8G$svl96C z;RFv2D*ru>;5tnU9tY>&bS%OD(?}|#6MKmr)b4C_>YYGbuISlO?b2dfvk(d>=K=&% z{^Rv>KF#HG8;zd4z4vgX8%u+yI1eZg0JNI3o-j#~#&(=Hq;KO(KsS~g>am8MwK^=L zOKF>On3`^(1)QT>8g*girg}mj+b~!1#vhtg_W%`}s}!PUFRMu1 zWi#aC%Y}iz6SkB&=_Di{M^ERv8}S2@RXrUy*QR&sfgDgTL-W(WOgts+lwdp-@!VRZ zRJzw=BulM`aRpQ+Xg0PVsje$y)MpWt!vwDoEcTyG=SKcK@lKBOG>xab9Ebo7)a|T? zqW>9vOvW84!LA4G#c+P#KTquL1|1dLy!~$`3K%gBTLOwK(SUlbCqE4EB5B^fbOMO5 zBKa$M!g6II>T}8$~qp=5FH7XBl9Oj0@_oLte_)dO2#22`C;f) zj`F%?C8G3(@3LCJfWhwJwLvKe61m;DK{JvuPZ00tDOEn^Ztt11FGG`1|(!_cNsQ6t4}Yo zbG!pz1QG4h1`tpn2*A}>45t6|;LzRkHk-c*!k~oJeX{a%nNWUS>kn@Kf}RRsk2U~& zxL}z9pmt6I3uYuW5-J28NZ%Bq(j-bqi12DxG4sb_Mnj%YgslqzzrMkG!bbDc$|nMz zdq6_K*A$gTmf-=D~E9~|cfc<>|nSwCiCw(!W%da@tpMvQCw4+8=`|#Y( zMrsk^r8Es+YNX6DYGeSP(Tc+5Vf*jYkmR&j9nGI2DvsG01SX8D`AQGC?79c)=mfye~>MsUV@FGZ*LLFojb8R=M zDfoc)atV!$JZhY>pfgV>nk1+4e}CWOO;#LtBs9)f-idWF9|7&G#GH2 z<^s#L>~1`OBCyLmxD+MCtrmY<9*njNnhYhG{(X;*sfB}S9lm2T)x2s~@*mMwJ zUIsLGs1P7>T?qlngyz4_+ti&^;qHq}+~;$p%!~DKx|Q59p{Mtf9kye)6067Kb*7c> z+Xw=dR=H^Tw!;g7Uq7a2@(aKR-2a%2da)nIeUVoWvH|GYvFQP9*d!q_t%#xH7(sy8 z+6ExU2Sg4@9so5ags)$NF1GXyKRS>bZINK;3s}8|G)s+A>ly%u=E;}jeDe3NF3NDG z6*NBs{J-W+I>xc#IyK~ZzODxo3*)-FzOu9U)v^XBcOc>&Wd~HE0J4?vHijcznE|&~IZB=&x=m_QSln4`*bf@=?5CD0FDnEN! z1ZT%uL|78~3Me%&B{a~f29r1ho4{#b{PuFW+OA^&MTpJRwf0X^S_ z)~=X*9UNA>;0Dc#b++G($0k>sYv8oAXE?gV0h;Vw9MpgK;s-j|U5!-XL}ti$C(RvA z@)zoYbv!A;CZY!a{Z+$t+9l_gobXu4ZM4z(M-%t%pyOT6>re_Qz|{?~kow9*k4U5@fBhuD;V{EC*S`kCJJtoUr0_2RMU=XDXsi8IPSa! zgzYq?)szwnxBxis{{kvaQ~*jMATc*3x-kQ-kbLu1wr%!Ut~K*SoMqf?3kIkQq9>WpdRWld*}mRdgzq*3R4j2 z@B+Q~)V?}!2ROuNH9DbO+0p5>V5&gqPceb&={lvYzdo~-L9$aNb=!bLVkNF>^wqOq zA_2-}Ai&$-VMz9*cfB+lNi0cXr_Hx+N$de`&{`WEFfgnv_;Fe_pI;UoTzT|wBOfpt z!Z#e+C;jM+HA8wJ_&>7`sgraz98yKCk=e$+o}W)mPbD$J#&seH!58Z!S+U@qu3Ih~ z0QMG+K}1-@Xli&eqki+_s5oYaA9I6p+}%h`jjS==fdriZo8#XPd|T?Zi_-P?Nm4Z( zFCmFP4@h6gO|-58lSWm=e>z4wAGg09QC#}{7(s1h(cV(MRA-|KZyK(07Pdua#02DQ z2j1D(e#kG|sT!_J#odiHO^_4DjSh5_fI?wR#8Nz~->zG*Qpx_WYxoWJbvpw2JH216 z)NI1^wK%H&J4_O>K&`5)n6nX2ywz0Igj}>_yNuIm#+WZ@&{0KH!~VZa06W5 zyK+bNzs-ICBZLkUF3A1HfaLX3Yxl?uRsx2b8$CO2!06^2RY(XpUP<`WOFf&9hB7T% zIq2T$M9f||#r1SymgD)!i3q5#!YqXWfTP10z#0mPKW$41>Crk_x?fA86ezp=2pkC8 zHwV5>_364tL?BWC)OU5xJ^G+@a{PfP=JK4Uof$9_)oS#FFeqXl;eoe?t~|He%+I+3 zoH?kw0imKg6H)&E8Du=jk|dQCx5VUHzKeg!{VSTx3MO`mk%V>O;rHMRm?_}_?O3x%Naj^8K0a!%#$Cx2Y$R@)Ttx}^Ey&JzZk>Hn+nDhU}?bwh6} ziivuHIP?JRapxPo@MJH!9mezTCicmwI#yM?+tNlK-R!#I+w7Rq_rpJ*vV`YPd`;y# zy;={&8yV*I1eXe=zG9OLx$I8-_b)3=OR1ugS#BI$2~FZ+n&;Oj(EVh@Wc=p903yiY zLUtFC*mT@iH*+HkmNsN4V$qbM&r6D+hkFGKU~nH-uk zd-}q|Hn6}&t#{jFLnq}yOm#ie*VbQU4A*WQ&1M{4vz8v9X>*8NvX$7_c%yQuw{k-V z2p&*iREDo!zOO6;5iytu{>IX@rFC-pyfOOmBWZM^By0#9>VQh!jM`PCx=~aMdAO=m zt6CLwsJ{QB6@vBnIMHL9@o)0KFYUh;TN$!A_MubRk!ID$@w)rzTSeSflv0hQN;xOu z*r(=77PB??T;eW<;{yQBa6T$7KGmn0m({KI6+L}K*pPt36_JfrAZ>zoU!_jyg48j~I*S*^|{&pSvxrGg%x;mKEgE=iKQ@W_Y^<>PTnAEMy6doreObmn-H5>NeA;+d62%6g4o}~2ZX7hSn7$iY z&PWsUv!64#F8-bO+{>o(Z+ql6R@qF=l*{^vcO`$6E5*dPSkp46&Ge+ z{d{b4&hxvI-c!M~I7>%CqgulUca3!m_#ON~u-T2RylvK%BO|R^D+|UT&T26FjM=J0 zT^w?PkuKEGge4v4e_XIq6LYC0es_q}G1JgV)P&JMxD%|G5Os4bN9lcGe1$|oRHB41 zo;0K>qVQVRBM@Tn#?ZK1a%zjpC{BYZFub6pgT#a)U=A(FO{+%4x!zDO+jiOa()dV? zos4}Mi|I2@4+xh7CIP{%BlgLGLM&6Q09_S#vzP|4lmFX02`tdzz`^dvu#ytb<{yONxLn9_XFJ2Rgdlv5zu>}Q)jUatF8aMfGl6Y&udBT{=4YML!t$O86>Mi?b}aP%Rs!Mwa1rmwu1-pmRA z$S0p=1s6YDai^f-vW59eZ9IO}^9-2myFAn+?hr4whpB+ntOqFbTRtoi}X!R<$`82^-l8kCmqUwPejNOA}wR~FAwfnCK) z5|^!F5f=oEfWUY4-YT!Xrmc4NCSU4n!$!(0Gn04r4A!i6AXU0fgz(Rq;yO;o41@bE zKK*rtgl+qM{M2*^62|lw58Pjz^B1l9SbyKN7{)UEEm@H}nxojOsJs&Wuh{?HDOX4< zT#@Z>goK>cuJkX$<-eix8s)R-E=QZ)mCE~VXn#yByFkRB3>mN1HTn>$fAFNOU#2Vb90qQvI~DrZle*T7uclyON@Gja zp{7mmaW5xzM}?dU+~%gf5{mJDa`Ac>9H`ob116^XD@M@!O?)E8yNOm zVQ8X*l2sAWBAk|cvxp9EyJC41f}vAG#&i~M&~TZ$9Ts0Zx_kWOXjt1Fr)0Nfoo&Yo zd@~`ZUS+Ra>LE@iFO`dn2%~irS#fr#zYknL9zq7C&EAs=E#2#;+a^AlmtSsFD$)?9 zu=uD~Gpi!%%ALn`HqZae-FzI5V@TgbmJW+RII>0yk%sS0$=9(~t)Mf)rB$KI_Q)=c z8$UuLWiOohI!vr#k8uV|eSDYNOw@8sA=5lEk5uvZ|AKNdYdn@4QuAjkzM9D~J6z|8!dWy|BL+ClXp`v*D=jC--dPWALW^er>B^1(t?

6vIzB08b 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≺n^6wX1610jLwTnv7@w8Uz^ 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

YS+RRz-$|NU?s2S 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 z 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�vRlBq<#n*3&zd?Kb|{-t4j1&H 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%0D;m9Bc*cAlwL_;^G>I6SzNu9yGI^xEgHvPHTuu@i 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

gU(eXedl&Ql41kVqU#Gfr{;I3>>nqi6w| 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%0DY5aG4rC%_z&QfLUq_3tm#3dn( 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 "${EXPORT_PATH}/${T}.sql" + fi +done; \ No newline at end of file diff --git a/sql/import.sh b/sql/import.sh new file mode 100644 index 00000000..f7006dba --- /dev/null +++ b/sql/import.sh @@ -0,0 +1,29 @@ +#!/bin/bash +IMPORT_PATH="C://coding//repositories//ffxiv related//sapphire//Sapphire2Clone//sql//" +USER=root +PASS=root +DBNAME=sapphire + +ECHO Creating Database $DBNAME +mysqladmin -h localhost -u $USER -p$PASS DROP $DBNAME + +ECHO Creating Database $DBNAME +mysqladmin -h localhost -u $USER -p$PASS CREATE $DBNAME IF NOT EXISTS $DBNAME + +ECHO Loading $DBNAME tables into the database +sh cd $IMPORT_PATH + +"C:\program files\mysql\mysql server 5.7\bin\mysql" $DBNAME -h localhost -u $USER -p$PASS -e 'SET AUTOCOMMIT=0;' + +for X in '*.sql'; +do + for Y in $X + do + echo Importing $Y; + "C:\program files\mysql\mysql server 5.7\bin\mysql" $DBNAME -h localhost -u $USER -p$PASS < $Y + done +done + +"C:\program files\mysql\mysql server 5.7\bin\mysql" $DBNAME -h localhost -u $USER -p$PASS -e 'COMMIT;' + +ECHO Finished! \ No newline at end of file diff --git a/sql/infolinkshell.sql b/sql/infolinkshell.sql new file mode 100644 index 00000000..66e7b224 --- /dev/null +++ b/sql/infolinkshell.sql @@ -0,0 +1,57 @@ +-- MySQL dump 10.13 Distrib 5.7.13, for Win64 (x86_64) +-- +-- Host: localhost Database: sapphire +-- ------------------------------------------------------ +-- Server version 5.7.13-log + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `infolinkshell` +-- + +DROP TABLE IF EXISTS `infolinkshell`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `infolinkshell` ( + `LinkshellId` int(20) NOT NULL AUTO_INCREMENT, + `MasterCharacterId` int(20) DEFAULT NULL, + `CharacterIdList` blob, + `LinkshellName` varchar(32) DEFAULT NULL, + `LeaderIdList` blob, + `InviteIdList` blob, + `IS_DELETE` int(3) DEFAULT '0', + `IS_NOT_ACTIVE_FLG` int(3) DEFAULT '0', + `UPDATE_DATE` date DEFAULT NULL, + PRIMARY KEY (`LinkshellId`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `infolinkshell` +-- + +LOCK TABLES `infolinkshell` WRITE; +/*!40000 ALTER TABLE `infolinkshell` DISABLE KEYS */; +/*!40000 ALTER TABLE `infolinkshell` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2016-12-09 17:37:15 diff --git a/sql/uniqueiddata.sql b/sql/uniqueiddata.sql new file mode 100644 index 00000000..e397fbec --- /dev/null +++ b/sql/uniqueiddata.sql @@ -0,0 +1,505 @@ +-- MySQL dump 10.13 Distrib 5.7.13, for Win64 (x86_64) +-- +-- Host: localhost Database: sapphire +-- ------------------------------------------------------ +-- Server version 5.7.13-log + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `uniqueiddata` +-- + +DROP TABLE IF EXISTS `uniqueiddata`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `uniqueiddata` ( + `NextId` int(20) NOT NULL AUTO_INCREMENT, + `IdName` varchar(16) DEFAULT 'NOT SET', + `IS_DELETE` int(3) DEFAULT '0', + `IS_NOT_ACTIVE_FLG` int(3) DEFAULT '0', + `UPDATE_DATE` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`NextId`) +) ENGINE=MyISAM AUTO_INCREMENT=1000447 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `uniqueiddata` +-- + +LOCK TABLES `uniqueiddata` WRITE; +/*!40000 ALTER TABLE `uniqueiddata` DISABLE KEYS */; +INSERT INTO `uniqueiddata` VALUES (1,'NOT_SET',0,0,'2016-02-10 22:04:00'); +INSERT INTO `uniqueiddata` VALUES (2,'NOT_SET',0,0,'2016-02-10 22:04:23'); +INSERT INTO `uniqueiddata` VALUES (3,'NOT_SET',0,0,'2016-02-10 22:06:29'); +INSERT INTO `uniqueiddata` VALUES (4,'NOT_SET',0,0,'2016-02-10 22:06:29'); +INSERT INTO `uniqueiddata` VALUES (5,'NOT_SET',0,0,'2016-02-10 22:06:29'); +INSERT INTO `uniqueiddata` VALUES (6,'NOT_SET',0,0,'2016-02-10 22:06:29'); +INSERT INTO `uniqueiddata` VALUES (1000001,'NOT_SET',0,0,'2016-02-10 22:07:59'); +INSERT INTO `uniqueiddata` VALUES (1000002,'NOT_SET',0,0,'2016-02-10 22:07:59'); +INSERT INTO `uniqueiddata` VALUES (1000003,'NOT_SET',0,0,'2016-02-10 22:07:59'); +INSERT INTO `uniqueiddata` VALUES (1000004,'NOT_SET',0,0,'2016-02-10 22:07:59'); +INSERT INTO `uniqueiddata` VALUES (1000005,'NOT_SET',0,0,'2016-02-11 00:50:07'); +INSERT INTO `uniqueiddata` VALUES (1000006,'NOT_SET',0,0,'2016-02-11 00:54:50'); +INSERT INTO `uniqueiddata` VALUES (1000007,'NOT_SET',0,0,'2016-02-11 20:46:38'); +INSERT INTO `uniqueiddata` VALUES (1000008,'NOT_SET',0,0,'2016-02-11 20:46:47'); +INSERT INTO `uniqueiddata` VALUES (1000009,'NOT_SET',0,0,'2016-02-11 20:46:54'); +INSERT INTO `uniqueiddata` VALUES (1000010,'NOT_SET',0,0,'2016-02-11 20:47:04'); +INSERT INTO `uniqueiddata` VALUES (1000011,'NOT_SET',0,0,'2016-02-11 20:47:11'); +INSERT INTO `uniqueiddata` VALUES (1000012,'NOT_SET',0,0,'2016-02-11 22:20:14'); +INSERT INTO `uniqueiddata` VALUES (1000013,'NOT_SET',0,0,'2016-02-12 08:18:49'); +INSERT INTO `uniqueiddata` VALUES (1000014,'NOT_SET',0,0,'2016-02-12 08:22:10'); +INSERT INTO `uniqueiddata` VALUES (1000015,'NOT_SET',0,0,'2016-02-12 18:54:51'); +INSERT INTO `uniqueiddata` VALUES (1000016,'NOT_SET',0,0,'2016-02-12 18:54:51'); +INSERT INTO `uniqueiddata` VALUES (1000017,'NOT_SET',0,0,'2016-02-12 18:54:51'); +INSERT INTO `uniqueiddata` VALUES (1000018,'NOT_SET',0,0,'2016-02-12 18:54:51'); +INSERT INTO `uniqueiddata` VALUES (1000019,'NOT_SET',0,0,'2016-02-12 18:54:51'); +INSERT INTO `uniqueiddata` VALUES (1000020,'NOT_SET',0,0,'2016-02-13 11:45:32'); +INSERT INTO `uniqueiddata` VALUES (1000021,'NOT_SET',0,0,'2016-02-13 11:45:40'); +INSERT INTO `uniqueiddata` VALUES (1000022,'NOT_SET',0,0,'2016-02-13 11:45:43'); +INSERT INTO `uniqueiddata` VALUES (1000023,'NOT_SET',0,0,'2016-02-13 11:46:02'); +INSERT INTO `uniqueiddata` VALUES (1000024,'NOT_SET',0,0,'2016-02-13 11:46:04'); +INSERT INTO `uniqueiddata` VALUES (1000025,'NOT_SET',0,0,'2016-02-13 11:46:06'); +INSERT INTO `uniqueiddata` VALUES (1000026,'NOT_SET',0,0,'2016-02-13 11:46:08'); +INSERT INTO `uniqueiddata` VALUES (1000027,'NOT_SET',0,0,'2016-02-13 11:46:10'); +INSERT INTO `uniqueiddata` VALUES (1000028,'NOT_SET',0,0,'2016-02-13 11:50:06'); +INSERT INTO `uniqueiddata` VALUES (1000029,'NOT_SET',0,0,'2016-02-13 11:51:25'); +INSERT INTO `uniqueiddata` VALUES (1000030,'NOT_SET',0,0,'2016-02-13 11:55:58'); +INSERT INTO `uniqueiddata` VALUES (1000031,'NOT_SET',0,0,'2016-02-13 11:56:02'); +INSERT INTO `uniqueiddata` VALUES (1000032,'NOT_SET',0,0,'2016-02-13 11:56:05'); +INSERT INTO `uniqueiddata` VALUES (1000033,'NOT_SET',0,0,'2016-02-13 11:56:08'); +INSERT INTO `uniqueiddata` VALUES (1000034,'NOT_SET',0,0,'2016-02-13 11:56:11'); +INSERT INTO `uniqueiddata` VALUES (1000035,'NOT_SET',0,0,'2016-02-13 11:56:17'); +INSERT INTO `uniqueiddata` VALUES (1000036,'NOT_SET',0,0,'2016-02-13 11:57:24'); +INSERT INTO `uniqueiddata` VALUES (1000037,'NOT_SET',0,0,'2016-02-13 11:57:27'); +INSERT INTO `uniqueiddata` VALUES (1000038,'NOT_SET',0,0,'2016-02-13 11:57:28'); +INSERT INTO `uniqueiddata` VALUES (1000039,'NOT_SET',0,0,'2016-02-13 11:57:29'); +INSERT INTO `uniqueiddata` VALUES (1000040,'NOT_SET',0,0,'2016-02-13 11:57:30'); +INSERT INTO `uniqueiddata` VALUES (1000041,'NOT_SET',0,0,'2016-02-13 11:57:31'); +INSERT INTO `uniqueiddata` VALUES (1000042,'NOT_SET',0,0,'2016-02-13 11:57:34'); +INSERT INTO `uniqueiddata` VALUES (1000043,'NOT_SET',0,0,'2016-02-13 11:57:36'); +INSERT INTO `uniqueiddata` VALUES (1000044,'NOT_SET',0,0,'2016-02-13 11:57:37'); +INSERT INTO `uniqueiddata` VALUES (1000045,'NOT_SET',0,0,'2016-02-13 11:57:38'); +INSERT INTO `uniqueiddata` VALUES (1000046,'NOT_SET',0,0,'2016-02-13 11:57:39'); +INSERT INTO `uniqueiddata` VALUES (1000047,'NOT_SET',0,0,'2016-02-13 11:57:40'); +INSERT INTO `uniqueiddata` VALUES (1000048,'NOT_SET',0,0,'2016-02-13 11:57:41'); +INSERT INTO `uniqueiddata` VALUES (1000049,'NOT_SET',0,0,'2016-02-13 11:57:42'); +INSERT INTO `uniqueiddata` VALUES (1000050,'NOT_SET',0,0,'2016-02-13 11:57:44'); +INSERT INTO `uniqueiddata` VALUES (1000051,'NOT_SET',0,0,'2016-02-13 11:57:47'); +INSERT INTO `uniqueiddata` VALUES (1000052,'NOT_SET',0,0,'2016-02-13 11:57:50'); +INSERT INTO `uniqueiddata` VALUES (1000053,'NOT_SET',0,0,'2016-02-13 11:57:52'); +INSERT INTO `uniqueiddata` VALUES (1000054,'NOT_SET',0,0,'2016-02-13 11:57:55'); +INSERT INTO `uniqueiddata` VALUES (1000055,'NOT_SET',0,0,'2016-02-13 11:57:57'); +INSERT INTO `uniqueiddata` VALUES (1000056,'NOT_SET',0,0,'2016-02-13 11:57:57'); +INSERT INTO `uniqueiddata` VALUES (1000057,'NOT_SET',0,0,'2016-02-13 11:58:00'); +INSERT INTO `uniqueiddata` VALUES (1000058,'NOT_SET',0,0,'2016-02-13 11:58:00'); +INSERT INTO `uniqueiddata` VALUES (1000059,'NOT_SET',0,0,'2016-02-13 11:58:02'); +INSERT INTO `uniqueiddata` VALUES (1000060,'NOT_SET',0,0,'2016-02-13 11:58:02'); +INSERT INTO `uniqueiddata` VALUES (1000061,'NOT_SET',0,0,'2016-02-13 13:03:07'); +INSERT INTO `uniqueiddata` VALUES (1000062,'NOT_SET',0,0,'2016-02-13 13:03:07'); +INSERT INTO `uniqueiddata` VALUES (1000063,'NOT_SET',0,0,'2016-02-13 13:03:51'); +INSERT INTO `uniqueiddata` VALUES (1000064,'NOT_SET',0,0,'2016-02-13 13:03:51'); +INSERT INTO `uniqueiddata` VALUES (1000065,'NOT_SET',0,0,'2016-02-13 13:04:03'); +INSERT INTO `uniqueiddata` VALUES (1000066,'NOT_SET',0,0,'2016-02-13 13:04:07'); +INSERT INTO `uniqueiddata` VALUES (1000067,'NOT_SET',0,0,'2016-02-13 13:04:20'); +INSERT INTO `uniqueiddata` VALUES (1000068,'NOT_SET',0,0,'2016-02-13 13:04:41'); +INSERT INTO `uniqueiddata` VALUES (1000069,'NOT_SET',0,0,'2016-02-15 11:43:46'); +INSERT INTO `uniqueiddata` VALUES (1000070,'NOT_SET',0,0,'2016-02-15 11:43:46'); +INSERT INTO `uniqueiddata` VALUES (1000071,'NOT_SET',0,0,'2016-02-15 11:43:46'); +INSERT INTO `uniqueiddata` VALUES (1000072,'NOT_SET',0,0,'2016-02-15 11:43:46'); +INSERT INTO `uniqueiddata` VALUES (1000073,'NOT_SET',0,0,'2016-02-15 11:43:46'); +INSERT INTO `uniqueiddata` VALUES (1000074,'NOT_SET',0,0,'2016-02-15 12:12:37'); +INSERT INTO `uniqueiddata` VALUES (1000075,'NOT_SET',0,0,'2016-02-15 12:12:37'); +INSERT INTO `uniqueiddata` VALUES (1000076,'NOT_SET',0,0,'2016-02-15 12:12:37'); +INSERT INTO `uniqueiddata` VALUES (1000077,'NOT_SET',0,0,'2016-02-15 12:12:37'); +INSERT INTO `uniqueiddata` VALUES (1000078,'NOT_SET',0,0,'2016-02-15 12:12:37'); +INSERT INTO `uniqueiddata` VALUES (1000079,'NOT_SET',0,0,'2016-02-15 13:19:52'); +INSERT INTO `uniqueiddata` VALUES (1000080,'NOT_SET',0,0,'2016-02-15 13:22:50'); +INSERT INTO `uniqueiddata` VALUES (1000081,'NOT_SET',0,0,'2016-02-15 13:28:08'); +INSERT INTO `uniqueiddata` VALUES (1000082,'NOT_SET',0,0,'2016-02-15 13:31:52'); +INSERT INTO `uniqueiddata` VALUES (1000083,'NOT_SET',0,0,'2016-02-15 13:33:42'); +INSERT INTO `uniqueiddata` VALUES (1000084,'NOT_SET',0,0,'2016-02-15 13:35:28'); +INSERT INTO `uniqueiddata` VALUES (1000085,'NOT_SET',0,0,'2016-02-15 13:50:28'); +INSERT INTO `uniqueiddata` VALUES (1000086,'NOT_SET',0,0,'2016-02-15 14:28:11'); +INSERT INTO `uniqueiddata` VALUES (1000087,'NOT_SET',0,0,'2016-02-15 14:28:21'); +INSERT INTO `uniqueiddata` VALUES (1000088,'NOT_SET',0,0,'2016-02-15 14:28:25'); +INSERT INTO `uniqueiddata` VALUES (1000089,'NOT_SET',0,0,'2016-02-15 14:28:26'); +INSERT INTO `uniqueiddata` VALUES (1000090,'NOT_SET',0,0,'2016-02-15 14:28:26'); +INSERT INTO `uniqueiddata` VALUES (1000091,'NOT_SET',0,0,'2016-02-15 14:28:27'); +INSERT INTO `uniqueiddata` VALUES (1000092,'NOT_SET',0,0,'2016-02-15 14:28:27'); +INSERT INTO `uniqueiddata` VALUES (1000093,'NOT_SET',0,0,'2016-02-15 14:28:35'); +INSERT INTO `uniqueiddata` VALUES (1000094,'NOT_SET',0,0,'2016-02-15 14:40:54'); +INSERT INTO `uniqueiddata` VALUES (1000095,'NOT_SET',0,0,'2016-02-15 14:42:22'); +INSERT INTO `uniqueiddata` VALUES (1000096,'NOT_SET',0,0,'2016-02-15 14:44:54'); +INSERT INTO `uniqueiddata` VALUES (1000097,'NOT_SET',0,0,'2016-02-15 14:50:58'); +INSERT INTO `uniqueiddata` VALUES (1000098,'NOT_SET',0,0,'2016-02-15 14:51:00'); +INSERT INTO `uniqueiddata` VALUES (1000099,'NOT_SET',0,0,'2016-02-15 14:51:02'); +INSERT INTO `uniqueiddata` VALUES (1000100,'NOT_SET',0,0,'2016-02-15 14:51:02'); +INSERT INTO `uniqueiddata` VALUES (1000101,'NOT_SET',0,0,'2016-02-15 14:51:15'); +INSERT INTO `uniqueiddata` VALUES (1000102,'NOT_SET',0,0,'2016-02-15 14:51:17'); +INSERT INTO `uniqueiddata` VALUES (1000103,'NOT_SET',0,0,'2016-02-15 14:51:18'); +INSERT INTO `uniqueiddata` VALUES (1000104,'NOT_SET',0,0,'2016-02-15 14:51:19'); +INSERT INTO `uniqueiddata` VALUES (1000105,'NOT_SET',0,0,'2016-02-15 14:51:19'); +INSERT INTO `uniqueiddata` VALUES (1000106,'NOT_SET',0,0,'2016-02-15 14:51:20'); +INSERT INTO `uniqueiddata` VALUES (1000107,'NOT_SET',0,0,'2016-02-15 14:51:20'); +INSERT INTO `uniqueiddata` VALUES (1000108,'NOT_SET',0,0,'2016-02-15 14:51:21'); +INSERT INTO `uniqueiddata` VALUES (1000109,'NOT_SET',0,0,'2016-02-15 14:51:21'); +INSERT INTO `uniqueiddata` VALUES (1000110,'NOT_SET',0,0,'2016-02-15 14:51:22'); +INSERT INTO `uniqueiddata` VALUES (1000111,'NOT_SET',0,0,'2016-02-15 14:51:23'); +INSERT INTO `uniqueiddata` VALUES (1000112,'NOT_SET',0,0,'2016-02-15 14:51:24'); +INSERT INTO `uniqueiddata` VALUES (1000113,'NOT_SET',0,0,'2016-02-15 14:51:25'); +INSERT INTO `uniqueiddata` VALUES (1000114,'NOT_SET',0,0,'2016-02-15 14:51:26'); +INSERT INTO `uniqueiddata` VALUES (1000115,'NOT_SET',0,0,'2016-02-15 14:51:26'); +INSERT INTO `uniqueiddata` VALUES (1000116,'NOT_SET',0,0,'2016-02-15 14:51:27'); +INSERT INTO `uniqueiddata` VALUES (1000117,'NOT_SET',0,0,'2016-02-15 14:51:28'); +INSERT INTO `uniqueiddata` VALUES (1000118,'NOT_SET',0,0,'2016-02-15 14:51:29'); +INSERT INTO `uniqueiddata` VALUES (1000119,'NOT_SET',0,0,'2016-02-15 14:51:29'); +INSERT INTO `uniqueiddata` VALUES (1000120,'NOT_SET',0,0,'2016-02-15 14:51:30'); +INSERT INTO `uniqueiddata` VALUES (1000121,'NOT_SET',0,0,'2016-02-15 14:51:31'); +INSERT INTO `uniqueiddata` VALUES (1000122,'NOT_SET',0,0,'2016-02-15 14:51:31'); +INSERT INTO `uniqueiddata` VALUES (1000123,'NOT_SET',0,0,'2016-02-15 14:51:31'); +INSERT INTO `uniqueiddata` VALUES (1000124,'NOT_SET',0,0,'2016-02-15 14:51:32'); +INSERT INTO `uniqueiddata` VALUES (1000125,'NOT_SET',0,0,'2016-02-15 14:51:32'); +INSERT INTO `uniqueiddata` VALUES (1000126,'NOT_SET',0,0,'2016-02-15 14:51:33'); +INSERT INTO `uniqueiddata` VALUES (1000127,'NOT_SET',0,0,'2016-02-15 14:51:33'); +INSERT INTO `uniqueiddata` VALUES (1000128,'NOT_SET',0,0,'2016-02-15 14:52:22'); +INSERT INTO `uniqueiddata` VALUES (1000129,'NOT_SET',0,0,'2016-02-15 14:52:22'); +INSERT INTO `uniqueiddata` VALUES (1000130,'NOT_SET',0,0,'2016-02-15 14:52:39'); +INSERT INTO `uniqueiddata` VALUES (1000131,'NOT_SET',0,0,'2016-02-15 14:52:39'); +INSERT INTO `uniqueiddata` VALUES (1000132,'NOT_SET',0,0,'2016-02-15 15:09:49'); +INSERT INTO `uniqueiddata` VALUES (1000133,'NOT_SET',0,0,'2016-02-15 15:09:56'); +INSERT INTO `uniqueiddata` VALUES (1000134,'NOT_SET',0,0,'2016-02-15 15:10:05'); +INSERT INTO `uniqueiddata` VALUES (1000135,'NOT_SET',0,0,'2016-02-15 15:10:05'); +INSERT INTO `uniqueiddata` VALUES (1000136,'NOT_SET',0,0,'2016-02-15 15:10:14'); +INSERT INTO `uniqueiddata` VALUES (1000137,'NOT_SET',0,0,'2016-02-15 15:10:14'); +INSERT INTO `uniqueiddata` VALUES (1000138,'NOT_SET',0,0,'2016-02-15 15:10:34'); +INSERT INTO `uniqueiddata` VALUES (1000139,'NOT_SET',0,0,'2016-02-15 15:10:34'); +INSERT INTO `uniqueiddata` VALUES (1000140,'NOT_SET',0,0,'2016-02-15 15:11:20'); +INSERT INTO `uniqueiddata` VALUES (1000141,'NOT_SET',0,0,'2016-02-15 15:11:20'); +INSERT INTO `uniqueiddata` VALUES (1000142,'NOT_SET',0,0,'2016-02-15 15:12:49'); +INSERT INTO `uniqueiddata` VALUES (1000143,'NOT_SET',0,0,'2016-02-15 15:12:49'); +INSERT INTO `uniqueiddata` VALUES (1000144,'NOT_SET',0,0,'2016-02-15 15:14:34'); +INSERT INTO `uniqueiddata` VALUES (1000145,'NOT_SET',0,0,'2016-02-15 15:14:34'); +INSERT INTO `uniqueiddata` VALUES (1000146,'NOT_SET',0,0,'2016-02-15 15:14:38'); +INSERT INTO `uniqueiddata` VALUES (1000147,'NOT_SET',0,0,'2016-02-15 15:14:38'); +INSERT INTO `uniqueiddata` VALUES (1000148,'NOT_SET',0,0,'2016-02-15 15:14:41'); +INSERT INTO `uniqueiddata` VALUES (1000149,'NOT_SET',0,0,'2016-02-15 15:14:41'); +INSERT INTO `uniqueiddata` VALUES (1000150,'NOT_SET',0,0,'2016-02-15 15:14:42'); +INSERT INTO `uniqueiddata` VALUES (1000151,'NOT_SET',0,0,'2016-02-15 15:14:42'); +INSERT INTO `uniqueiddata` VALUES (1000152,'NOT_SET',0,0,'2016-02-15 15:18:32'); +INSERT INTO `uniqueiddata` VALUES (1000153,'NOT_SET',0,0,'2016-02-15 15:18:32'); +INSERT INTO `uniqueiddata` VALUES (1000154,'NOT_SET',0,0,'2016-02-15 15:18:47'); +INSERT INTO `uniqueiddata` VALUES (1000155,'NOT_SET',0,0,'2016-02-15 15:18:47'); +INSERT INTO `uniqueiddata` VALUES (1000156,'NOT_SET',0,0,'2016-02-15 15:18:59'); +INSERT INTO `uniqueiddata` VALUES (1000157,'NOT_SET',0,0,'2016-02-15 15:18:59'); +INSERT INTO `uniqueiddata` VALUES (1000158,'NOT_SET',0,0,'2016-02-15 15:19:09'); +INSERT INTO `uniqueiddata` VALUES (1000159,'NOT_SET',0,0,'2016-02-15 15:19:09'); +INSERT INTO `uniqueiddata` VALUES (1000160,'NOT_SET',0,0,'2016-02-15 15:19:10'); +INSERT INTO `uniqueiddata` VALUES (1000161,'NOT_SET',0,0,'2016-02-15 15:19:10'); +INSERT INTO `uniqueiddata` VALUES (1000162,'NOT_SET',0,0,'2016-02-15 15:20:33'); +INSERT INTO `uniqueiddata` VALUES (1000163,'NOT_SET',0,0,'2016-02-15 15:20:33'); +INSERT INTO `uniqueiddata` VALUES (1000164,'NOT_SET',0,0,'2016-02-15 15:21:20'); +INSERT INTO `uniqueiddata` VALUES (1000165,'NOT_SET',0,0,'2016-02-15 15:21:20'); +INSERT INTO `uniqueiddata` VALUES (1000166,'NOT_SET',0,0,'2016-02-15 15:21:46'); +INSERT INTO `uniqueiddata` VALUES (1000167,'NOT_SET',0,0,'2016-02-15 15:21:46'); +INSERT INTO `uniqueiddata` VALUES (1000168,'NOT_SET',0,0,'2016-02-15 15:23:36'); +INSERT INTO `uniqueiddata` VALUES (1000169,'NOT_SET',0,0,'2016-02-15 15:23:36'); +INSERT INTO `uniqueiddata` VALUES (1000170,'NOT_SET',0,0,'2016-02-15 15:23:51'); +INSERT INTO `uniqueiddata` VALUES (1000171,'NOT_SET',0,0,'2016-02-15 15:23:51'); +INSERT INTO `uniqueiddata` VALUES (1000172,'NOT_SET',0,0,'2016-02-15 15:29:44'); +INSERT INTO `uniqueiddata` VALUES (1000173,'NOT_SET',0,0,'2016-02-15 15:29:44'); +INSERT INTO `uniqueiddata` VALUES (1000174,'NOT_SET',0,0,'2016-02-15 15:29:44'); +INSERT INTO `uniqueiddata` VALUES (1000175,'NOT_SET',0,0,'2016-02-15 15:32:11'); +INSERT INTO `uniqueiddata` VALUES (1000176,'NOT_SET',0,0,'2016-02-15 15:32:11'); +INSERT INTO `uniqueiddata` VALUES (1000177,'NOT_SET',0,0,'2016-02-15 15:32:11'); +INSERT INTO `uniqueiddata` VALUES (1000178,'NOT_SET',0,0,'2016-02-15 15:32:24'); +INSERT INTO `uniqueiddata` VALUES (1000179,'NOT_SET',0,0,'2016-02-15 15:32:24'); +INSERT INTO `uniqueiddata` VALUES (1000180,'NOT_SET',0,0,'2016-02-15 15:32:24'); +INSERT INTO `uniqueiddata` VALUES (1000181,'NOT_SET',0,0,'2016-02-15 15:34:55'); +INSERT INTO `uniqueiddata` VALUES (1000182,'NOT_SET',0,0,'2016-02-15 15:34:55'); +INSERT INTO `uniqueiddata` VALUES (1000183,'NOT_SET',0,0,'2016-02-15 15:34:55'); +INSERT INTO `uniqueiddata` VALUES (1000184,'NOT_SET',0,0,'2016-02-15 16:12:30'); +INSERT INTO `uniqueiddata` VALUES (1000185,'NOT_SET',0,0,'2016-02-15 16:12:30'); +INSERT INTO `uniqueiddata` VALUES (1000186,'NOT_SET',0,0,'2016-02-15 16:12:30'); +INSERT INTO `uniqueiddata` VALUES (1000187,'NOT_SET',0,0,'2016-02-15 16:12:44'); +INSERT INTO `uniqueiddata` VALUES (1000188,'NOT_SET',0,0,'2016-02-15 16:12:44'); +INSERT INTO `uniqueiddata` VALUES (1000189,'NOT_SET',0,0,'2016-02-15 16:12:44'); +INSERT INTO `uniqueiddata` VALUES (1000190,'NOT_SET',0,0,'2016-02-15 16:12:45'); +INSERT INTO `uniqueiddata` VALUES (1000191,'NOT_SET',0,0,'2016-02-15 16:12:45'); +INSERT INTO `uniqueiddata` VALUES (1000192,'NOT_SET',0,0,'2016-02-15 16:12:45'); +INSERT INTO `uniqueiddata` VALUES (1000193,'NOT_SET',0,0,'2016-02-15 16:12:46'); +INSERT INTO `uniqueiddata` VALUES (1000194,'NOT_SET',0,0,'2016-02-15 16:12:46'); +INSERT INTO `uniqueiddata` VALUES (1000195,'NOT_SET',0,0,'2016-02-15 16:12:46'); +INSERT INTO `uniqueiddata` VALUES (1000196,'NOT_SET',0,0,'2016-02-15 16:12:46'); +INSERT INTO `uniqueiddata` VALUES (1000197,'NOT_SET',0,0,'2016-02-15 16:12:46'); +INSERT INTO `uniqueiddata` VALUES (1000198,'NOT_SET',0,0,'2016-02-15 16:12:46'); +INSERT INTO `uniqueiddata` VALUES (1000199,'NOT_SET',0,0,'2016-02-15 16:14:50'); +INSERT INTO `uniqueiddata` VALUES (1000200,'NOT_SET',0,0,'2016-02-15 16:14:50'); +INSERT INTO `uniqueiddata` VALUES (1000201,'NOT_SET',0,0,'2016-02-15 16:14:50'); +INSERT INTO `uniqueiddata` VALUES (1000202,'NOT_SET',0,0,'2016-02-15 16:15:03'); +INSERT INTO `uniqueiddata` VALUES (1000203,'NOT_SET',0,0,'2016-02-15 16:15:03'); +INSERT INTO `uniqueiddata` VALUES (1000204,'NOT_SET',0,0,'2016-02-15 16:15:03'); +INSERT INTO `uniqueiddata` VALUES (1000205,'NOT_SET',0,0,'2016-02-15 16:15:11'); +INSERT INTO `uniqueiddata` VALUES (1000206,'NOT_SET',0,0,'2016-02-15 16:15:11'); +INSERT INTO `uniqueiddata` VALUES (1000207,'NOT_SET',0,0,'2016-02-15 16:15:11'); +INSERT INTO `uniqueiddata` VALUES (1000208,'NOT_SET',0,0,'2016-02-15 22:32:45'); +INSERT INTO `uniqueiddata` VALUES (1000209,'NOT_SET',0,0,'2016-02-15 22:32:45'); +INSERT INTO `uniqueiddata` VALUES (1000210,'NOT_SET',0,0,'2016-02-15 22:32:45'); +INSERT INTO `uniqueiddata` VALUES (1000211,'NOT_SET',0,0,'2016-02-15 22:32:45'); +INSERT INTO `uniqueiddata` VALUES (1000212,'NOT_SET',0,0,'2016-02-15 22:32:45'); +INSERT INTO `uniqueiddata` VALUES (1000213,'NOT_SET',0,0,'2016-02-15 22:34:23'); +INSERT INTO `uniqueiddata` VALUES (1000214,'NOT_SET',0,0,'2016-02-15 23:11:20'); +INSERT INTO `uniqueiddata` VALUES (1000215,'NOT_SET',0,0,'2016-02-15 23:11:20'); +INSERT INTO `uniqueiddata` VALUES (1000216,'NOT_SET',0,0,'2016-02-15 23:11:20'); +INSERT INTO `uniqueiddata` VALUES (1000217,'NOT_SET',0,0,'2016-02-15 23:11:20'); +INSERT INTO `uniqueiddata` VALUES (1000218,'NOT_SET',0,0,'2016-02-15 23:11:20'); +INSERT INTO `uniqueiddata` VALUES (1000219,'NOT_SET',0,0,'2016-02-15 23:16:58'); +INSERT INTO `uniqueiddata` VALUES (1000220,'NOT_SET',0,0,'2016-02-16 19:00:04'); +INSERT INTO `uniqueiddata` VALUES (1000221,'NOT_SET',0,0,'2016-02-16 19:03:23'); +INSERT INTO `uniqueiddata` VALUES (1000222,'NOT_SET',0,0,'2016-02-16 19:06:00'); +INSERT INTO `uniqueiddata` VALUES (1000223,'NOT_SET',0,0,'2016-02-16 19:11:54'); +INSERT INTO `uniqueiddata` VALUES (1000224,'NOT_SET',0,0,'2016-02-16 19:14:18'); +INSERT INTO `uniqueiddata` VALUES (1000225,'NOT_SET',0,0,'2016-02-16 19:22:28'); +INSERT INTO `uniqueiddata` VALUES (1000226,'NOT_SET',0,0,'2016-02-16 21:43:08'); +INSERT INTO `uniqueiddata` VALUES (1000227,'NOT_SET',0,0,'2016-02-16 21:44:28'); +INSERT INTO `uniqueiddata` VALUES (1000228,'NOT_SET',0,0,'2016-02-16 21:46:22'); +INSERT INTO `uniqueiddata` VALUES (1000229,'NOT_SET',0,0,'2016-02-16 21:46:52'); +INSERT INTO `uniqueiddata` VALUES (1000230,'NOT_SET',0,0,'2016-02-16 21:47:53'); +INSERT INTO `uniqueiddata` VALUES (1000231,'NOT_SET',0,0,'2016-02-16 21:48:12'); +INSERT INTO `uniqueiddata` VALUES (1000232,'NOT_SET',0,0,'2016-02-16 21:48:59'); +INSERT INTO `uniqueiddata` VALUES (1000233,'NOT_SET',0,0,'2016-02-16 21:49:38'); +INSERT INTO `uniqueiddata` VALUES (1000234,'NOT_SET',0,0,'2016-02-16 21:51:07'); +INSERT INTO `uniqueiddata` VALUES (1000235,'NOT_SET',0,0,'2016-02-16 21:51:19'); +INSERT INTO `uniqueiddata` VALUES (1000236,'NOT_SET',0,0,'2016-02-16 21:57:09'); +INSERT INTO `uniqueiddata` VALUES (1000237,'NOT_SET',0,0,'2016-02-16 22:12:34'); +INSERT INTO `uniqueiddata` VALUES (1000238,'NOT_SET',0,0,'2016-02-16 22:12:45'); +INSERT INTO `uniqueiddata` VALUES (1000239,'NOT_SET',0,0,'2016-02-16 22:13:01'); +INSERT INTO `uniqueiddata` VALUES (1000240,'NOT_SET',0,0,'2016-02-16 22:13:08'); +INSERT INTO `uniqueiddata` VALUES (1000241,'NOT_SET',0,0,'2016-02-17 23:58:31'); +INSERT INTO `uniqueiddata` VALUES (1000242,'NOT_SET',0,0,'2016-02-17 23:58:38'); +INSERT INTO `uniqueiddata` VALUES (1000243,'NOT_SET',0,0,'2016-02-17 23:58:46'); +INSERT INTO `uniqueiddata` VALUES (1000244,'NOT_SET',0,0,'2016-02-18 00:00:21'); +INSERT INTO `uniqueiddata` VALUES (1000245,'NOT_SET',0,0,'2016-02-18 00:02:48'); +INSERT INTO `uniqueiddata` VALUES (1000246,'NOT_SET',0,0,'2016-02-18 00:05:42'); +INSERT INTO `uniqueiddata` VALUES (1000247,'NOT_SET',0,0,'2016-02-18 00:06:33'); +INSERT INTO `uniqueiddata` VALUES (1000248,'NOT_SET',0,0,'2016-02-18 00:11:51'); +INSERT INTO `uniqueiddata` VALUES (1000249,'NOT_SET',0,0,'2016-02-18 00:15:13'); +INSERT INTO `uniqueiddata` VALUES (1000250,'NOT_SET',0,0,'2016-02-18 00:20:42'); +INSERT INTO `uniqueiddata` VALUES (1000251,'NOT_SET',0,0,'2016-02-18 00:22:35'); +INSERT INTO `uniqueiddata` VALUES (1000252,'NOT_SET',0,0,'2016-02-18 00:29:39'); +INSERT INTO `uniqueiddata` VALUES (1000253,'NOT_SET',0,0,'2016-02-18 00:34:22'); +INSERT INTO `uniqueiddata` VALUES (1000254,'NOT_SET',0,0,'2016-02-18 00:35:05'); +INSERT INTO `uniqueiddata` VALUES (1000255,'NOT_SET',0,0,'2016-02-18 00:35:10'); +INSERT INTO `uniqueiddata` VALUES (1000256,'NOT_SET',0,0,'2016-02-18 00:35:14'); +INSERT INTO `uniqueiddata` VALUES (1000257,'NOT_SET',0,0,'2016-02-18 00:35:17'); +INSERT INTO `uniqueiddata` VALUES (1000258,'NOT_SET',0,0,'2016-02-18 00:35:22'); +INSERT INTO `uniqueiddata` VALUES (1000259,'NOT_SET',0,0,'2016-02-18 00:35:27'); +INSERT INTO `uniqueiddata` VALUES (1000260,'NOT_SET',0,0,'2016-02-18 00:35:37'); +INSERT INTO `uniqueiddata` VALUES (1000261,'NOT_SET',0,0,'2016-02-18 00:36:37'); +INSERT INTO `uniqueiddata` VALUES (1000262,'NOT_SET',0,0,'2016-02-18 00:36:48'); +INSERT INTO `uniqueiddata` VALUES (1000263,'NOT_SET',0,0,'2016-02-18 00:36:53'); +INSERT INTO `uniqueiddata` VALUES (1000264,'NOT_SET',0,0,'2016-02-18 00:36:57'); +INSERT INTO `uniqueiddata` VALUES (1000265,'NOT_SET',0,0,'2016-02-18 00:37:01'); +INSERT INTO `uniqueiddata` VALUES (1000266,'NOT_SET',0,0,'2016-02-18 00:37:05'); +INSERT INTO `uniqueiddata` VALUES (1000267,'NOT_SET',0,0,'2016-02-18 00:37:07'); +INSERT INTO `uniqueiddata` VALUES (1000268,'NOT_SET',0,0,'2016-02-18 00:37:20'); +INSERT INTO `uniqueiddata` VALUES (1000269,'NOT_SET',0,0,'2016-02-18 00:41:21'); +INSERT INTO `uniqueiddata` VALUES (1000270,'NOT_SET',0,0,'2016-02-18 00:41:55'); +INSERT INTO `uniqueiddata` VALUES (1000271,'NOT_SET',0,0,'2016-02-18 00:42:00'); +INSERT INTO `uniqueiddata` VALUES (1000272,'NOT_SET',0,0,'2016-02-18 00:42:03'); +INSERT INTO `uniqueiddata` VALUES (1000273,'NOT_SET',0,0,'2016-02-18 00:42:09'); +INSERT INTO `uniqueiddata` VALUES (1000274,'NOT_SET',0,0,'2016-02-18 00:43:13'); +INSERT INTO `uniqueiddata` VALUES (1000275,'NOT_SET',0,0,'2016-02-18 00:43:18'); +INSERT INTO `uniqueiddata` VALUES (1000276,'NOT_SET',0,0,'2016-02-18 00:44:32'); +INSERT INTO `uniqueiddata` VALUES (1000277,'NOT_SET',0,0,'2016-02-18 00:45:24'); +INSERT INTO `uniqueiddata` VALUES (1000278,'NOT_SET',0,0,'2016-02-18 17:38:42'); +INSERT INTO `uniqueiddata` VALUES (1000279,'NOT_SET',0,0,'2016-02-18 17:38:50'); +INSERT INTO `uniqueiddata` VALUES (1000280,'NOT_SET',0,0,'2016-02-18 17:38:59'); +INSERT INTO `uniqueiddata` VALUES (1000281,'NOT_SET',0,0,'2016-02-18 17:39:04'); +INSERT INTO `uniqueiddata` VALUES (1000282,'NOT_SET',0,0,'2016-02-18 17:39:12'); +INSERT INTO `uniqueiddata` VALUES (1000283,'NOT_SET',0,0,'2016-02-18 17:39:21'); +INSERT INTO `uniqueiddata` VALUES (1000284,'NOT_SET',0,0,'2016-02-18 17:39:37'); +INSERT INTO `uniqueiddata` VALUES (1000285,'NOT_SET',0,0,'2016-02-18 17:39:55'); +INSERT INTO `uniqueiddata` VALUES (1000286,'NOT_SET',0,0,'2016-02-18 17:40:03'); +INSERT INTO `uniqueiddata` VALUES (1000287,'NOT_SET',0,0,'2016-02-18 17:40:10'); +INSERT INTO `uniqueiddata` VALUES (1000288,'NOT_SET',0,0,'2016-02-18 17:40:24'); +INSERT INTO `uniqueiddata` VALUES (1000289,'NOT_SET',0,0,'2016-02-18 17:40:29'); +INSERT INTO `uniqueiddata` VALUES (1000290,'NOT_SET',0,0,'2016-02-18 17:40:32'); +INSERT INTO `uniqueiddata` VALUES (1000291,'NOT_SET',0,0,'2016-02-18 17:40:46'); +INSERT INTO `uniqueiddata` VALUES (1000292,'NOT_SET',0,0,'2016-02-18 17:41:00'); +INSERT INTO `uniqueiddata` VALUES (1000293,'NOT_SET',0,0,'2016-02-18 17:41:09'); +INSERT INTO `uniqueiddata` VALUES (1000294,'NOT_SET',0,0,'2016-02-18 17:41:12'); +INSERT INTO `uniqueiddata` VALUES (1000295,'NOT_SET',0,0,'2016-02-18 17:41:16'); +INSERT INTO `uniqueiddata` VALUES (1000296,'NOT_SET',0,0,'2016-02-18 17:41:44'); +INSERT INTO `uniqueiddata` VALUES (1000297,'NOT_SET',0,0,'2016-02-18 17:41:50'); +INSERT INTO `uniqueiddata` VALUES (1000298,'NOT_SET',0,0,'2016-02-18 17:41:54'); +INSERT INTO `uniqueiddata` VALUES (1000299,'NOT_SET',0,0,'2016-02-18 17:41:58'); +INSERT INTO `uniqueiddata` VALUES (1000300,'NOT_SET',0,0,'2016-02-18 17:42:02'); +INSERT INTO `uniqueiddata` VALUES (1000301,'NOT_SET',0,0,'2016-02-18 17:42:06'); +INSERT INTO `uniqueiddata` VALUES (1000302,'NOT_SET',0,0,'2016-02-18 17:42:11'); +INSERT INTO `uniqueiddata` VALUES (1000303,'NOT_SET',0,0,'2016-02-18 17:42:48'); +INSERT INTO `uniqueiddata` VALUES (1000304,'NOT_SET',0,0,'2016-02-18 17:42:52'); +INSERT INTO `uniqueiddata` VALUES (1000305,'NOT_SET',0,0,'2016-02-18 17:43:05'); +INSERT INTO `uniqueiddata` VALUES (1000306,'NOT_SET',0,0,'2016-02-18 17:43:11'); +INSERT INTO `uniqueiddata` VALUES (1000307,'NOT_SET',0,0,'2016-02-18 17:43:28'); +INSERT INTO `uniqueiddata` VALUES (1000308,'NOT_SET',0,0,'2016-02-18 17:43:38'); +INSERT INTO `uniqueiddata` VALUES (1000309,'NOT_SET',0,0,'2016-02-18 17:43:45'); +INSERT INTO `uniqueiddata` VALUES (1000310,'NOT_SET',0,0,'2016-02-18 17:43:47'); +INSERT INTO `uniqueiddata` VALUES (1000311,'NOT_SET',0,0,'2016-02-18 17:43:52'); +INSERT INTO `uniqueiddata` VALUES (1000312,'NOT_SET',0,0,'2016-02-18 17:43:57'); +INSERT INTO `uniqueiddata` VALUES (1000313,'NOT_SET',0,0,'2016-02-18 17:44:03'); +INSERT INTO `uniqueiddata` VALUES (1000314,'NOT_SET',0,0,'2016-02-18 17:44:10'); +INSERT INTO `uniqueiddata` VALUES (1000315,'NOT_SET',0,0,'2016-02-18 17:44:13'); +INSERT INTO `uniqueiddata` VALUES (1000316,'NOT_SET',0,0,'2016-02-18 17:44:17'); +INSERT INTO `uniqueiddata` VALUES (1000317,'NOT_SET',0,0,'2016-02-18 17:44:20'); +INSERT INTO `uniqueiddata` VALUES (1000318,'NOT_SET',0,0,'2016-02-18 17:44:29'); +INSERT INTO `uniqueiddata` VALUES (1000319,'NOT_SET',0,0,'2016-02-18 17:46:36'); +INSERT INTO `uniqueiddata` VALUES (1000320,'NOT_SET',0,0,'2016-02-18 17:46:46'); +INSERT INTO `uniqueiddata` VALUES (1000321,'NOT_SET',0,0,'2016-02-18 17:50:52'); +INSERT INTO `uniqueiddata` VALUES (1000322,'NOT_SET',0,0,'2016-02-18 17:50:59'); +INSERT INTO `uniqueiddata` VALUES (1000323,'NOT_SET',0,0,'2016-02-18 20:27:42'); +INSERT INTO `uniqueiddata` VALUES (1000324,'NOT_SET',0,0,'2016-02-18 20:28:24'); +INSERT INTO `uniqueiddata` VALUES (1000325,'NOT_SET',0,0,'2016-02-18 20:28:41'); +INSERT INTO `uniqueiddata` VALUES (1000326,'NOT_SET',0,0,'2016-02-18 20:30:27'); +INSERT INTO `uniqueiddata` VALUES (1000327,'NOT_SET',0,0,'2016-02-18 22:45:38'); +INSERT INTO `uniqueiddata` VALUES (1000328,'NOT_SET',0,0,'2016-02-18 22:46:11'); +INSERT INTO `uniqueiddata` VALUES (1000329,'NOT_SET',0,0,'2016-02-18 22:47:38'); +INSERT INTO `uniqueiddata` VALUES (1000330,'NOT_SET',0,0,'2016-02-18 22:47:50'); +INSERT INTO `uniqueiddata` VALUES (1000331,'NOT_SET',0,0,'2016-06-02 21:29:07'); +INSERT INTO `uniqueiddata` VALUES (1000332,'NOT_SET',0,0,'2016-06-02 21:29:07'); +INSERT INTO `uniqueiddata` VALUES (1000333,'NOT_SET',0,0,'2016-06-02 21:29:07'); +INSERT INTO `uniqueiddata` VALUES (1000334,'NOT_SET',0,0,'2016-06-02 21:29:07'); +INSERT INTO `uniqueiddata` VALUES (1000335,'NOT_SET',0,0,'2016-06-02 21:29:07'); +INSERT INTO `uniqueiddata` VALUES (1000336,'NOT_SET',0,0,'2016-06-02 21:31:00'); +INSERT INTO `uniqueiddata` VALUES (1000337,'NOT_SET',0,0,'2016-06-07 09:43:05'); +INSERT INTO `uniqueiddata` VALUES (1000338,'NOT_SET',0,0,'2016-06-07 09:44:38'); +INSERT INTO `uniqueiddata` VALUES (1000339,'NOT_SET',0,0,'2016-06-07 09:46:36'); +INSERT INTO `uniqueiddata` VALUES (1000340,'NOT_SET',0,0,'2016-06-07 10:04:57'); +INSERT INTO `uniqueiddata` VALUES (1000341,'NOT_SET',0,0,'2016-06-12 12:38:23'); +INSERT INTO `uniqueiddata` VALUES (1000342,'NOT_SET',0,0,'2016-06-12 12:38:23'); +INSERT INTO `uniqueiddata` VALUES (1000343,'NOT_SET',0,0,'2016-06-12 12:38:23'); +INSERT INTO `uniqueiddata` VALUES (1000344,'NOT_SET',0,0,'2016-06-12 12:38:23'); +INSERT INTO `uniqueiddata` VALUES (1000345,'NOT_SET',0,0,'2016-06-12 12:38:23'); +INSERT INTO `uniqueiddata` VALUES (1000346,'NOT_SET',0,0,'2016-06-12 14:09:36'); +INSERT INTO `uniqueiddata` VALUES (1000347,'NOT_SET',0,0,'2016-06-12 14:09:36'); +INSERT INTO `uniqueiddata` VALUES (1000348,'NOT_SET',0,0,'2016-06-12 14:09:36'); +INSERT INTO `uniqueiddata` VALUES (1000349,'NOT_SET',0,0,'2016-06-12 14:09:36'); +INSERT INTO `uniqueiddata` VALUES (1000350,'NOT_SET',0,0,'2016-06-12 14:09:36'); +INSERT INTO `uniqueiddata` VALUES (1000351,'NOT_SET',0,0,'2016-06-12 14:14:55'); +INSERT INTO `uniqueiddata` VALUES (1000352,'NOT_SET',0,0,'2016-06-14 10:55:22'); +INSERT INTO `uniqueiddata` VALUES (1000353,'NOT_SET',0,0,'2016-06-14 10:55:22'); +INSERT INTO `uniqueiddata` VALUES (1000354,'NOT_SET',0,0,'2016-06-14 10:55:22'); +INSERT INTO `uniqueiddata` VALUES (1000355,'NOT_SET',0,0,'2016-06-14 10:55:22'); +INSERT INTO `uniqueiddata` VALUES (1000356,'NOT_SET',0,0,'2016-06-14 10:55:22'); +INSERT INTO `uniqueiddata` VALUES (1000357,'NOT_SET',0,0,'2016-06-14 10:57:31'); +INSERT INTO `uniqueiddata` VALUES (1000358,'NOT_SET',0,0,'2016-06-24 17:11:46'); +INSERT INTO `uniqueiddata` VALUES (1000359,'NOT_SET',0,0,'2016-06-24 17:11:46'); +INSERT INTO `uniqueiddata` VALUES (1000360,'NOT_SET',0,0,'2016-06-24 17:11:46'); +INSERT INTO `uniqueiddata` VALUES (1000361,'NOT_SET',0,0,'2016-06-24 17:11:46'); +INSERT INTO `uniqueiddata` VALUES (1000362,'NOT_SET',0,0,'2016-06-24 17:11:46'); +INSERT INTO `uniqueiddata` VALUES (1000363,'NOT_SET',0,0,'2016-07-03 23:42:26'); +INSERT INTO `uniqueiddata` VALUES (1000364,'NOT_SET',0,0,'2016-07-03 23:42:26'); +INSERT INTO `uniqueiddata` VALUES (1000365,'NOT_SET',0,0,'2016-07-03 23:42:26'); +INSERT INTO `uniqueiddata` VALUES (1000366,'NOT_SET',0,0,'2016-07-03 23:42:26'); +INSERT INTO `uniqueiddata` VALUES (1000367,'NOT_SET',0,0,'2016-07-03 23:42:26'); +INSERT INTO `uniqueiddata` VALUES (1000368,'NOT_SET',0,0,'2016-07-03 23:44:12'); +INSERT INTO `uniqueiddata` VALUES (1000369,'NOT_SET',0,0,'2016-07-03 23:50:02'); +INSERT INTO `uniqueiddata` VALUES (1000370,'NOT_SET',0,0,'2016-07-03 23:50:02'); +INSERT INTO `uniqueiddata` VALUES (1000371,'NOT_SET',0,0,'2016-07-03 23:50:02'); +INSERT INTO `uniqueiddata` VALUES (1000372,'NOT_SET',0,0,'2016-07-03 23:50:02'); +INSERT INTO `uniqueiddata` VALUES (1000373,'NOT_SET',0,0,'2016-07-03 23:50:02'); +INSERT INTO `uniqueiddata` VALUES (1000374,'NOT_SET',0,0,'2016-07-05 18:50:51'); +INSERT INTO `uniqueiddata` VALUES (1000375,'NOT_SET',0,0,'2016-07-05 23:11:55'); +INSERT INTO `uniqueiddata` VALUES (1000376,'NOT_SET',0,0,'2016-07-05 23:11:55'); +INSERT INTO `uniqueiddata` VALUES (1000377,'NOT_SET',0,0,'2016-07-05 23:11:55'); +INSERT INTO `uniqueiddata` VALUES (1000378,'NOT_SET',0,0,'2016-07-05 23:11:55'); +INSERT INTO `uniqueiddata` VALUES (1000379,'NOT_SET',0,0,'2016-07-05 23:11:55'); +INSERT INTO `uniqueiddata` VALUES (1000380,'NOT_SET',0,0,'2016-07-05 23:15:14'); +INSERT INTO `uniqueiddata` VALUES (1000381,'NOT_SET',0,0,'2016-07-06 08:57:30'); +INSERT INTO `uniqueiddata` VALUES (1000382,'NOT_SET',0,0,'2016-07-06 08:57:30'); +INSERT INTO `uniqueiddata` VALUES (1000383,'NOT_SET',0,0,'2016-07-06 08:57:30'); +INSERT INTO `uniqueiddata` VALUES (1000384,'NOT_SET',0,0,'2016-07-06 08:57:30'); +INSERT INTO `uniqueiddata` VALUES (1000385,'NOT_SET',0,0,'2016-07-06 08:57:30'); +INSERT INTO `uniqueiddata` VALUES (1000386,'NOT_SET',0,0,'2016-07-06 08:58:55'); +INSERT INTO `uniqueiddata` VALUES (1000387,'NOT_SET',0,0,'2016-07-06 14:24:09'); +INSERT INTO `uniqueiddata` VALUES (1000388,'NOT_SET',0,0,'2016-07-06 14:24:09'); +INSERT INTO `uniqueiddata` VALUES (1000389,'NOT_SET',0,0,'2016-07-06 14:24:09'); +INSERT INTO `uniqueiddata` VALUES (1000390,'NOT_SET',0,0,'2016-07-06 14:24:09'); +INSERT INTO `uniqueiddata` VALUES (1000391,'NOT_SET',0,0,'2016-07-06 14:24:09'); +INSERT INTO `uniqueiddata` VALUES (1000392,'NOT_SET',0,0,'2016-07-06 14:25:57'); +INSERT INTO `uniqueiddata` VALUES (1000393,'NOT_SET',0,0,'2016-07-07 01:23:56'); +INSERT INTO `uniqueiddata` VALUES (1000394,'NOT_SET',0,0,'2016-07-07 01:23:56'); +INSERT INTO `uniqueiddata` VALUES (1000395,'NOT_SET',0,0,'2016-07-07 01:23:56'); +INSERT INTO `uniqueiddata` VALUES (1000396,'NOT_SET',0,0,'2016-07-07 01:23:56'); +INSERT INTO `uniqueiddata` VALUES (1000397,'NOT_SET',0,0,'2016-07-07 01:23:56'); +INSERT INTO `uniqueiddata` VALUES (1000398,'NOT_SET',0,0,'2016-07-07 01:45:10'); +INSERT INTO `uniqueiddata` VALUES (1000399,'NOT_SET',0,0,'2016-07-07 01:51:59'); +INSERT INTO `uniqueiddata` VALUES (1000400,'NOT_SET',0,0,'2016-07-07 01:51:59'); +INSERT INTO `uniqueiddata` VALUES (1000401,'NOT_SET',0,0,'2016-07-07 01:51:59'); +INSERT INTO `uniqueiddata` VALUES (1000402,'NOT_SET',0,0,'2016-07-07 01:51:59'); +INSERT INTO `uniqueiddata` VALUES (1000403,'NOT_SET',0,0,'2016-07-07 01:51:59'); +INSERT INTO `uniqueiddata` VALUES (1000404,'NOT_SET',0,0,'2016-07-07 01:53:28'); +INSERT INTO `uniqueiddata` VALUES (1000405,'NOT_SET',0,0,'2016-07-08 01:21:37'); +INSERT INTO `uniqueiddata` VALUES (1000406,'NOT_SET',0,0,'2016-07-08 01:21:37'); +INSERT INTO `uniqueiddata` VALUES (1000407,'NOT_SET',0,0,'2016-07-08 01:21:37'); +INSERT INTO `uniqueiddata` VALUES (1000408,'NOT_SET',0,0,'2016-07-08 01:21:37'); +INSERT INTO `uniqueiddata` VALUES (1000409,'NOT_SET',0,0,'2016-07-08 01:21:37'); +INSERT INTO `uniqueiddata` VALUES (1000410,'NOT_SET',0,0,'2016-07-08 01:23:17'); +INSERT INTO `uniqueiddata` VALUES (1000411,'NOT_SET',0,0,'2016-07-14 10:19:45'); +INSERT INTO `uniqueiddata` VALUES (1000412,'NOT_SET',0,0,'2016-07-14 10:19:45'); +INSERT INTO `uniqueiddata` VALUES (1000413,'NOT_SET',0,0,'2016-07-14 10:19:45'); +INSERT INTO `uniqueiddata` VALUES (1000414,'NOT_SET',0,0,'2016-07-14 10:19:45'); +INSERT INTO `uniqueiddata` VALUES (1000415,'NOT_SET',0,0,'2016-07-14 10:19:45'); +INSERT INTO `uniqueiddata` VALUES (1000416,'NOT_SET',0,0,'2016-07-14 10:21:22'); +INSERT INTO `uniqueiddata` VALUES (1000417,'NOT_SET',0,0,'2016-07-14 13:19:59'); +INSERT INTO `uniqueiddata` VALUES (1000418,'NOT_SET',0,0,'2016-07-14 13:19:59'); +INSERT INTO `uniqueiddata` VALUES (1000419,'NOT_SET',0,0,'2016-07-14 13:19:59'); +INSERT INTO `uniqueiddata` VALUES (1000420,'NOT_SET',0,0,'2016-07-14 13:19:59'); +INSERT INTO `uniqueiddata` VALUES (1000421,'NOT_SET',0,0,'2016-07-14 13:19:59'); +INSERT INTO `uniqueiddata` VALUES (1000422,'NOT_SET',0,0,'2016-07-14 13:22:36'); +INSERT INTO `uniqueiddata` VALUES (1000423,'NOT_SET',0,0,'2016-07-14 13:27:51'); +INSERT INTO `uniqueiddata` VALUES (1000424,'NOT_SET',0,0,'2016-07-14 13:27:51'); +INSERT INTO `uniqueiddata` VALUES (1000425,'NOT_SET',0,0,'2016-07-14 13:27:51'); +INSERT INTO `uniqueiddata` VALUES (1000426,'NOT_SET',0,0,'2016-07-14 13:27:51'); +INSERT INTO `uniqueiddata` VALUES (1000427,'NOT_SET',0,0,'2016-07-14 13:27:51'); +INSERT INTO `uniqueiddata` VALUES (1000428,'NOT_SET',0,0,'2016-07-14 13:29:27'); +INSERT INTO `uniqueiddata` VALUES (1000429,'NOT_SET',0,0,'2016-07-20 16:28:04'); +INSERT INTO `uniqueiddata` VALUES (1000430,'NOT_SET',0,0,'2016-07-20 16:28:04'); +INSERT INTO `uniqueiddata` VALUES (1000431,'NOT_SET',0,0,'2016-07-20 16:28:04'); +INSERT INTO `uniqueiddata` VALUES (1000432,'NOT_SET',0,0,'2016-07-20 16:28:04'); +INSERT INTO `uniqueiddata` VALUES (1000433,'NOT_SET',0,0,'2016-07-20 16:28:04'); +INSERT INTO `uniqueiddata` VALUES (1000434,'NOT_SET',0,0,'2016-07-20 17:16:05'); +INSERT INTO `uniqueiddata` VALUES (1000435,'NOT_SET',0,0,'2016-07-23 20:32:11'); +INSERT INTO `uniqueiddata` VALUES (1000436,'NOT_SET',0,0,'2016-07-23 20:32:11'); +INSERT INTO `uniqueiddata` VALUES (1000437,'NOT_SET',0,0,'2016-07-23 20:32:11'); +INSERT INTO `uniqueiddata` VALUES (1000438,'NOT_SET',0,0,'2016-07-23 20:32:11'); +INSERT INTO `uniqueiddata` VALUES (1000439,'NOT_SET',0,0,'2016-07-23 20:32:11'); +INSERT INTO `uniqueiddata` VALUES (1000440,'NOT_SET',0,0,'2016-07-23 20:54:37'); +INSERT INTO `uniqueiddata` VALUES (1000441,'NOT_SET',0,0,'2016-07-28 20:18:23'); +INSERT INTO `uniqueiddata` VALUES (1000442,'NOT_SET',0,0,'2016-07-28 20:18:23'); +INSERT INTO `uniqueiddata` VALUES (1000443,'NOT_SET',0,0,'2016-07-28 20:18:23'); +INSERT INTO `uniqueiddata` VALUES (1000444,'NOT_SET',0,0,'2016-07-28 20:18:23'); +INSERT INTO `uniqueiddata` VALUES (1000445,'NOT_SET',0,0,'2016-07-28 20:18:23'); +INSERT INTO `uniqueiddata` VALUES (1000446,'NOT_SET',0,0,'2016-07-28 20:20:56'); +/*!40000 ALTER TABLE `uniqueiddata` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2016-12-09 17:37:16 diff --git a/sql/update.sql b/sql/update.sql new file mode 100644 index 00000000..3f748514 --- /dev/null +++ b/sql/update.sql @@ -0,0 +1,27 @@ +RENAME TABLE `dbaccounts` TO `accounts`; +RENAME TABLE `dbbattlenpc` TO `battlenpc`; +RENAME TABLE `dbchara` TO `charabase`; +RENAME TABLE `dbcharapcclass` TO `characlass`; +RENAME TABLE `dbcharapc` TO `charadetail`; +RENAME TABLE `dbcharaitems` TO `charaglobalitem`; +RENAME TABLE `dbcharainfoblacklist` TO `charainfoblacklist`; +RENAME TABLE `dbcharainfofriendlist` TO `charainfofriendlist`; +RENAME TABLE `dbcharainfolinkshell` TO `charainfolinkshell`; +RENAME TABLE `dbcharainfoprofile` TO `charainfosearch`; +RENAME TABLE `dbcharaitemcrystal` TO `charaitemcrystal`; +RENAME TABLE `dbcharaitemcurrency` TO `charaitemcurrency`; +RENAME TABLE `dbcharaitemmannequin` TO `charaitemgearset`; +RENAME TABLE `dbcharaitembaggage` TO `charaiteminventory`; +RENAME TABLE `dbcharaquest` TO `charaquest`; +RENAME TABLE `dbdiscoveryref` TO `discoveryinfo`; +RENAME TABLE `dbinfolinkshell` TO `infolinkshell`; +RENAME TABLE `dbuniqueiddata` TO `uniqueiddata`; +RENAME TABLE `dbzonemapping` TO `zonemapping`; +RENAME TABLE `dbzonepositions` TO `zonepositions`; +RENAME TABLE `dbzoneservers` TO `zoneservers`; + +ALTER TABLE `charaiteminventory` ADD `container_25` INT(20) NOT NULL AFTER `container_24`, ADD `container_26` INT(20) NOT NULL AFTER `container_25`, ADD `container_27` INT(20) NOT NULL AFTER `container_26`, ADD `container_28` INT(20) NOT NULL AFTER `container_27`, ADD `container_29` INT(20) NOT NULL AFTER `container_28`, ADD `container_30` INT(20) NOT NULL AFTER `container_29`, ADD `container_31` INT(20) NOT NULL AFTER `container_30`, ADD `container_32` INT(20) NOT NULL AFTER `container_31`, ADD `container_33` INT(20) NOT NULL AFTER `container_32`, ADD `container_34` INT(20) NOT NULL AFTER `container_33`; + +ALTER TABLE `characlass` ADD `Lv_24` INT(5) NOT NULL DEFAULT '0' AFTER `Exp_23`, ADD `Exp_24` INT(10) NOT NULL DEFAULT '0' AFTER `Lv_24`, ADD `Lv_25` INT(5) NOT NULL DEFAULT '0' AFTER `Exp_24`, ADD `Exp_25` INT(19) NOT NULL DEFAULT '0' AFTER `Lv_25`; + +ALTER TABLE `charadetail` CHANGE `Aetheryte` `Aetheryte` BINARY(16) NULL DEFAULT NULL, CHANGE `HowTo` `HowTo` BINARY(33) NULL DEFAULT NULL, CHANGE `Minions` `Minions` BINARY(33) NULL DEFAULT NULL, CHANGE `Mounts` `Mounts` BINARY(13) NULL DEFAULT NULL; \ No newline at end of file diff --git a/sql/zonemapping.sql b/sql/zonemapping.sql new file mode 100644 index 00000000..34dfc581 --- /dev/null +++ b/sql/zonemapping.sql @@ -0,0 +1,525 @@ +-- MySQL dump 10.13 Distrib 5.7.13, for Win64 (x86_64) +-- +-- Host: localhost Database: sapphire +-- ------------------------------------------------------ +-- Server version 5.7.13-log + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `zonemapping` +-- + +DROP TABLE IF EXISTS `zonemapping`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `zonemapping` ( + `serverid` int(3) NOT NULL, + `zoneid` int(3) NOT NULL, + `flags` int(19) DEFAULT NULL, + PRIMARY KEY (`zoneid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `zonemapping` +-- + +LOCK TABLES `zonemapping` WRITE; +/*!40000 ALTER TABLE `zonemapping` DISABLE KEYS */; +INSERT INTO `zonemapping` VALUES (100,1,0); +INSERT INTO `zonemapping` VALUES (100,2,0); +INSERT INTO `zonemapping` VALUES (100,3,0); +INSERT INTO `zonemapping` VALUES (100,4,0); +INSERT INTO `zonemapping` VALUES (100,5,0); +INSERT INTO `zonemapping` VALUES (100,6,0); +INSERT INTO `zonemapping` VALUES (100,7,0); +INSERT INTO `zonemapping` VALUES (100,8,0); +INSERT INTO `zonemapping` VALUES (100,9,0); +INSERT INTO `zonemapping` VALUES (100,10,0); +INSERT INTO `zonemapping` VALUES (100,11,0); +INSERT INTO `zonemapping` VALUES (100,13,0); +INSERT INTO `zonemapping` VALUES (100,14,0); +INSERT INTO `zonemapping` VALUES (100,15,0); +INSERT INTO `zonemapping` VALUES (100,16,0); +INSERT INTO `zonemapping` VALUES (100,17,0); +INSERT INTO `zonemapping` VALUES (100,18,0); +INSERT INTO `zonemapping` VALUES (100,19,0); +INSERT INTO `zonemapping` VALUES (100,20,0); +INSERT INTO `zonemapping` VALUES (100,21,0); +INSERT INTO `zonemapping` VALUES (100,22,0); +INSERT INTO `zonemapping` VALUES (100,24,0); +INSERT INTO `zonemapping` VALUES (100,25,0); +INSERT INTO `zonemapping` VALUES (100,26,0); +INSERT INTO `zonemapping` VALUES (100,27,0); +INSERT INTO `zonemapping` VALUES (100,28,0); +INSERT INTO `zonemapping` VALUES (100,128,0); +INSERT INTO `zonemapping` VALUES (100,129,0); +INSERT INTO `zonemapping` VALUES (100,130,0); +INSERT INTO `zonemapping` VALUES (100,131,0); +INSERT INTO `zonemapping` VALUES (100,132,0); +INSERT INTO `zonemapping` VALUES (100,133,0); +INSERT INTO `zonemapping` VALUES (100,134,0); +INSERT INTO `zonemapping` VALUES (100,135,0); +INSERT INTO `zonemapping` VALUES (100,136,0); +INSERT INTO `zonemapping` VALUES (100,137,0); +INSERT INTO `zonemapping` VALUES (100,138,0); +INSERT INTO `zonemapping` VALUES (100,139,0); +INSERT INTO `zonemapping` VALUES (100,140,0); +INSERT INTO `zonemapping` VALUES (100,141,0); +INSERT INTO `zonemapping` VALUES (100,142,0); +INSERT INTO `zonemapping` VALUES (100,143,0); +INSERT INTO `zonemapping` VALUES (100,144,0); +INSERT INTO `zonemapping` VALUES (100,145,0); +INSERT INTO `zonemapping` VALUES (100,146,0); +INSERT INTO `zonemapping` VALUES (100,147,0); +INSERT INTO `zonemapping` VALUES (100,148,0); +INSERT INTO `zonemapping` VALUES (100,149,0); +INSERT INTO `zonemapping` VALUES (100,150,0); +INSERT INTO `zonemapping` VALUES (100,151,0); +INSERT INTO `zonemapping` VALUES (100,152,0); +INSERT INTO `zonemapping` VALUES (100,153,0); +INSERT INTO `zonemapping` VALUES (100,154,0); +INSERT INTO `zonemapping` VALUES (100,155,0); +INSERT INTO `zonemapping` VALUES (100,156,0); +INSERT INTO `zonemapping` VALUES (100,157,0); +INSERT INTO `zonemapping` VALUES (100,158,0); +INSERT INTO `zonemapping` VALUES (100,159,0); +INSERT INTO `zonemapping` VALUES (100,160,0); +INSERT INTO `zonemapping` VALUES (100,161,0); +INSERT INTO `zonemapping` VALUES (100,162,0); +INSERT INTO `zonemapping` VALUES (100,163,0); +INSERT INTO `zonemapping` VALUES (100,164,0); +INSERT INTO `zonemapping` VALUES (100,166,0); +INSERT INTO `zonemapping` VALUES (100,167,0); +INSERT INTO `zonemapping` VALUES (100,168,0); +INSERT INTO `zonemapping` VALUES (100,169,0); +INSERT INTO `zonemapping` VALUES (100,170,0); +INSERT INTO `zonemapping` VALUES (100,171,0); +INSERT INTO `zonemapping` VALUES (100,172,0); +INSERT INTO `zonemapping` VALUES (100,174,0); +INSERT INTO `zonemapping` VALUES (100,175,0); +INSERT INTO `zonemapping` VALUES (100,176,0); +INSERT INTO `zonemapping` VALUES (100,177,0); +INSERT INTO `zonemapping` VALUES (100,178,0); +INSERT INTO `zonemapping` VALUES (100,179,0); +INSERT INTO `zonemapping` VALUES (100,180,0); +INSERT INTO `zonemapping` VALUES (100,181,0); +INSERT INTO `zonemapping` VALUES (100,182,0); +INSERT INTO `zonemapping` VALUES (100,183,0); +INSERT INTO `zonemapping` VALUES (100,184,0); +INSERT INTO `zonemapping` VALUES (100,185,0); +INSERT INTO `zonemapping` VALUES (100,186,0); +INSERT INTO `zonemapping` VALUES (100,187,0); +INSERT INTO `zonemapping` VALUES (100,188,0); +INSERT INTO `zonemapping` VALUES (100,189,0); +INSERT INTO `zonemapping` VALUES (100,190,0); +INSERT INTO `zonemapping` VALUES (100,191,0); +INSERT INTO `zonemapping` VALUES (100,192,0); +INSERT INTO `zonemapping` VALUES (100,193,0); +INSERT INTO `zonemapping` VALUES (100,194,0); +INSERT INTO `zonemapping` VALUES (100,195,0); +INSERT INTO `zonemapping` VALUES (100,196,0); +INSERT INTO `zonemapping` VALUES (100,197,0); +INSERT INTO `zonemapping` VALUES (100,198,0); +INSERT INTO `zonemapping` VALUES (100,199,0); +INSERT INTO `zonemapping` VALUES (100,200,0); +INSERT INTO `zonemapping` VALUES (100,201,0); +INSERT INTO `zonemapping` VALUES (100,202,0); +INSERT INTO `zonemapping` VALUES (100,203,0); +INSERT INTO `zonemapping` VALUES (100,204,0); +INSERT INTO `zonemapping` VALUES (100,205,0); +INSERT INTO `zonemapping` VALUES (100,206,0); +INSERT INTO `zonemapping` VALUES (100,207,0); +INSERT INTO `zonemapping` VALUES (100,208,0); +INSERT INTO `zonemapping` VALUES (100,209,0); +INSERT INTO `zonemapping` VALUES (100,210,0); +INSERT INTO `zonemapping` VALUES (100,211,0); +INSERT INTO `zonemapping` VALUES (100,212,0); +INSERT INTO `zonemapping` VALUES (100,213,0); +INSERT INTO `zonemapping` VALUES (100,214,0); +INSERT INTO `zonemapping` VALUES (100,215,0); +INSERT INTO `zonemapping` VALUES (100,216,0); +INSERT INTO `zonemapping` VALUES (100,217,0); +INSERT INTO `zonemapping` VALUES (100,218,0); +INSERT INTO `zonemapping` VALUES (100,219,0); +INSERT INTO `zonemapping` VALUES (100,220,0); +INSERT INTO `zonemapping` VALUES (100,221,0); +INSERT INTO `zonemapping` VALUES (100,222,0); +INSERT INTO `zonemapping` VALUES (100,223,0); +INSERT INTO `zonemapping` VALUES (100,224,0); +INSERT INTO `zonemapping` VALUES (100,225,0); +INSERT INTO `zonemapping` VALUES (100,226,0); +INSERT INTO `zonemapping` VALUES (100,227,0); +INSERT INTO `zonemapping` VALUES (100,228,0); +INSERT INTO `zonemapping` VALUES (100,229,0); +INSERT INTO `zonemapping` VALUES (100,230,0); +INSERT INTO `zonemapping` VALUES (100,231,0); +INSERT INTO `zonemapping` VALUES (100,232,0); +INSERT INTO `zonemapping` VALUES (100,233,0); +INSERT INTO `zonemapping` VALUES (100,234,0); +INSERT INTO `zonemapping` VALUES (100,235,0); +INSERT INTO `zonemapping` VALUES (100,236,0); +INSERT INTO `zonemapping` VALUES (100,237,0); +INSERT INTO `zonemapping` VALUES (100,238,0); +INSERT INTO `zonemapping` VALUES (100,239,0); +INSERT INTO `zonemapping` VALUES (100,240,0); +INSERT INTO `zonemapping` VALUES (100,241,0); +INSERT INTO `zonemapping` VALUES (100,242,0); +INSERT INTO `zonemapping` VALUES (100,243,0); +INSERT INTO `zonemapping` VALUES (100,244,0); +INSERT INTO `zonemapping` VALUES (100,245,0); +INSERT INTO `zonemapping` VALUES (100,246,0); +INSERT INTO `zonemapping` VALUES (100,247,0); +INSERT INTO `zonemapping` VALUES (100,248,0); +INSERT INTO `zonemapping` VALUES (100,249,0); +INSERT INTO `zonemapping` VALUES (100,250,0); +INSERT INTO `zonemapping` VALUES (100,251,0); +INSERT INTO `zonemapping` VALUES (100,252,0); +INSERT INTO `zonemapping` VALUES (100,253,0); +INSERT INTO `zonemapping` VALUES (100,254,0); +INSERT INTO `zonemapping` VALUES (100,255,0); +INSERT INTO `zonemapping` VALUES (100,256,0); +INSERT INTO `zonemapping` VALUES (100,257,0); +INSERT INTO `zonemapping` VALUES (100,258,0); +INSERT INTO `zonemapping` VALUES (100,259,0); +INSERT INTO `zonemapping` VALUES (100,260,0); +INSERT INTO `zonemapping` VALUES (100,261,0); +INSERT INTO `zonemapping` VALUES (100,262,0); +INSERT INTO `zonemapping` VALUES (100,263,0); +INSERT INTO `zonemapping` VALUES (100,264,0); +INSERT INTO `zonemapping` VALUES (100,265,0); +INSERT INTO `zonemapping` VALUES (100,266,0); +INSERT INTO `zonemapping` VALUES (100,267,0); +INSERT INTO `zonemapping` VALUES (100,268,0); +INSERT INTO `zonemapping` VALUES (100,269,0); +INSERT INTO `zonemapping` VALUES (100,270,0); +INSERT INTO `zonemapping` VALUES (100,271,0); +INSERT INTO `zonemapping` VALUES (100,272,0); +INSERT INTO `zonemapping` VALUES (100,273,0); +INSERT INTO `zonemapping` VALUES (100,274,0); +INSERT INTO `zonemapping` VALUES (100,275,0); +INSERT INTO `zonemapping` VALUES (100,276,0); +INSERT INTO `zonemapping` VALUES (100,277,0); +INSERT INTO `zonemapping` VALUES (100,278,0); +INSERT INTO `zonemapping` VALUES (100,279,0); +INSERT INTO `zonemapping` VALUES (100,280,0); +INSERT INTO `zonemapping` VALUES (100,281,0); +INSERT INTO `zonemapping` VALUES (100,282,0); +INSERT INTO `zonemapping` VALUES (100,283,0); +INSERT INTO `zonemapping` VALUES (100,284,0); +INSERT INTO `zonemapping` VALUES (100,285,0); +INSERT INTO `zonemapping` VALUES (100,286,0); +INSERT INTO `zonemapping` VALUES (100,287,0); +INSERT INTO `zonemapping` VALUES (100,288,0); +INSERT INTO `zonemapping` VALUES (100,289,0); +INSERT INTO `zonemapping` VALUES (100,290,0); +INSERT INTO `zonemapping` VALUES (100,291,0); +INSERT INTO `zonemapping` VALUES (100,292,0); +INSERT INTO `zonemapping` VALUES (100,293,0); +INSERT INTO `zonemapping` VALUES (100,294,0); +INSERT INTO `zonemapping` VALUES (100,295,0); +INSERT INTO `zonemapping` VALUES (100,296,0); +INSERT INTO `zonemapping` VALUES (100,297,0); +INSERT INTO `zonemapping` VALUES (100,298,0); +INSERT INTO `zonemapping` VALUES (100,299,0); +INSERT INTO `zonemapping` VALUES (100,300,0); +INSERT INTO `zonemapping` VALUES (100,301,0); +INSERT INTO `zonemapping` VALUES (100,302,0); +INSERT INTO `zonemapping` VALUES (100,303,0); +INSERT INTO `zonemapping` VALUES (100,304,0); +INSERT INTO `zonemapping` VALUES (100,305,0); +INSERT INTO `zonemapping` VALUES (100,306,0); +INSERT INTO `zonemapping` VALUES (100,307,0); +INSERT INTO `zonemapping` VALUES (100,308,0); +INSERT INTO `zonemapping` VALUES (100,309,0); +INSERT INTO `zonemapping` VALUES (100,310,0); +INSERT INTO `zonemapping` VALUES (100,311,0); +INSERT INTO `zonemapping` VALUES (100,312,0); +INSERT INTO `zonemapping` VALUES (100,313,0); +INSERT INTO `zonemapping` VALUES (100,314,0); +INSERT INTO `zonemapping` VALUES (100,315,0); +INSERT INTO `zonemapping` VALUES (100,316,0); +INSERT INTO `zonemapping` VALUES (100,317,0); +INSERT INTO `zonemapping` VALUES (100,318,0); +INSERT INTO `zonemapping` VALUES (100,319,0); +INSERT INTO `zonemapping` VALUES (100,320,0); +INSERT INTO `zonemapping` VALUES (100,321,0); +INSERT INTO `zonemapping` VALUES (100,322,0); +INSERT INTO `zonemapping` VALUES (100,323,0); +INSERT INTO `zonemapping` VALUES (100,324,0); +INSERT INTO `zonemapping` VALUES (100,325,0); +INSERT INTO `zonemapping` VALUES (100,326,0); +INSERT INTO `zonemapping` VALUES (100,327,0); +INSERT INTO `zonemapping` VALUES (100,328,0); +INSERT INTO `zonemapping` VALUES (100,329,0); +INSERT INTO `zonemapping` VALUES (100,330,0); +INSERT INTO `zonemapping` VALUES (100,331,0); +INSERT INTO `zonemapping` VALUES (100,332,0); +INSERT INTO `zonemapping` VALUES (100,333,0); +INSERT INTO `zonemapping` VALUES (100,334,0); +INSERT INTO `zonemapping` VALUES (100,335,0); +INSERT INTO `zonemapping` VALUES (100,336,0); +INSERT INTO `zonemapping` VALUES (100,337,0); +INSERT INTO `zonemapping` VALUES (100,338,0); +INSERT INTO `zonemapping` VALUES (100,339,0); +INSERT INTO `zonemapping` VALUES (100,340,0); +INSERT INTO `zonemapping` VALUES (100,341,0); +INSERT INTO `zonemapping` VALUES (100,342,0); +INSERT INTO `zonemapping` VALUES (100,343,0); +INSERT INTO `zonemapping` VALUES (100,344,0); +INSERT INTO `zonemapping` VALUES (100,345,0); +INSERT INTO `zonemapping` VALUES (100,346,0); +INSERT INTO `zonemapping` VALUES (100,347,0); +INSERT INTO `zonemapping` VALUES (100,348,0); +INSERT INTO `zonemapping` VALUES (100,349,0); +INSERT INTO `zonemapping` VALUES (100,350,0); +INSERT INTO `zonemapping` VALUES (100,351,0); +INSERT INTO `zonemapping` VALUES (100,352,0); +INSERT INTO `zonemapping` VALUES (100,353,0); +INSERT INTO `zonemapping` VALUES (100,354,0); +INSERT INTO `zonemapping` VALUES (100,355,0); +INSERT INTO `zonemapping` VALUES (100,356,0); +INSERT INTO `zonemapping` VALUES (100,357,0); +INSERT INTO `zonemapping` VALUES (100,358,0); +INSERT INTO `zonemapping` VALUES (100,359,0); +INSERT INTO `zonemapping` VALUES (100,360,0); +INSERT INTO `zonemapping` VALUES (100,361,0); +INSERT INTO `zonemapping` VALUES (100,362,0); +INSERT INTO `zonemapping` VALUES (100,363,0); +INSERT INTO `zonemapping` VALUES (100,364,0); +INSERT INTO `zonemapping` VALUES (100,365,0); +INSERT INTO `zonemapping` VALUES (100,366,0); +INSERT INTO `zonemapping` VALUES (100,367,0); +INSERT INTO `zonemapping` VALUES (100,368,0); +INSERT INTO `zonemapping` VALUES (100,369,0); +INSERT INTO `zonemapping` VALUES (100,370,0); +INSERT INTO `zonemapping` VALUES (100,371,0); +INSERT INTO `zonemapping` VALUES (100,372,0); +INSERT INTO `zonemapping` VALUES (100,373,0); +INSERT INTO `zonemapping` VALUES (100,374,0); +INSERT INTO `zonemapping` VALUES (100,375,0); +INSERT INTO `zonemapping` VALUES (100,376,0); +INSERT INTO `zonemapping` VALUES (100,377,0); +INSERT INTO `zonemapping` VALUES (100,378,0); +INSERT INTO `zonemapping` VALUES (100,379,0); +INSERT INTO `zonemapping` VALUES (100,380,0); +INSERT INTO `zonemapping` VALUES (100,381,0); +INSERT INTO `zonemapping` VALUES (100,382,0); +INSERT INTO `zonemapping` VALUES (100,383,0); +INSERT INTO `zonemapping` VALUES (100,384,0); +INSERT INTO `zonemapping` VALUES (100,385,0); +INSERT INTO `zonemapping` VALUES (100,386,0); +INSERT INTO `zonemapping` VALUES (100,387,0); +INSERT INTO `zonemapping` VALUES (100,388,0); +INSERT INTO `zonemapping` VALUES (100,389,0); +INSERT INTO `zonemapping` VALUES (100,390,0); +INSERT INTO `zonemapping` VALUES (100,391,0); +INSERT INTO `zonemapping` VALUES (100,392,0); +INSERT INTO `zonemapping` VALUES (100,393,0); +INSERT INTO `zonemapping` VALUES (100,394,0); +INSERT INTO `zonemapping` VALUES (100,395,0); +INSERT INTO `zonemapping` VALUES (100,396,0); +INSERT INTO `zonemapping` VALUES (100,397,0); +INSERT INTO `zonemapping` VALUES (100,398,0); +INSERT INTO `zonemapping` VALUES (100,399,0); +INSERT INTO `zonemapping` VALUES (100,400,0); +INSERT INTO `zonemapping` VALUES (100,401,0); +INSERT INTO `zonemapping` VALUES (100,402,0); +INSERT INTO `zonemapping` VALUES (100,404,0); +INSERT INTO `zonemapping` VALUES (100,405,0); +INSERT INTO `zonemapping` VALUES (100,406,0); +INSERT INTO `zonemapping` VALUES (100,407,0); +INSERT INTO `zonemapping` VALUES (100,408,0); +INSERT INTO `zonemapping` VALUES (100,409,0); +INSERT INTO `zonemapping` VALUES (100,410,0); +INSERT INTO `zonemapping` VALUES (100,411,0); +INSERT INTO `zonemapping` VALUES (100,412,0); +INSERT INTO `zonemapping` VALUES (100,413,0); +INSERT INTO `zonemapping` VALUES (100,414,0); +INSERT INTO `zonemapping` VALUES (100,415,0); +INSERT INTO `zonemapping` VALUES (100,416,0); +INSERT INTO `zonemapping` VALUES (100,417,0); +INSERT INTO `zonemapping` VALUES (100,418,0); +INSERT INTO `zonemapping` VALUES (100,419,0); +INSERT INTO `zonemapping` VALUES (100,420,0); +INSERT INTO `zonemapping` VALUES (100,421,0); +INSERT INTO `zonemapping` VALUES (100,422,0); +INSERT INTO `zonemapping` VALUES (100,423,0); +INSERT INTO `zonemapping` VALUES (100,424,0); +INSERT INTO `zonemapping` VALUES (100,425,0); +INSERT INTO `zonemapping` VALUES (100,426,0); +INSERT INTO `zonemapping` VALUES (100,427,0); +INSERT INTO `zonemapping` VALUES (100,428,0); +INSERT INTO `zonemapping` VALUES (100,429,0); +INSERT INTO `zonemapping` VALUES (100,430,0); +INSERT INTO `zonemapping` VALUES (100,431,0); +INSERT INTO `zonemapping` VALUES (100,432,0); +INSERT INTO `zonemapping` VALUES (100,433,0); +INSERT INTO `zonemapping` VALUES (100,434,0); +INSERT INTO `zonemapping` VALUES (100,435,0); +INSERT INTO `zonemapping` VALUES (100,436,0); +INSERT INTO `zonemapping` VALUES (100,437,0); +INSERT INTO `zonemapping` VALUES (100,438,0); +INSERT INTO `zonemapping` VALUES (100,439,0); +INSERT INTO `zonemapping` VALUES (100,440,0); +INSERT INTO `zonemapping` VALUES (100,441,0); +INSERT INTO `zonemapping` VALUES (100,442,0); +INSERT INTO `zonemapping` VALUES (100,443,0); +INSERT INTO `zonemapping` VALUES (100,444,0); +INSERT INTO `zonemapping` VALUES (100,445,0); +INSERT INTO `zonemapping` VALUES (100,446,0); +INSERT INTO `zonemapping` VALUES (100,447,0); +INSERT INTO `zonemapping` VALUES (100,448,0); +INSERT INTO `zonemapping` VALUES (100,449,0); +INSERT INTO `zonemapping` VALUES (100,450,0); +INSERT INTO `zonemapping` VALUES (100,451,0); +INSERT INTO `zonemapping` VALUES (100,452,0); +INSERT INTO `zonemapping` VALUES (100,453,0); +INSERT INTO `zonemapping` VALUES (100,454,0); +INSERT INTO `zonemapping` VALUES (100,455,0); +INSERT INTO `zonemapping` VALUES (100,456,0); +INSERT INTO `zonemapping` VALUES (100,457,0); +INSERT INTO `zonemapping` VALUES (100,458,0); +INSERT INTO `zonemapping` VALUES (100,459,0); +INSERT INTO `zonemapping` VALUES (100,460,0); +INSERT INTO `zonemapping` VALUES (100,461,0); +INSERT INTO `zonemapping` VALUES (100,462,0); +INSERT INTO `zonemapping` VALUES (100,463,0); +INSERT INTO `zonemapping` VALUES (100,464,0); +INSERT INTO `zonemapping` VALUES (100,465,0); +INSERT INTO `zonemapping` VALUES (100,466,0); +INSERT INTO `zonemapping` VALUES (100,467,0); +INSERT INTO `zonemapping` VALUES (100,468,0); +INSERT INTO `zonemapping` VALUES (100,469,0); +INSERT INTO `zonemapping` VALUES (100,470,0); +INSERT INTO `zonemapping` VALUES (100,471,0); +INSERT INTO `zonemapping` VALUES (100,472,0); +INSERT INTO `zonemapping` VALUES (100,473,0); +INSERT INTO `zonemapping` VALUES (100,474,0); +INSERT INTO `zonemapping` VALUES (100,475,0); +INSERT INTO `zonemapping` VALUES (100,476,0); +INSERT INTO `zonemapping` VALUES (100,477,0); +INSERT INTO `zonemapping` VALUES (100,478,0); +INSERT INTO `zonemapping` VALUES (100,479,0); +INSERT INTO `zonemapping` VALUES (100,480,0); +INSERT INTO `zonemapping` VALUES (100,481,0); +INSERT INTO `zonemapping` VALUES (100,482,0); +INSERT INTO `zonemapping` VALUES (100,483,0); +INSERT INTO `zonemapping` VALUES (100,484,0); +INSERT INTO `zonemapping` VALUES (100,485,0); +INSERT INTO `zonemapping` VALUES (100,486,0); +INSERT INTO `zonemapping` VALUES (100,487,0); +INSERT INTO `zonemapping` VALUES (100,488,0); +INSERT INTO `zonemapping` VALUES (100,489,0); +INSERT INTO `zonemapping` VALUES (100,490,0); +INSERT INTO `zonemapping` VALUES (100,491,0); +INSERT INTO `zonemapping` VALUES (100,492,0); +INSERT INTO `zonemapping` VALUES (100,493,0); +INSERT INTO `zonemapping` VALUES (100,494,0); +INSERT INTO `zonemapping` VALUES (100,495,0); +INSERT INTO `zonemapping` VALUES (100,496,0); +INSERT INTO `zonemapping` VALUES (100,497,0); +INSERT INTO `zonemapping` VALUES (100,498,0); +INSERT INTO `zonemapping` VALUES (100,499,0); +INSERT INTO `zonemapping` VALUES (100,500,0); +INSERT INTO `zonemapping` VALUES (100,501,0); +INSERT INTO `zonemapping` VALUES (100,502,0); +INSERT INTO `zonemapping` VALUES (100,503,0); +INSERT INTO `zonemapping` VALUES (100,504,0); +INSERT INTO `zonemapping` VALUES (100,505,0); +INSERT INTO `zonemapping` VALUES (100,506,0); +INSERT INTO `zonemapping` VALUES (100,507,0); +INSERT INTO `zonemapping` VALUES (100,508,0); +INSERT INTO `zonemapping` VALUES (100,509,0); +INSERT INTO `zonemapping` VALUES (100,510,0); +INSERT INTO `zonemapping` VALUES (100,511,0); +INSERT INTO `zonemapping` VALUES (100,512,0); +INSERT INTO `zonemapping` VALUES (100,513,0); +INSERT INTO `zonemapping` VALUES (100,514,0); +INSERT INTO `zonemapping` VALUES (100,515,0); +INSERT INTO `zonemapping` VALUES (100,516,0); +INSERT INTO `zonemapping` VALUES (100,517,0); +INSERT INTO `zonemapping` VALUES (100,518,0); +INSERT INTO `zonemapping` VALUES (100,519,0); +INSERT INTO `zonemapping` VALUES (100,520,0); +INSERT INTO `zonemapping` VALUES (100,521,0); +INSERT INTO `zonemapping` VALUES (100,522,0); +INSERT INTO `zonemapping` VALUES (100,523,0); +INSERT INTO `zonemapping` VALUES (100,524,0); +INSERT INTO `zonemapping` VALUES (100,525,0); +INSERT INTO `zonemapping` VALUES (100,526,0); +INSERT INTO `zonemapping` VALUES (100,527,0); +INSERT INTO `zonemapping` VALUES (100,528,0); +INSERT INTO `zonemapping` VALUES (100,529,0); +INSERT INTO `zonemapping` VALUES (100,530,0); +INSERT INTO `zonemapping` VALUES (100,531,0); +INSERT INTO `zonemapping` VALUES (100,532,0); +INSERT INTO `zonemapping` VALUES (100,533,0); +INSERT INTO `zonemapping` VALUES (100,534,0); +INSERT INTO `zonemapping` VALUES (100,535,0); +INSERT INTO `zonemapping` VALUES (100,536,0); +INSERT INTO `zonemapping` VALUES (100,537,0); +INSERT INTO `zonemapping` VALUES (100,538,0); +INSERT INTO `zonemapping` VALUES (100,539,0); +INSERT INTO `zonemapping` VALUES (100,540,0); +INSERT INTO `zonemapping` VALUES (100,541,0); +INSERT INTO `zonemapping` VALUES (100,542,0); +INSERT INTO `zonemapping` VALUES (100,543,0); +INSERT INTO `zonemapping` VALUES (100,544,0); +INSERT INTO `zonemapping` VALUES (100,545,0); +INSERT INTO `zonemapping` VALUES (100,546,0); +INSERT INTO `zonemapping` VALUES (100,547,0); +INSERT INTO `zonemapping` VALUES (100,548,0); +INSERT INTO `zonemapping` VALUES (100,549,0); +INSERT INTO `zonemapping` VALUES (100,550,0); +INSERT INTO `zonemapping` VALUES (100,551,0); +INSERT INTO `zonemapping` VALUES (100,552,0); +INSERT INTO `zonemapping` VALUES (100,553,0); +INSERT INTO `zonemapping` VALUES (100,554,0); +INSERT INTO `zonemapping` VALUES (100,555,0); +INSERT INTO `zonemapping` VALUES (100,556,0); +INSERT INTO `zonemapping` VALUES (100,557,0); +INSERT INTO `zonemapping` VALUES (100,558,0); +INSERT INTO `zonemapping` VALUES (100,559,0); +INSERT INTO `zonemapping` VALUES (100,560,0); +INSERT INTO `zonemapping` VALUES (100,561,0); +INSERT INTO `zonemapping` VALUES (100,562,0); +INSERT INTO `zonemapping` VALUES (100,563,0); +INSERT INTO `zonemapping` VALUES (100,564,0); +INSERT INTO `zonemapping` VALUES (100,565,0); +INSERT INTO `zonemapping` VALUES (100,566,0); +INSERT INTO `zonemapping` VALUES (100,567,0); +INSERT INTO `zonemapping` VALUES (100,568,0); +INSERT INTO `zonemapping` VALUES (100,569,0); +INSERT INTO `zonemapping` VALUES (100,570,0); +INSERT INTO `zonemapping` VALUES (100,571,0); +INSERT INTO `zonemapping` VALUES (100,572,0); +INSERT INTO `zonemapping` VALUES (100,573,0); +INSERT INTO `zonemapping` VALUES (100,574,0); +INSERT INTO `zonemapping` VALUES (100,575,0); +INSERT INTO `zonemapping` VALUES (100,576,0); +INSERT INTO `zonemapping` VALUES (100,577,0); +INSERT INTO `zonemapping` VALUES (100,578,0); +/*!40000 ALTER TABLE `zonemapping` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2016-12-09 17:37:16 diff --git a/sql/zonepositions.sql b/sql/zonepositions.sql new file mode 100644 index 00000000..8650cf59 --- /dev/null +++ b/sql/zonepositions.sql @@ -0,0 +1,165 @@ +-- MySQL dump 10.13 Distrib 5.7.13, for Win64 (x86_64) +-- +-- Host: localhost Database: sapphire +-- ------------------------------------------------------ +-- Server version 5.7.13-log + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `zonepositions` +-- + +DROP TABLE IF EXISTS `zonepositions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `zonepositions` ( + `id` int(11) NOT NULL, + `target_zone_id` int(11) NOT NULL, + `pos_x` float NOT NULL, + `pos_y` float NOT NULL, + `pos_z` float NOT NULL, + `pos_o` float NOT NULL, + `radius` int(11) NOT NULL DEFAULT '2', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `zonepositions` +-- + +LOCK TABLES `zonepositions` WRITE; +/*!40000 ALTER TABLE `zonepositions` DISABLE KEYS */; +INSERT INTO `zonepositions` VALUES (1317556,133,16.3201,8.34547,-91.7458,2.48019,2); +INSERT INTO `zonepositions` VALUES (1317554,133,140.8,11.15,-22.6,2.5,2); +INSERT INTO `zonepositions` VALUES (1317535,132,10.2559,1.03707,-11.7784,-0.43944,2); +INSERT INTO `zonepositions` VALUES (1317558,133,-130.42,5.5,-36.36,-1.69019,2); +INSERT INTO `zonepositions` VALUES (1317552,148,129.341,26.9524,-311.06,-0.01836,2); +INSERT INTO `zonepositions` VALUES (1317623,132,149.42,-11.2378,157.749,-1.66604,2); +INSERT INTO `zonepositions` VALUES (1317628,152,-515.845,18.4252,271.573,2.83271,2); +INSERT INTO `zonepositions` VALUES (1320077,148,384,-3,-184,-1,2); +INSERT INTO `zonepositions` VALUES (1317540,132,-104,1,12.6,0.3,2); +INSERT INTO `zonepositions` VALUES (1320086,148,158,-24,546,-3,2); +INSERT INTO `zonepositions` VALUES (1317630,153,-366,29,-241,0.8,2); +INSERT INTO `zonepositions` VALUES (1332303,152,-165,6,450,-1.4,2); +INSERT INTO `zonepositions` VALUES (1320082,153,275.5,11.1,-258.7,-0.8,2); +INSERT INTO `zonepositions` VALUES (1317533,132,105,6,9,-0.6,2); +INSERT INTO `zonepositions` VALUES (1317542,154,452,-1,196,-1,2); +INSERT INTO `zonepositions` VALUES (1320072,133,-205,10,-96,1.6,2); +INSERT INTO `zonepositions` VALUES (1317633,154,14.8739,-55.3396,527.905,-2.44165,2); +INSERT INTO `zonepositions` VALUES (1359064,132,40.1767,1.19993,33.5491,-2.0572,2); +INSERT INTO `zonepositions` VALUES (1359244,152,-196.215,3.10004,291.934,1.0742,2); +INSERT INTO `zonepositions` VALUES (1359648,153,185.686,9.21862,-74.6898,-0.828473,2); +INSERT INTO `zonepositions` VALUES (1359652,154,-31.4935,-39.9006,238.436,-1.95462,2); +INSERT INTO `zonepositions` VALUES (3693843,129,-96.5371,18.5462,0.164331,1.55699,2); +INSERT INTO `zonepositions` VALUES (3693863,130,-144.305,-3.15489,-163.06,0.844608,2); +INSERT INTO `zonepositions` VALUES (3860373,135,156.876,14.0959,680.845,-3.01048,2); +INSERT INTO `zonepositions` VALUES (3961173,137,491.614,18.236,474.858,-2.71565,2); +INSERT INTO `zonepositions` VALUES (3965407,138,651.437,9.39925,507.082,-0.015805,2); +INSERT INTO `zonepositions` VALUES (4142002,139,437.484,4.21339,84.1072,0,2); +INSERT INTO `zonepositions` VALUES (4142062,180,-117.633,64.3225,-219.456,0,2); +INSERT INTO `zonepositions` VALUES (3965476,140,73.0305,45.9193,-232.058,-0.837415,2); +INSERT INTO `zonepositions` VALUES (3965498,145,-379.737,-59,142.563,-1.60992,2); +INSERT INTO `zonepositions` VALUES (3965549,146,-153.169,26.3166,-418.709,-0.966313,2); +INSERT INTO `zonepositions` VALUES (3965676,147,28.5353,6.97858,454.249,-1.59139,2); +INSERT INTO `zonepositions` VALUES (3965792,155,228.603,312,-238.728,-0.872663,2); +INSERT INTO `zonepositions` VALUES (3965896,156,47.7514,20.4912,-667.904,-1.5964,2); +INSERT INTO `zonepositions` VALUES (2563653,132,165.172,-2.53922,83.0344,2.28249,2); +INSERT INTO `zonepositions` VALUES (2563690,133,101.232,8.36029,-108.339,-1.72413,2); +INSERT INTO `zonepositions` VALUES (2563700,133,117.217,11.5772,-231.311,2.29494,2); +INSERT INTO `zonepositions` VALUES (2563702,133,-146.938,3.99984,-13.7873,-1.46085,2); +INSERT INTO `zonepositions` VALUES (2563740,133,-307.932,7.06028,-174.981,1.41482,2); +INSERT INTO `zonepositions` VALUES (2563748,133,-73.8652,6.99362,-136.568,1.13622,2); +INSERT INTO `zonepositions` VALUES (2563810,148,128.68,25.6247,-302.237,-0.407334,2); +INSERT INTO `zonepositions` VALUES (2563828,154,448.667,-0.881895,198.039,-0.81543,2); +INSERT INTO `zonepositions` VALUES (4205005,134,224,113.1,-261,0.71968,2); +INSERT INTO `zonepositions` VALUES (4205026,141,-16.1511,-1.87702,-163.139,3.13206,2); +INSERT INTO `zonepositions` VALUES (4265667,250,40.9851,5.6,-23.4832,0,2); +INSERT INTO `zonepositions` VALUES (3724283,148,-502.084,73.8739,-349.12,0.022136,2); +INSERT INTO `zonepositions` VALUES (1406089,155,7.46379,184.824,573.833,-2.9039,2); +INSERT INTO `zonepositions` VALUES (1406085,154,-366.571,-7.6982,194.777,0.759619,2); +INSERT INTO `zonepositions` VALUES (4176152,153,-282.699,-0.13973,692.715,2.57545,2); +INSERT INTO `zonepositions` VALUES (1320088,145,366.689,31.0121,-291.751,-0.526007,2); +INSERT INTO `zonepositions` VALUES (1406087,156,120.007,31.4998,-765.044,-0.804052,2); +INSERT INTO `zonepositions` VALUES (1418272,155,-228.277,218.179,698.528,-2.42958,2); +INSERT INTO `zonepositions` VALUES (1418277,147,-102.023,84.4271,-411.113,-0.874677,2); +INSERT INTO `zonepositions` VALUES (4295875,156,-421.317,-3.21682,-122.225,-2.80336,2); +INSERT INTO `zonepositions` VALUES (3876614,134,-36.4611,36.6508,150.243,1.98843,2); +INSERT INTO `zonepositions` VALUES (2464045,129,58.7886,20,-0.066879,-1.53495,2); +INSERT INTO `zonepositions` VALUES (2453662,134,194.511,65.2717,285.229,-1.59811,2); +INSERT INTO `zonepositions` VALUES (2464048,135,235.118,73.7873,-338.534,0.887104,2); +INSERT INTO `zonepositions` VALUES (2453729,134,-372.325,33.3472,-595.069,0.942594,2); +INSERT INTO `zonepositions` VALUES (2464054,138,810.028,49.9019,384.635,-2.54678,2); +INSERT INTO `zonepositions` VALUES (2210360,135,-46.1092,73.9411,116.089,1.54535,2); +INSERT INTO `zonepositions` VALUES (2443382,128,24.9766,44.5,175.56,-3.13474,2); +INSERT INTO `zonepositions` VALUES (4323017,135,596.704,61.6635,-112.685,-2.81539,2); +INSERT INTO `zonepositions` VALUES (2453713,135,571.106,96.3,-518.642,-0.05646,2); +INSERT INTO `zonepositions` VALUES (2453673,137,-132.425,69.3748,739.518,-3.13744,2); +INSERT INTO `zonepositions` VALUES (2453708,135,693.492,79.5221,-382.789,-0.232514,2); +INSERT INTO `zonepositions` VALUES (2453666,137,246.611,56.1687,831.572,2.89764,2); +INSERT INTO `zonepositions` VALUES (2372269,130,42.3246,4,-158.943,-0.273386,2); +INSERT INTO `zonepositions` VALUES (2377056,141,-114.159,18.3778,332.705,2.8655,2); +INSERT INTO `zonepositions` VALUES (2376310,130,91.1395,4,-111.101,-2.27906,2); +INSERT INTO `zonepositions` VALUES (2377064,131,94.3718,4,-108.09,0.815058,2); +INSERT INTO `zonepositions` VALUES (2376964,130,58.4986,8,-88.0199,-2.27798,2); +INSERT INTO `zonepositions` VALUES (2377068,131,67.2002,8,-80.4213,0.854852,2); +INSERT INTO `zonepositions` VALUES (2376969,130,-12.143,10,-44.8101,-2.89781,2); +INSERT INTO `zonepositions` VALUES (2377071,131,-7.5771,12.5628,-27.816,0.26209,2); +INSERT INTO `zonepositions` VALUES (2369965,130,-176.583,14,-14.6283,1.56838,2); +INSERT INTO `zonepositions` VALUES (2377075,140,465.194,96.6206,159.051,-1.73197,2); +INSERT INTO `zonepositions` VALUES (2379246,130,-123.162,9.99999,-8.84062,-1.56451,2); +INSERT INTO `zonepositions` VALUES (2377082,131,-107.435,6.98457,-9.0397,1.57633,2); +INSERT INTO `zonepositions` VALUES (2379249,130,-121.899,10.0722,9.43441,-1.5354,2); +INSERT INTO `zonepositions` VALUES (2377078,131,-106.993,6.98457,9.39492,1.58387,2); +INSERT INTO `zonepositions` VALUES (2372279,131,159.45,4,42.6079,-1.86339,2); +INSERT INTO `zonepositions` VALUES (2376287,141,20.1486,18.3778,565.384,1.34262,2); +INSERT INTO `zonepositions` VALUES (2210427,128,-3.02154,43,-27.8195,1.52636,2); +INSERT INTO `zonepositions` VALUES (2210364,129,-2.24011,20.0008,27.8738,1.54483,2); +INSERT INTO `zonepositions` VALUES (2210434,128,-92.7087,35.5,104.59,0.839544,2); +INSERT INTO `zonepositions` VALUES (2210376,129,-89.9423,20.6775,111.428,-3.09037,2); +INSERT INTO `zonepositions` VALUES (2210411,128,-70.0571,40.6609,-125.182,2.3762,2); +INSERT INTO `zonepositions` VALUES (2210368,129,-84.1969,18.0003,-22.3949,0.030137,2); +INSERT INTO `zonepositions` VALUES (2453691,134,-166.683,35.0913,-726.536,-0.302407,2); +INSERT INTO `zonepositions` VALUES (2464051,137,-108.773,70.3399,46.5696,1.79447,2); +INSERT INTO `zonepositions` VALUES (2453742,137,80.4418,80.0177,-115.679,0.063873,2); +INSERT INTO `zonepositions` VALUES (2453717,139,717.879,0.468218,208.285,-3.11069,2); +INSERT INTO `zonepositions` VALUES (2453747,138,408.384,27.5189,-5.33734,-0.320773,2); +INSERT INTO `zonepositions` VALUES (2453733,139,-472.983,1.43406,283.031,2.36451,2); +INSERT INTO `zonepositions` VALUES (4057217,139,-350.797,47.4884,-14.5283,-1.14213,2); +INSERT INTO `zonepositions` VALUES (4056858,148,-326.559,51.2799,-87.2374,-2.82522,2); +INSERT INTO `zonepositions` VALUES (4057229,139,289.163,41.1628,-198.013,0.64875,2); +INSERT INTO `zonepositions` VALUES (4056861,148,238.76,54.7158,-252.767,-1.7284,2); +INSERT INTO `zonepositions` VALUES (2376981,141,-398.28,-0.789985,99.3511,1.96518,2); +INSERT INTO `zonepositions` VALUES (2372291,140,258.5,52.6883,-4.64944,-0.456935,2); +INSERT INTO `zonepositions` VALUES (2377124,141,226.726,2.7533,669.653,-2.22354,2); +INSERT INTO `zonepositions` VALUES (2372323,146,-423.482,12.8616,-422.811,0.697403,2); +INSERT INTO `zonepositions` VALUES (2377115,141,446.556,-17.9999,-174.403,-0.73727,2); +INSERT INTO `zonepositions` VALUES (2372300,145,-559.838,-19.777,335.605,2.10368,2); +INSERT INTO `zonepositions` VALUES (2377133,141,-26.9884,33,-486.807,0.127408,2); +INSERT INTO `zonepositions` VALUES (2372337,147,36.6025,5.93622,506.673,3.10036,2); +INSERT INTO `zonepositions` VALUES (2377127,145,-173.756,-45.2898,483.95,-2.64246,2); +INSERT INTO `zonepositions` VALUES (2377118,146,-27.6321,16.1257,-760.456,-0.049568,2); +INSERT INTO `zonepositions` VALUES (1359242,148,5.5,-1.2,39,2,2); +/*!40000 ALTER TABLE `zonepositions` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2016-12-09 17:37:16 diff --git a/sql/zoneservers.sql b/sql/zoneservers.sql new file mode 100644 index 00000000..1e9f8789 --- /dev/null +++ b/sql/zoneservers.sql @@ -0,0 +1,51 @@ +-- MySQL dump 10.13 Distrib 5.7.13, for Win64 (x86_64) +-- +-- Host: localhost Database: sapphire +-- ------------------------------------------------------ +-- Server version 5.7.13-log + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `zoneservers` +-- + +DROP TABLE IF EXISTS `zoneservers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `zoneservers` ( + `id` int(5) NOT NULL, + `ip` varchar(50) DEFAULT NULL, + `port` int(5) DEFAULT '0' +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `zoneservers` +-- + +LOCK TABLES `zoneservers` WRITE; +/*!40000 ALTER TABLE `zoneservers` DISABLE KEYS */; +INSERT INTO `zoneservers` VALUES (100,'127.0.0.1',54995); +/*!40000 ALTER TABLE `zoneservers` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2016-12-09 17:37:17 diff --git a/src/servers/CMakeLists.txt b/src/servers/CMakeLists.txt new file mode 100644 index 00000000..80fd3109 --- /dev/null +++ b/src/servers/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 2.6) +project (Sapphire_root) + +set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}) +set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}) + +set(PROJECT_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include) + +include_directories("${PROJECT_INCLUDE_DIR}") +include_directories("${PROJECT_SOURCE_DIR}") + + +add_subdirectory(${PROJECT_SOURCE_DIR}/Server_Common) +add_subdirectory(${PROJECT_SOURCE_DIR}/Server_Lobby) +add_subdirectory(${PROJECT_SOURCE_DIR}/Server_REST) +add_subdirectory(${PROJECT_SOURCE_DIR}/Server_Zone) diff --git a/src/servers/Server_Common/Acceptor.cpp b/src/servers/Server_Common/Acceptor.cpp new file mode 100644 index 00000000..2720d904 --- /dev/null +++ b/src/servers/Server_Common/Acceptor.cpp @@ -0,0 +1,130 @@ +#include "Hive.h" +#include "Acceptor.h" +#include "Connection.h" +#include +#include + +namespace Core +{ + namespace Network + { + + //----------------------------------------------------------------------------- + + Acceptor::Acceptor( HivePtr hive ) + : m_hive( hive ), + m_acceptor( hive->GetService() ), + m_io_strand( hive->GetService() ), + m_error_state( 0 ) + { + } + + Acceptor::~Acceptor() + { + } + + + bool Acceptor::OnAccept( ConnectionPtr connection, const std::string & host, uint16_t port ) + { + return true; + } + + void Acceptor::OnError( const boost::system::error_code & error ) + { + + } + + + void Acceptor::StartError( const boost::system::error_code & error ) + { + if( boost::interprocess::ipcdetail::atomic_cas32( &m_error_state, 1, 0 ) == 0 ) + { + boost::system::error_code ec; + m_acceptor.cancel( ec ); + m_acceptor.close( ec ); + OnError( error ); + } + } + + void Acceptor::DispatchAccept( ConnectionPtr connection ) + { + m_acceptor.async_accept( connection->GetSocket(), + connection->GetStrand().wrap( boost::bind( &Acceptor::HandleAccept, + shared_from_this(), + _1, + connection ) ) ); + } + + void Acceptor::HandleAccept( const boost::system::error_code & error, ConnectionPtr connection ) + { + if( error || HasError() || m_hive->HasStopped() ) + { + connection->StartError( error ); + } + else + { + if( connection->GetSocket().is_open() ) + { + if( OnAccept( connection, + connection->GetSocket().remote_endpoint().address().to_string(), + connection->GetSocket().remote_endpoint().port() ) ) + { + connection->OnAccept( m_acceptor.local_endpoint().address().to_string(), m_acceptor.local_endpoint().port() ); + connection->Recv(); + } + } + else + { + connection->StartError( error ); + } + } + } + + void Acceptor::Stop() + { + + } + + void Acceptor::Accept( ConnectionPtr connection ) + { + m_io_strand.post( boost::bind( &Acceptor::DispatchAccept, shared_from_this(), connection ) ); + } + + void Acceptor::Listen( const std::string & host, const uint16_t & port ) + { + try + { + boost::asio::ip::tcp::resolver resolver( m_hive->GetService() ); + boost::asio::ip::tcp::resolver::query query( host, std::to_string( port ) ); + boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve( query ); + + m_acceptor.open( endpoint.protocol() ); + m_acceptor.set_option( boost::asio::ip::tcp::acceptor::reuse_address( false ) ); + m_acceptor.bind( endpoint ); + m_acceptor.listen( boost::asio::socket_base::max_connections ); + } + catch( ... ) + { + // this should not happen + assert( true ); + } + + } + + HivePtr Acceptor::GetHive() + { + return m_hive; + } + + boost::asio::ip::tcp::acceptor & Acceptor::GetAcceptor() + { + return m_acceptor; + } + + bool Acceptor::HasError() + { + return ( boost::interprocess::ipcdetail::atomic_cas32( &m_error_state, 1, 1 ) == 1 ); + } + + } +} \ No newline at end of file diff --git a/src/servers/Server_Common/Acceptor.h b/src/servers/Server_Common/Acceptor.h new file mode 100644 index 00000000..638ea7b8 --- /dev/null +++ b/src/servers/Server_Common/Acceptor.h @@ -0,0 +1,78 @@ +#ifndef ACCEPTOR_H_ +#define ACCEPTOR_H_ + +#include +#include +#include +#include +#include "Forwards.h" + +namespace Core +{ + namespace Network + { + + class Connection; + + class Acceptor : public boost::enable_shared_from_this< Acceptor > + { + friend class Hive; + + private: + HivePtr m_hive; + boost::asio::ip::tcp::acceptor m_acceptor; + boost::asio::strand m_io_strand; + volatile uint32_t m_error_state; + + private: + Acceptor( const Acceptor & rhs ); + Acceptor & operator =( const Acceptor & rhs ); + void StartError( const boost::system::error_code & error ); + void DispatchAccept( ConnectionPtr connection ); + void HandleAccept( const boost::system::error_code & error, ConnectionPtr connection ); + + private: + // Called when a connection has connected to the server. This function + // should return true to invoke the connection's OnAccept function if the + // connection will be kept. If the connection will not be kept, the + // connection's Disconnect function should be called and the function + // should return false. + virtual bool OnAccept( ConnectionPtr connection, const std::string & host, uint16_t port ); + + // Called when an error is encountered. Most typically, this is when the + // acceptor is being closed via the Stop function or if the Listen is + // called on an address that is not available. + virtual void OnError( const boost::system::error_code & error ); + + public: + Acceptor( HivePtr hive ); + virtual ~Acceptor(); + + // Returns the Hive object. + HivePtr GetHive(); + + // Returns the acceptor object. + boost::asio::ip::tcp::acceptor & GetAcceptor(); + + // Returns the strand object. + boost::asio::strand & GetStrand(); + + // Returns true if this object has an error associated with it. + bool HasError(); + + public: + // Begin listening on the specific network interface. + void Listen( const std::string & host, const uint16_t & port ); + + // Posts the connection to the listening interface. The next client that + // connections will be given this connection. If multiple calls to Accept + // are called at a time, then they are accepted in a FIFO order. + void Accept( ConnectionPtr connection ); + + // Stop the Acceptor from listening. + void Stop(); + }; + + } +} +#endif \ No newline at end of file diff --git a/src/servers/Server_Common/CMakeLists.txt b/src/servers/Server_Common/CMakeLists.txt new file mode 100644 index 00000000..04e0ea48 --- /dev/null +++ b/src/servers/Server_Common/CMakeLists.txt @@ -0,0 +1,76 @@ +cmake_minimum_required(VERSION 2.6) +project(Sapphire) + +include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/sapphire/datReader/") +include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/ChaiScript-6.0.0/include/") + +if(UNIX) + include_directories("/usr/include/mysql/") + message(STATUS "Setting GCC flags") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -m32") + + find_package(Boost ${SAPPHIRE_BOOST_VER} COMPONENTS log log_setup thread date_time filesystem system) + if(Boost_FOUND) + set(BOOST_LIBRARY_DIR ${Boost_LIBRARY_DIR}) + else() + if (EXISTS /opt/build_libs/${SAPPHIRE_BOOST_FOLDER_NAME}) + set(Boost_INCLUDE_DIR /opt/build_libs/${SAPPHIRE_BOOST_FOLDER_NAME}) + set(BOOST_LIBRARYDIR /opt/build_libs/${SAPPHIRE_BOOST_FOLDER_NAME}/stage/lib) + else() + message(FATAL_ERROR "Unable to find boost ${SAPPHIRE_BOOST_VER} package!") + endif() + endif() +else() + add_definitions(-D_WIN32_WINNT=0x601) + include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/MySQL/") + message(STATUS "Setting MSVC flags") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHc") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") + + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/${SAPPHIRE_BOOST_FOLDER_NAME}) + message(STATUS "Using boost in /libraries/external") + set(Boost_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/${SAPPHIRE_BOOST_FOLDER_NAME}) + set(BOOST_LIBRARYDIR ${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/${SAPPHIRE_BOOST_FOLDER_NAME}/lib32-msvc-14.0) + else() + find_package(Boost ${SAPPHIRE_BOOST_VER} COMPONENTS log log_setup thread date_time filesystem system) + if(Boost_FOUND) + set(BOOST_LIBRARY_DIR ${Boost_LIBRARY_DIR}) + elseif ((EXISTS $ENV{BOOST_ROOT_DIR}) AND (EXISTS $ENV{BOOST_LIB_DIR})) + set(Boost_INCLUDE_DIR $ENV{BOOST_ROOT_DIR}) + set(BOOST_LIBRARYDIR $ENV{BOOST_LIB_DIR}) + else() + message(FATAL_ERROR "SapphireError: Unable to find boost ${SAPPHIRE_BOOST_VER} package and environment variables BOOST_ROOT_DIR and BOOST_LIB_DIR not set!") + endif() + endif() +endif() + +set(Boost_USE_STATIC_LIBS ON) + + +file(GLOB UTILS_PUBLIC_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*") +file(GLOB UTILS_SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}*.cpp") + +find_package(Boost ${SAPPHIRE_BOOST_VER} COMPONENTS log log_setup thread date_time filesystem system) +include_directories(${Boost_INCLUDE_DIR}) +link_directories(${BOOST_LIBRARYDIR}) +link_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/sapphire/datReader/") + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + +add_library(Common ${UTILS_PUBLIC_INCLUDE_FILES} ${UTILS_SOURCE_FILES}) + +set_target_properties(Common PROPERTIES + CXX_STANDARD 14 + CXX_STANDARD_REQUIRED ON + CXX_EXTENSIONS ON + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" + RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" + RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" +) + +if (UNIX) + target_link_libraries(Common xivdat mysqlclient) +else() + target_link_libraries(Common xivdat libmysql) +endif() diff --git a/src/servers/Server_Common/ChaiscriptStdLib.cpp b/src/servers/Server_Common/ChaiscriptStdLib.cpp new file mode 100644 index 00000000..282d4ecb --- /dev/null +++ b/src/servers/Server_Common/ChaiscriptStdLib.cpp @@ -0,0 +1,16 @@ +#include +#include +#include "ChaiscriptStdLib.h" +#include + +std::shared_ptr< chaiscript::Module > Core::Scripting::create_chaiscript_stdlib() +{ + return chaiscript::Std_Lib::library(); +} + +boost::shared_ptr< chaiscript::ChaiScript > Core::Scripting::create_chaiscript() +{ + auto chai = boost::make_shared< chaiscript::ChaiScript >(); + //create_chaiscript_bindings( chai ); + return chai; +} \ No newline at end of file diff --git a/src/servers/Server_Common/ChaiscriptStdLib.h b/src/servers/Server_Common/ChaiscriptStdLib.h new file mode 100644 index 00000000..f3e346d8 --- /dev/null +++ b/src/servers/Server_Common/ChaiscriptStdLib.h @@ -0,0 +1,19 @@ +#ifndef CHAISCRIPT_STDLIB +#define CHAISCRIPT_STDLIB + +#include + +namespace chaiscript +{ + class Module; + class ChaiScript; +} + +namespace Core { namespace Scripting { + +std::shared_ptr create_chaiscript_stdlib(); +boost::shared_ptr< chaiscript::ChaiScript > create_chaiscript(); + +} } + +#endif diff --git a/src/servers/Server_Common/Common.h b/src/servers/Server_Common/Common.h new file mode 100644 index 00000000..60e6cb43 --- /dev/null +++ b/src/servers/Server_Common/Common.h @@ -0,0 +1,958 @@ +#ifndef _COMMON_H +#define _COMMON_H + +#include + +#include + +#include + +// +--------------------------------------------------------------------------- +// The following enumerations are structures to require their type be included. +// They are also defined within the Core::Common namespace to avoid collisions. +// +--------------------------------------------------------------------------- +namespace Core { + namespace Common { + + // 99 is the last spawn id that seems to spawn any actor + const uint8_t MAX_DISPLAYED_ACTORS = 99; + + const int32_t INVALID_GAME_OBJECT_ID = 0xE0000000; + + struct FFXIVARR_POSITION3 + { + float x; + float y; + float z; + }; + + enum EquipSlot : uint8_t + { + MainHand = 0, + OffHand = 1, + Head = 2, + Body = 3, + Hands = 4, + Waist = 5, + Legs = 6, + Feet = 7, + Neck = 8, + Ear = 9, + Wrist = 10, + Ring1 = 11, + Ring2 = 12, + SoulCrystal = 13, + }; + + enum InventoryType : uint16_t + { + Bag0 = 0, + Bag1 = 1, + Bag2 = 2, + Bag3 = 3, + + GearSet0 = 1000, + GearSet1 = 1001, + + Currency = 2000, + Crystal = 2001, + //UNKNOWN_0 = 2003, + KeyItem = 2004, + DamagedGear = 2007, + //UNKNOWN_1 = 2008, + + ArmoryOff = 3200, + ArmoryHead = 3201, + ArmoryBody = 3202, + ArmoryHand = 3203, + ArmoryWaist = 3204, + ArmoryLegs = 3205, + ArmoryFeet = 3206, + ArmotyNeck = 3207, + ArmoryEar = 3208, + ArmoryWrist = 3209, + ArmoryRing = 3300, + + ArmorySoulCrystal = 3400, + ArmoryMain = 3500, + + RetainerBag0 = 10000, + RetainerBag1 = 10001, + RetainerBag2 = 10002, + RetainerBag3 = 10003, + RetainerBag4 = 10004, + RetainerBag5 = 10005, + RetainerBag6 = 10006, + RetainerEquippedGear = 11000, + RetainerGil = 12000, + RetainerCrystal = 12001, + RetainerMarket = 12002, + + FreeCompanyBag0 = 20000, + FreeCompanyBag1 = 20001, + FreeCompanyBag2 = 20002, + FreeCompanyGil = 22000, + FreeCompanyCrystal = 22001 + }; + + enum Race : uint8_t + { + Hyur = 1, + Elezen = 2, + Lalafell = 3, + Miqote = 4, + Roegadyn = 5, + AuRa = 6, + }; + + enum struct ZoneingType : uint8_t + { + None = 1, + Teleport = 2, + Return = 3, + ReturnDead = 4, + FadeIn = 5, + }; + + enum Tribe : uint8_t + { + Midlander = 1, + Highlander = 2, + Wildwood = 3, + Duskwight = 4, + Plainsfolk = 5, + Dunesfolk = 6, + SeekerOfTheSun = 7, + KeeperOfTheMoon = 8, + SeaWolf = 9, + Hellsguard = 10, + Raen = 11, + Xaela = 12, + }; + + enum Gender : uint8_t + { + Male = 0, + Female = 1, + }; + + enum GuardianDeity : uint8_t + { + Halone = 1, // the Fury + Menphina = 2, // the Lover + Thaliak = 3, // the Scholar + Nymeia = 4, // the Spinner + Llymlaen = 5, // the Navigator + Oschon = 6, // the Wanderer + Byregot = 7, // the Builder + Rhalgr = 8, // the Destroyer + Azeyma = 9, // the Warden + NaldThal = 10, // the Traders + Nophica = 11, // the Matron + Althyk = 12, // the Keeper + }; + + enum struct GrandCompany : uint8_t + { + None = 0, + Maelstrom = 1, + TwinAdder = 2, + ImmortalFlames = 3, + }; + + enum struct GCRank : uint8_t + { + None = 0, + PrivateThirdClass = 1, + PrivateSecondClass = 2, + PrivateFirstClass = 3, + Corporal = 4, + SergeantThirdClass = 5, + SergeantSecondClass = 6, + SergeantFirstClass = 7, + ChiefSergeant = 8, + SecondLieutenant = 9, + FirstLieutenant = 10, + Captain = 11, + SecondCommander = 12, + FirstCommander = 13, + HighCommander = 14, + RearMarshal = 15, + ViceMarshal = 16, + Marshal = 17, + GrandMarshal = 18, + Champion = 19, + }; + + enum struct Weather : uint8_t + { + None, + Clear, + Fair, + Overcast, + Fog, + Wind, + Gales, + Rain, + Showers, + Thunder, + Thunderstorms, + DustStorms, + Sandstorms, + HotSpells, + HeatWave, + Snow, + Blizzards, + Gloom, + Aurora, + Darkness, + Hopelessness, + Overcast1, + StormClouds, + Torrential, + Torrential1, + Lour, + HeatWave1, + Gloom1, + Gales1, + Eruptions, + Fair1 + }; + + enum Town : uint8_t + { + LimsaLominsa = 1, + Gridania = 2, + Uldah = 3, + Ishgard = 4, + }; + + enum ClassJob : uint8_t + { + CLASS_ADV = 0, // purely internal + CLASS_GLADIATOR = 1, // gladiator + CLASS_PUGILIST = 2, // pugilist + CLASS_MARAUDER = 3, // marauder + CLASS_LANCER = 4, // lancer + CLASS_ARCHER = 5, // archer + CLASS_CONJURER = 6, // conjurer + CLASS_THAUMATURGE = 7, // thaumaturge + CLASS_WOODWORKER = 8, // carpenter + CLASS_BLACKSMIT = 9, // blacksmith + CLASS_ARMOURER = 10, // armorer + CLASS_GOLDSMITH = 11, // goldsmith + CLASS_TANNER = 12, // leatherworker + CLASS_WEAVER = 13, // weaver + CLASS_ALCHEMIST = 14, // alchemist + CLASS_CULINARIAN = 15, // culinarian + CLASS_MINER = 16, // miner + CLASS_HARVESTER = 17, // botanist + CLASS_FISHERMAN = 18, // fisher + JOB_KNIGHT = 19, // paladin + JOB_MONK = 20, // monk + JOB_WARRIOR = 21, // warrior + JOB_DRAGON = 22, // dragoon + JOB_BARD = 23, // bard + JOB_WHITE = 24, // white mage + JOB_BLACK = 25, // black mage + CLASS_ARCANIST = 26, // arcanist + JOB_SUMMONER = 27, // summoner + JOB_SCHOLAR = 28, // scholar + CLASS_ROGUE = 29, + JOB_NINJA = 30, + JOB_MACHINIST = 31, // machinist + JOB_DARKKNIGHT = 32, // darknight + JOB_ASTROLOGIAN = 33, // astro + JOB_SAMURAI = 34, // sam + JOB_REDMAGE = 35, // red mage + + }; + + enum PlayerSyncFlags : uint32_t + { + None = 0x00000000, + Position = 0x00000001, // x,y,z,zone + Status = 0x00000002, // hp,mp,tp,class + Look = 0x00000004, // models to display + ExpLevel = 0x00000008, // exp,level + Quests = 0x00000010, // quest status + Achievements = 0x00000020, // achievements + Discovery = 0x00000040, // Discovered places + Aetherytes = 0x00000080, // Attuned aetherytes + HomePoint = 0x00000100, // Current homepoint + HowTo = 0x00000200, + FirstLogin = 0x00000400, + HpMp = 0x00000800, + QuestTracker = 0x00001000, + NewGame = 0x00002000, + + Unlocks = 0x00008000, + PlayTime = 0x00010000, + NewAdventurer = 0x00020000, + SearchInfo = 0x00040000, + GC = 0x00080000, + + All = 0xFFFFFFFF, + }; + + /** + * Structural representation of the packet sent by the server + * Send the entire StatusEffect list + */ + struct StatusEffect + { + uint16_t effect_id; + uint16_t unknown1; + float duration; + uint32_t sourceActorId; + }; + + enum struct ItemCategory : uint8_t + { + not_set = 0, + PugWep = 1, + GlaWep = 2, + MrdWep = 3, + ArcWep = 4, + LncWep = 5, + ThmWep = 6, + Thm2Wep = 7, + CnjWep = 8, + Cnj2Wep = 9, + ArnWep = 10, + Shield = 11, + CrpPri = 12, + BlmPri = 13, + ArmPri = 14, + GldPri = 15, + LtwPri = 16, + WvrPri = 17, + AlcPri = 18, + ClnPri = 19, + MinPri = 20, + BotPri = 21, + FshPri = 22, + CrpSec = 23, + BsmSec = 24, + ArmSec = 25, + GldSec = 26, + LtwSec = 27, + WvrSec = 28, + AlcSec = 29, + ClnSec = 30, + MinSec = 31, + BotSec = 32, + FshSec = 33, + Throw = 34, + Head = 35, + Body = 36, + Hands = 37, + Waist = 38, + Legs = 39, + Feet = 40, + UndShirt = 41, + UndGarm = 42, + Earring = 43, + Necklace = 44, + Bracelet = 45, + Ring = 46, + Crystal = 47, + Materia = 48, + Material = 49, + Food = 50, + Enhancement = 51, + Curative = 52, + PLaceholder = 53, + Enfeeb = 54, + Medecine = 55, + }; + + + enum RegionType : uint8_t + { + normal, + instance, + }; + + enum CharaLook : uint8_t + { + Race = 0x00, + Gender = 0x01, + Tribe = 0x04, + Height = 0x03, + ModelType = 0x02, // Au Ra: changes horns/tails, everything else: seems to drastically change appearance (flip between two sets, odd/even numbers). sometimes retains hairstyle and other features + FaceType = 0x05, + HairStyle = 0x06, + HasHighlights = 0x07, // negative to enable, positive to disable + SkinColor = 0x08, + EyeColor = 0x09, // color of character's right eye + HairColor = 0x0A, // main color + HairColor2 = 0x0B, // highlights color + FaceFeatures = 0x0C, // seems to be a toggle, (-odd and +even for large face covering), opposite for small + FaceFeaturesColor = 0x0D, + Eyebrows = 0x0E, + EyeColor2 = 0x0F, // color of character's left eye + EyeShape = 0x10, + NoseShape = 0x11, + JawShape = 0x12, + LipStyle = 0x13, // lip colour depth and shape (negative values around -120 darker/more noticeable, positive no colour) + LipColor = 0x14, + RaceFeatureSize = 0x15, + RaceFeatureType = 0x16, // negative or out of range tail shapes for race result in no tail (e.g. Au Ra has max of 4 tail shapes), incorrect value can crash client + BustSize = 0x17, // char creator allows up to max of 100, i set to 127 cause who wouldnt but no visible difference + Facepaint = 0x18, + FacepaintColor = 0x19, + + }; + + enum MoveType : uint16_t + { + Run = 0x00, + Walk = 0x02, + Strafe = 0x04, + Jump = 0x100, + Fall = 0x400, + Land = 0x200, + }; + + enum UserLevel : uint8_t + { + all = 0xff, + player = 0x01, + gm = 0x02, + dev = 0x04, + admin = 0x08 + }; + + struct QuestActive + { + QuestActive() + { + c.questId = 0; + c.sequence = 0; + c.flags = 0; + c.UI8A = 0; + c.UI8B = 0; + c.UI8C = 0; + c.UI8D = 0; + c.UI8E = 0; + c.UI8F = 0; + c.padding = 0; + } + + + union + { + struct + { + uint16_t questId; + uint8_t sequence; + uint8_t flags; + uint8_t padding; + uint8_t BitFlag48; + uint8_t BitFlag40; + uint8_t BitFlag32; + uint8_t BitFlag24; + uint8_t BitFlag16; + uint8_t BitFlag8; + uint8_t padding1; + } a; + + struct + { + uint16_t questId; + uint8_t sequence; + uint8_t flags; + uint8_t padding; + uint8_t UI8AL : 4; + uint8_t UI8AH : 4; + uint8_t UI8BL : 4; + uint8_t UI8BH : 4; + uint8_t UI8CL : 4; + uint8_t UI8CH : 4; + uint8_t UI8DL : 4; + uint8_t UI8DH : 4; + uint8_t UI8EL : 4; + uint8_t UI8EH : 4; + uint8_t UI8FL : 4; + uint8_t UI8FH : 4; + uint8_t padding1; + } b; + + struct + { + uint16_t questId; + uint8_t sequence; + uint8_t flags; + uint8_t padding; + uint8_t UI8A; + uint8_t UI8B; + uint8_t UI8C; + uint8_t UI8D; + uint8_t UI8E; + uint8_t UI8F; + uint8_t padding1; + } c; + + //struct + //{ + // uint16_t questId; + // uint8_t sequence; + // uint8_t flags; + // uint8_t padding; + // uint16_t UI16A; + // uint16_t UI16B; + // uint16_t UI16C; + // uint8_t padding1; + //} d; + + //struct + //{ + // uint8_t padding; + // uint32_t UI32A; + // uint16_t padding2; + //} e; + }; + + + }; + + enum EventType : uint16_t + { + Quest = 0x0001, + ChocoRent = 0x0002, + Shop = 0x0004, + Aetheryte = 0x0005, + GuildLeveAssign = 0x0006, + DefaultTalk = 0x0009, + CustomTalk = 0x000B, + CraftLeve = 0x000E, + ChocoPort = 0x0012, + Opening = 0x0013, + GCShop = 0x0016, + GuildOrderGuide = 0x0017, + GuildOrderOfficer = 0x0018, + Stories = 0x001A, + FcTalk = 0x001F, + }; + + enum ActionType : uint8_t + { + + Event, + Spell, + Teleport + + }; + + enum struct PlayerStateFlag : uint8_t + { + NoFlag = 0, + NoCombat, + Combat, + Casting, + StatusAffliction, + StatusAffliction1, + Occupied, + Occupied1, + + Occupied2, + Occupied3, + BoundByDuty, + Occupied4, + NewAdventurer, + TradeOpen, + BrowsingBazaar, + HandlingItems, + + Crafting, + PreparingToCraft, + Gathering, + Fishing, + BeingRaised, + BetweenAreas, + Stealthed, + InnRoom, + + Jumping, + AutoRun, + Occupied5, + BetweenAreas1, + SystemError, + LoggingOut, + InvalidLocation, + WaitingForDuty, + + BoundByDuty1, + Mounting, + WatchingCutscene, + WaitingForDutyFinder, + CreatingCharacter, + Jumping1, + PvpDisplay, + StatusAfflication2, + + Mounting1, + CarryingItem, + UsingPartyFinder, + HousingFunctions, + Transformed, + FreeTrail, + BeingMoved, + Mounting2, + + StatusAffliction3, + StatusAffliction4, + RegisteringRaceOrMatch, + WaitingForRaceOrMatch, + WaitingForTripleTriadMatch, + InFlight, + WatchingCutscene1 + + }; + + enum struct FateStatus : uint8_t + { + Active = 2, + Inactive = 4, + Preparing = 7, + Completed = 8, + }; + + enum struct OnlineStatus : uint8_t + { + None = 0, + Producer, + GameMaster, + GameMaster1, + GameMaster2, + Disconnected, + WaitFriendlistApproval, + WaitLinkshellApproval, + WaitFCApproval, + NotFound, + Offline, + CameraMode, + Mentor, + Busy, + PvP, + TripleTriad, + Cutscene, + ChocoPorter, + Afk, + LfRepairs, + LfRepair, + LfMeld, + RolePlaying, + LfParty, + SwordForHire, + WaitDutyFinder, + RecPartyMembers, + Mentor1, + PvEMentor, + TradeMentor, + PvPMentor, + Returner, + NewAdventurer, + AllianceLead, + AlliancePartyLead, + AllianceMember, + PartyLeader, + PartyMember, + PartyLeaderCross, + PartyMemberCross, + AnotherWorld, + SharingDuty, + SimliarDuty, + InDuty, + TrialAdventurer, + FreeCompany, + GrandCompany, + Online + + }; + + enum ActorControlType : uint16_t + { + ToggleWeapon = 0x01, + SetStatus = 0x02, + CastStart = 0x03, + ToggleAggro = 0x04, + ClassJobChange = 0x05, + DefeatMsg = 0x06, + GainExpMsg = 0x07, + + LevelUpEffect = 0x0A, + + ExpChainMsg = 0x0C, + HpSetStat = 0x0D, + DeathAnimation = 0x0E, + CastInterrupt = 0x0F, + + StatusEffectGain = 0x14, + StatusEffectLose = 0x15, + + UpdateRestedExp = 0x018, + Unk2 = 0x19, + + Flee = 0x1B, + + Unk3 = 0x20, + + CombatIndicationShow = 0x22, + + SpawnEffect = 0x25, + ToggleInvisible = 0x26, + + ToggleActionUnlock = 0x29, + + UpdateUiExp = 0x2B, + DmgTakenMsg = 0x2D, + + SetTarget = 0x32, + ToggleNameHidden = 0x36, + + LimitbreakStart = 0x47, + LimitbreakPartyStart = 0x48, + BubbleText = 0x49, + + DamageEffect = 0x50, + RaiseAnimation = 0x51, + TreasureScreenMsg = 0x57, + ItemRepairMsg = 0x5C, + + LeveStartAnim = 0x66, + Unk4 = 0x67, + PlayerNameGrayout = 0x6A, + + ItemObtainMsg = 0x75, + DutyQuestScreenMsg = 0x7B, + + ItemObtainIcon = 0x84, + FateItemFailMsg = 0x85, + ItemFailMsg = 0x86, + ActionLearnMsg1 = 0x87, + + FreeEventPos = 0x8A, + + UnlockAetherCurrentMsg = 0xA4, + + RemoveName = 0xA8, + + ScreenFadeOut = 0xAA, + + ZoneIn = 0xC8, + ZoneInDefaultPos = 0xC9, + + TeleportStart = 0xCB, + + TeleportDone = 0xCD, + TeleportDoneFadeOut = 0xCE, + DespawnZoneScreenMsg = 0xCF, + + InstanceSelectDlg = 0xD2, + ActorDespawnEffect = 0xD4, + + CompanionUnlock = 0xFD, + ObtainBarding = 0xFE, + EquipBarding = 0xFF, + + CompanionMsg1 = 0x102, + CompanionMsg2 = 0x103, + ShowPetHotbar = 0x104, + + ActionLearnMsg = 0x109, + ActorFadeOut = 0x10A, + ActorFadeIn = 0x10B, + WithdrawMsg = 0x10C, + OrderMinion = 0x10D, + ToggleMinion = 0x10E, + LearnMinion = 0x10F, + ActorFateOut1 = 0x110, + + Emote = 0x122, + + SetPose = 0x127, + + CraftingUnk = 0x12C, + + GatheringSenseMsg = 0x130, + PartyMsg = 0x131, + GatheringSenseMsg1 = 0x132, + + GatheringSenseMsg2 = 0x138, + + FishingMsg = 0x140, + + FishingBaitMsg = 0x145, + + FishingReachMsg = 0x147, + FishingFailMsg = 0x148, + + MateriaConvertMsg = 0x15E, + MeldSuccessMsg = 0x15F, + MeldFailMsg = 0x160, + MeldModeToggle = 0x161, + + AetherRestoreMsg = 0x163, + + DyeMsg = 0x168, + + ToggleCrestMsg = 0x16A, + ToggleBulkCrestMsg = 0x16B, + MateriaRemoveMsg = 0x16C, + GlamourCastMsg = 0x16D, + GlamourRemoveMsg = 0x16E, + + RelicInfuseMsg = 0x179, + + AetherReductionDlg = 0x17D, + + Unk6 = 0x19C, + + SetTitle = 0x1F4, + + SetStatusIcon = 0x1F8, + + SetHomepoint = 0x1FB, + SetFavorite = 0x1FC, + LearnTeleport = 0x1FD, + + ArmoryErrorMsg = 0x201, + + AchievementPopup = 0x203, + + Unk7 = 0x205, + AchievementMsg = 0x206, + + SetItemLevel = 0x209, + + ChallengeEntryCompleteMsg = 0x20B, + ChallengeEntryUnlockMsg = 0x20C, + + GilTrailMsg = 0x211, + + SetMaxGearSets = 0x230, + + ToggleDisplayHeadAndWeapon = 0x260, + + GearSetEquipMsg = 0x321 + }; + + enum struct ChatType : uint32_t + { + LogKindError, + ServerDebug, + ServerUrgent, + ServerNotice, + Unused4, + Unused5, + Unused6, + Unused7, + Unused8, + Unused9, + Say, + Shout, + Tell, + TellReceive, + Party, + Alliance, + LS1, + LS2, + LS3, + LS4, + LS5, + LS6, + LS7, + LS8, + FreeCompany, + Unused25, + Unused26, + NoviceNetwork, + CustomEmote, + StandardEmote, + Yell, + Unknown31, + PartyUnk2, + Unused33, + Unused34, + Unused35, + Unused36, + Unused37, + Unused38, + Unused39, + Unused40, + BattleDamage, + BattleFailed, + BattleActions, + BattleItems, + BattleHealing, + BattleBeneficial, + BattleDetrimental, + BattleUnk48, + BattleUnk49, + Unused50, + Unused51, + Unused52, + Unused53, + Unused54, + Unused55, + Echo, + SystemMessage, + SystemErrorMessage, + BattleSystem, + GatheringSystem, + NPCMessage, + LootMessage, + Unused63, + CharProgress, + Loot, + Crafting, + Gathering, + NPCAnnouncement, + FCAnnouncement, + FCLogin, + RetainerSale, + PartySearch, + PCSign, + DiceRoll, + NoviceNetworkNotice, + Unknown76, + Unused77, + Unused78, + Unused79, + GMTell, + GMSay, + GMShout, + GMYell, + GMParty, + GMFreeCompany, + GMLS1, + GMLS2, + GMLS3, + GMLS4, + GMLS5, + GMLS6, + GMLS7, + GMLS8, + GMNoviceNetwork, + Unused95, + Unused96, + Unused97, + Unused98, + Unused99, + Unused100 + }; + + struct ServerEntry + { + uint32_t serverId; + uint32_t flags; + }; + + typedef std::vector< PlayerStateFlag > PlayerStateFlagList; + + } /* Common */ +} /* Core */ + +#endif \ No newline at end of file diff --git a/src/servers/Server_Common/CommonNetwork.h b/src/servers/Server_Common/CommonNetwork.h new file mode 100644 index 00000000..017035a6 --- /dev/null +++ b/src/servers/Server_Common/CommonNetwork.h @@ -0,0 +1,318 @@ +/** +* Structural definitions common to all FFXIV:ARR packets. +*/ +#ifndef _CORE_NETWORK_PACKETS_COMMON_H +#define _CORE_NETWORK_PACKETS_COMMON_H + +#include + +#include + +using namespace std; + +namespace Core { +namespace Network { +namespace Packets { + + /** + * Anticipated usage: + * ================== + * Set up a stream buffer to collect the bytes to be transmitted as a packet. + * Now, you can do the following (given you have the structs filled out already). + * + * FFXIVARR_PACKET_HEADER pkt_hdr = { . . . }; + * FFXIVARR_PACKET_SEGMENT_HEADER pkt_seg_hdr[n] = { . . . }; + * + * std::stringstream buf; + * buf << pkt_hdr; + * for (int i = 0; i < n; i++) + * { + * buf << pkt_seg_hdr[i]; + * buf << {pkt_seg_data[i]}; + * } + * + * The reverse can be done parsing a packet. Remember to validate the packet + * type before parsing the headers. + * + * Compression and Encryption: + * =========================== + * By using std::iostream's, you can support stream filters. Simply create a + * stream that performs the compression or encryption, and use that stream to + * read and write. + */ + + /** + * Structure representing the common header for all FFXIVARR packets. + * + * 0 4 8 12 14 16 + * +-------------------------------+---------------+-------+-------+ + * | timestamp | size | cType | count | + * +---+---+-------+---------------+---------------+-------+-------+ + * | ? |CMP| ? | ? | + * +---+---+-------+---------------+ + * (followed by /count/ FFXIVARR_PACKET_SEGMENTs) + */ + struct FFXIVARR_PACKET_HEADER + { + + uint64_t unknown_0; + uint64_t unknown_8; + /** + * Represents the number of milliseconds since epoch that the packet was + * sent. + */ + uint64_t timestamp; + /** The size of the packet header and its payload */ + uint32_t size; + /** The type of this connection - 1 zone, 2 chat*/ + uint16_t connectionType; + /** The number of packet segments that follow. */ + uint16_t count; + uint8_t unknown_20; + /** Indicates if the data segments of this packet are compressed. */ + uint8_t isCompressed; + uint32_t unknown_24; + }; + + inline ostream& operator<<(ostream& os, const FFXIVARR_PACKET_HEADER& hdr) + { + return os.write(reinterpret_cast(&hdr), sizeof hdr); + } + + inline istream& operator>>(istream& is, FFXIVARR_PACKET_HEADER& hdr) + { + return is.read(reinterpret_cast(&hdr), sizeof hdr); + } + + /** + * Structure representing the header portion of a packet segment. + * + * NOTE: If the main packet header indicated the packet is compressed, this + * header will be compressed as well! The header will NOT ever be encrypted. + * + * 0 4 8 12 16 + * +---------------+---------------+---------------+-------+-------+ + * | size | source_actor | target_actor | type | ? | + * +---------------+---------------+---------------+-------+-------+ + * | | + * : type-specific data of length, size, follows : + * | (NOTE: Some segments MAY be encrypted) | + * +---------------------------------------------------------------+ + */ + struct FFXIVARR_PACKET_SEGMENT_HEADER + { + /** The size of the segment header and its data. */ + uint32_t size; + /** The session ID this segment describes. */ + uint32_t source_actor; + /** The session ID this packet is being delivered to. */ + uint32_t target_actor; + /** The segment type. (1, 2, 3, 7, 8, 9, 10) */ + uint16_t type; + uint16_t _reserved_E; + }; + + inline ostream& operator<<(ostream& os, const FFXIVARR_PACKET_SEGMENT_HEADER& hdr) + { + return os.write(reinterpret_cast(&hdr), sizeof hdr); + } + + inline istream& operator>>(istream& is, FFXIVARR_PACKET_SEGMENT_HEADER& hdr) + { + return is.read(reinterpret_cast(&hdr), sizeof hdr); + } + + // TODO: Include structures for the individual packet segment types + + /** + * Server IPC Type Codes. + */ + enum ServerIpcType : uint16_t + { + LobbyError = 0x0002, + LobbyServiceAccountList = 0x000C, + LobbyCharList = 0x000D, + LobbyCharCreate = 0x000E, + LobbyEnterWorld = 0x000F, + LobbyServerList = 0x0015, + LobbyRetainerList = 0x0017, + + Ping = 0x0065, // updated for sb + Init = 0x0066, // updated for sb + Chat = 0x0067, // updated for sb + Logout = 0x0077, // updated for sb + Playtime = 0x00AF, // updated for sb + SocialRequestError = 0x00AD, + SocialRequestResponse = 0x11AF, + SocialList = 0x00B4, // updated for sb + UpdateSearchInfo = 0x00B2, + InitSearchInfo = 0x00B7, // updated for sb + ServerNotice = 0x00BC, // updated for sb + SetOnlineStatus = 0x00B9, + BlackList = 0x00CA, // updated for sb + LinkshellList = 0x00D1, // updated for sb + StatusEffectList = 0x00F0, // updated for sb + Effect = 0x00F1, // updated for sb + GCAffiliation = 0x00FC, + + ActorSetPos = 0x0114, // updated for sb + ActorCast = 0x0116, // updated for sb + PlayerSpawn = 0x0110, // updated for sb + NpcSpawn = 0x0111, // updated for sb + ActorMove = 0x0112, // updated for sb + HateList = 0x011A, // updated for sb borked + UpdateClassInfo = 0x0117, + InitUI = 0x011E, // updated for sb + PlayerStats = 0x011F, // updated for sb + ActorOwner = 0x0120, // updated for sb + PlayerStateFlags = 0x0121, // updated for sb + PlayerClassInfo = 0x0123, // updated for sb + ModelEquip = 0x0124, // updated for sb + ItemInfo = 0x0139, // updated for sb + ContainerInfo = 0x013A, // updated for sb + InventoryTransactionFinish = 0x013B, + InventoryTransaction = 0x012A, + CurrencyCrystalInfo = 0x013D, + InventoryActionAck = 0x0139, + UpdateInventorySlot = 0x0140, // updated for sb + AddStatusEffect = 0x0141, + ActorControl142 = 0x0142, // unchanged for sb + ActorControl143 = 0x0143, // unchanged for sb + ActorControl144 = 0x0144, // unchanged for sb + UpdateHpMpTp = 0x0145, // unchanged for sb + + CFNotify = 0x0078, + CFMemberStatus = 0x0079, + CFDutyInfo = 0x007A, + CFPlayerInNeed = 0x007F, + CFRegistered = 0x00B0, + CFAvailableContents = 0x01CF, + + EventPlay = 0x0154, // updated for sb + EventStart = 0x015D, // updated for sb + EventFinish = 0x015E, // updated for sb + QuestActiveList = 0x0171, // updated for sb + QuestUpdate = 0x0172, // updated for sb + QuestCompleteList = 0x0173, // updated for sb + QuestFinish = 0x0174, // updated for sb + QuestMessage = 0x0179, + QuestTracker = 0x0181, // updated for sb + ActorSpawn = 0x0190, // todo: split into playerspawn/actorspawn and use opcode 0x110/0x111 + ActorFreeSpawn = 0x0191, // unchanged for sb + InitZone = 0x019A, // unchanged for sb + WeatherChange = 0x01AF, // updated for sb + Discovery = 0x01B2, // updated for sb + + PrepareZoning = 0x0239, // updated for sb + + // Unknown IPC types that still need to be sent + // TODO: figure all these out properly + IPCTYPE_UNK_320 = 0x1FB, + IPCTYPE_UNK_322 = 0x1FD, + + }; + + // TODO: Include structures for the individual packet segment types + + /** + * Client IPC Type Codes. + */ + enum ClientIpcType : uint16_t + { + ReqCharList = 0x0003, + ReqEnterWorld = 0x0004, + ReqServiceAccountList = 0x0005, + + ReqCharDelete = 0x000A, + ReqCharCreate = 0x000B, + + PingHandler = 0x0065,// updated for sb + InitHandler = 0x0066,// updated for sb + ChatHandler = 0x0067,// updated for sb + + FinishLoadingHandler = 0x0069,// updated for sb + + PlayTimeHandler = 0x0073,// updated for sb + LogoutHandler = 0x0074,// updated for sb + + CFDutyInfoHandler = 0x0078, + + SocialReqSendHandler = 0x00A5, + SocialListHandler = 0x00AA,// updated for sb + SetSearchInfoHandler = 0x00AC, + + ReqSearchInfoHandler = 0x00AD, + + BlackListHandler = 0x00B7,// updated for sb + + LinkshellListHandler = 0x00BF,// updated for sb + + FcInfoReqHandler = 0x0100,// updated for sb + + ZoneLineHandler = 0x0107, // updated for sb + ActionHandler = 0x0108,// updated for sb + + DiscoveryHandler = 0x0109,// updated for sb + + SkillHandler = 0x010B, // updated for sb + GMCommand1 = 0x010D,// updated for sb + GMCommand2 = 0x010E,// updated for sb + UpdatePositionHandler = 0x010F, // updated for sb + + InventoryModifyHandler = 0x0116, // updated for sb + + TalkEventHandler = 0x011F, // updated for sb + EmoteEventHandler = 0x0120, // updated for sb + WithinRangeEventHandler = 0x0121, // updated for sb + OutOfRangeEventHandler = 0x0122, // updated for sb + EnterTeriEventHandler = 0x0123, // updated for sb + + ReturnEventHandler = 0x0128, + TradeReturnEventHandler = 0x0129, + }; + + + struct FFXIVARR_PACKET_RAW + { + FFXIVARR_PACKET_SEGMENT_HEADER segHdr; + std::vector data; + }; + + /** + * Structural representation of the common header for IPC packet segments. + * NOTE: This is packet segment type 3. + * + * 0 4 6 8 12 16 + * +-------+-------+------+----------+---------------+---------------+ + * | 14 00 | type | ?? | serverId | timestamp | ??? | + * +-------+-------+------+----------+---------------+---------------+ + * | | + * : data : + * | | + * +-----------------------------------------------------------------+ + */ + struct FFXIVARR_IPC_HEADER + { + uint16_t reserved; + ServerIpcType type; + uint16_t unknown_2; + uint16_t serverId; + uint32_t timestamp; + uint32_t unknown_C; + }; + + inline ostream& operator<<(ostream& os, const FFXIVARR_IPC_HEADER& hdr) + { + return os.write(reinterpret_cast(&hdr), sizeof hdr); + } + + inline istream& operator>>(istream& is, FFXIVARR_IPC_HEADER& hdr) + { + return is.read(reinterpret_cast(&hdr), sizeof hdr); + } + +} /* Packets */ +} /* Network */ +} /* Core */ + +#endif /*_CORE_NETWORK_PACKETS_COMMON_H*/ diff --git a/src/servers/Server_Common/Connection.cpp b/src/servers/Server_Common/Connection.cpp new file mode 100644 index 00000000..6e4040b2 --- /dev/null +++ b/src/servers/Server_Common/Connection.cpp @@ -0,0 +1,210 @@ +#include "Connection.h" +#include "Hive.h" +#include +#include + +namespace Core { + namespace Network { + //----------------------------------------------------------------------------- + + Connection::Connection( HivePtr hive ) + : m_hive( hive ), + m_socket( hive->GetService() ), + m_io_strand( hive->GetService() ), + m_receive_buffer_size( 32000 ), + m_error_state( 0 ) + { + } + + Connection::~Connection() + { + } + + void Connection::Bind( const std::string & ip, uint16_t port ) + { + boost::asio::ip::tcp::endpoint endpoint( boost::asio::ip::address::from_string( ip ), port ); + m_socket.open( endpoint.protocol() ); + m_socket.set_option( boost::asio::ip::tcp::acceptor::reuse_address( false ) ); + m_socket.bind( endpoint ); + } + + void Connection::StartSend() + { + if( !m_pending_sends.empty() ) + { + boost::asio::async_write( m_socket, + boost::asio::buffer( m_pending_sends.front() ), + m_io_strand.wrap( boost::bind( &Connection::HandleSend, + shared_from_this(), + boost::asio::placeholders::error, + m_pending_sends.begin() ) ) ); + } + } + + void Connection::StartRecv( int32_t total_bytes ) + { + if( total_bytes > 0 ) + { + m_recv_buffer.resize( total_bytes ); + boost::asio::async_read( m_socket, + boost::asio::buffer( m_recv_buffer ), + m_io_strand.wrap( boost::bind( &Connection::HandleRecv, + shared_from_this(), + _1, + _2 ) ) ); + } + else + { + m_recv_buffer.resize( m_receive_buffer_size ); + m_socket.async_read_some( boost::asio::buffer( m_recv_buffer ), + m_io_strand.wrap( boost::bind( &Connection::HandleRecv, + shared_from_this(), + _1, + _2 ) ) ); + } + } + + void Connection::StartError( const boost::system::error_code & error ) + { + if( boost::interprocess::ipcdetail::atomic_cas32( &m_error_state, 1, 0 ) == 0 ) + { + boost::system::error_code ec; + m_socket.shutdown( boost::asio::ip::tcp::socket::shutdown_both, ec ); + m_socket.close( ec ); + OnError( error ); + } + } + + void Connection::HandleConnect( const boost::system::error_code & error ) + { + if( error || HasError() || m_hive->HasStopped() ) + { + StartError( error ); + } + else + { + if( m_socket.is_open() ) + { + OnConnect( m_socket.remote_endpoint().address().to_string(), m_socket.remote_endpoint().port() ); + Recv(); + } + else + { + StartError( error ); + } + } + } + + void Connection::HandleSend( const boost::system::error_code & error, std::list< std::vector< uint8_t > >::iterator itr ) + { + if( error || HasError() || m_hive->HasStopped() ) + { + StartError( error ); + } + else + { + OnSend( *itr ); + m_pending_sends.erase( itr ); + StartSend(); + } + } + + void Connection::HandleRecv( const boost::system::error_code & error, int32_t actual_bytes ) + { + if( error || HasError() || m_hive->HasStopped() ) + { + StartError( error ); + } + else + { + m_recv_buffer.resize( actual_bytes ); + OnRecv( m_recv_buffer ); + Recv(); + m_pending_recvs.pop_front(); + if( !m_pending_recvs.empty() ) + { + StartRecv( m_pending_recvs.front() ); + } + } + } + + void Connection::DispatchSend( std::vector< uint8_t > buffer ) + { + bool should_start_send = m_pending_sends.empty(); + m_pending_sends.push_back( buffer ); + if( should_start_send ) + { + StartSend(); + } + } + + void Connection::DispatchRecv( int32_t total_bytes ) + { + bool should_start_receive = m_pending_recvs.empty(); + m_pending_recvs.push_back( total_bytes ); + if( should_start_receive ) + { + StartRecv( total_bytes ); + } + } + + + void Connection::Connect( const std::string & host, uint16_t port) + { + boost::asio::ip::tcp::resolver resolver( m_hive->GetService() ); + boost::asio::ip::tcp::resolver::query query( host, std::to_string( port ) ); + boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve( query ); + m_socket.async_connect( *iterator, m_io_strand.wrap( boost::bind( &Connection::HandleConnect, shared_from_this(), _1 ) ) ); + + } + + void Connection::Disconnect() + { + OnDisconnect(); + m_socket.close(); + } + + void Connection::Recv( int32_t total_bytes ) + { + m_io_strand.post( boost::bind( &Connection::DispatchRecv, shared_from_this(), total_bytes ) ); + } + + void Connection::Send( const std::vector< uint8_t > & buffer ) + { + m_io_strand.post( boost::bind( &Connection::DispatchSend, shared_from_this(), buffer ) ); + } + + boost::asio::ip::tcp::socket & Connection::GetSocket() + { + return m_socket; + } + + boost::asio::strand & Connection::GetStrand() + { + return m_io_strand; + } + + HivePtr Connection::GetHive() + { + return m_hive; + } + + void Connection::SetReceiveBufferSize( int32_t size ) + { + m_receive_buffer_size = size; + } + + int32_t Connection::GetReceiveBufferSize() const + { + return m_receive_buffer_size; + } + + bool Connection::HasError() + { + return ( boost::interprocess::ipcdetail::atomic_cas32( &m_error_state, 1, 1 ) == 1 ); + } + + + } +} +//----------------------------------------------------------------------------- \ No newline at end of file diff --git a/src/servers/Server_Common/Connection.h b/src/servers/Server_Common/Connection.h new file mode 100644 index 00000000..14e229fc --- /dev/null +++ b/src/servers/Server_Common/Connection.h @@ -0,0 +1,144 @@ +#ifndef CONNECTION_H_ +#define CONNECTION_H_ + +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include + +#include "Forwards.h" +#include "Acceptor.h" + + +namespace Core { + namespace Network { + //----------------------------------------------------------------------------- + + class Hive; + class Acceptor; + class Connection; + + //----------------------------------------------------------------------------- + + class Connection : public boost::enable_shared_from_this< Connection > + { + friend class Acceptor; + friend class Hive; + + protected: + HivePtr m_hive; + boost::asio::ip::tcp::socket m_socket; + boost::asio::strand m_io_strand; + std::vector< uint8_t > m_recv_buffer; + std::list< int32_t > m_pending_recvs; + std::list< std::vector< uint8_t > > m_pending_sends; + int32_t m_receive_buffer_size; + volatile uint32_t m_error_state; + + + Connection( HivePtr hive ); + virtual ~Connection(); + + private: + Connection( const Connection & rhs ); + Connection & operator =( const Connection & rhs ); + void StartSend(); + void StartRecv( int32_t total_bytes ); + void StartError( const boost::system::error_code & error ); + void DispatchSend( std::vector< uint8_t > buffer ); + void DispatchRecv( int32_t total_bytes ); + void HandleConnect( const boost::system::error_code & error ); + void HandleSend( const boost::system::error_code & error, std::list< std::vector< uint8_t > >::iterator itr ); + void HandleRecv( const boost::system::error_code & error, int32_t actual_bytes ); + + + private: + // Called when the connection has successfully connected to the local host. + virtual void OnAccept( const std::string & host, uint16_t port ) {}; + + // Called when the connection has successfully connected to the remote host. + virtual void OnConnect( const std::string & host, uint16_t port ) {}; + + // Called when data has been sent by the connection. + virtual void OnSend( const std::vector< uint8_t > & buffer ) {}; + + // Called when data has been received by the connection. + virtual void OnRecv( std::vector< uint8_t > & buffer ) {}; + + // Called when an error is encountered. + virtual void OnError( const boost::system::error_code & error ) {}; + + // Called when the connection has been disconnected + virtual void OnDisconnect() {}; + + public: + // Returns the Hive object. + HivePtr GetHive(); + + // Returns the socket object. + boost::asio::ip::tcp::socket & GetSocket(); + + // Returns the strand object. + boost::asio::strand & GetStrand(); + + // Sets the application specific receive buffer size used. For stream + // based protocols such as HTTP, you want this to be pretty large, like + // 64kb. For packet based protocols, then it will be much smaller, + // usually 512b - 8kb depending on the protocol. The default value is + // 4kb. + void SetReceiveBufferSize( int32_t size ); + + // Returns the size of the receive buffer size of the current object. + int32_t GetReceiveBufferSize() const; + + // Returns true if this object has an error associated with it. + bool HasError(); + + // Binds the socket to the specified interface. + void Bind( const std::string & ip, uint16_t port ); + + // Starts an a/synchronous connect. + void Connect( const std::string & host, uint16_t port ); + + // Posts data to be sent to the connection. + void Send( const std::vector< uint8_t > & buffer ); + + // Posts a recv for the connection to process. If total_bytes is 0, then + // as many bytes as possible up to GetReceiveBufferSize() will be + // waited for. If Recv is not 0, then the connection will wait for exactly + // total_bytes before invoking OnRecv. + void Recv( int32_t total_bytes = 0 ); + + // Posts an asynchronous disconnect event for the object to process. + void Disconnect(); + }; + + //----------------------------------------------------------------------------- + + //----------------------------------------------------------------------------- + + template + boost::shared_ptr< T > addServerToHive( const std::string& listenIp, uint32_t port, HivePtr pHive ) + { + try + { + AcceptorPtr acceptor( new Acceptor( pHive ) ); + acceptor->Listen( listenIp, port ); + boost::shared_ptr< T > connection( new T( pHive, acceptor ) ); + acceptor->Accept( connection ); + return connection; + } + catch( std::runtime_error e ) + { + throw; + } + } + + } + + +} +#endif \ No newline at end of file diff --git a/src/servers/Server_Common/Database.cpp b/src/servers/Server_Common/Database.cpp new file mode 100644 index 00000000..af9ba2ab --- /dev/null +++ b/src/servers/Server_Common/Database.cpp @@ -0,0 +1,411 @@ +#include "Database.h" + +#include +#include + +#include +#include +#include + +#include "Logger.h" + +extern Core::Logger g_log; + +namespace Core { +namespace Db { + +QueryResult::QueryResult( MYSQL_RES *res, uint32_t fields, uint32_t rows ) + : m_result( res ), + m_fieldCount( fields ), + m_rowCount( rows ) +{ + m_currentRow = new Field[fields]; +} + +QueryResult::~QueryResult() +{ + mysql_free_result( m_result ); + delete[] m_currentRow; +} + +bool QueryResult::nextRow() +{ + MYSQL_ROW row = mysql_fetch_row( m_result ); + if( row == NULL ) + { + return false; + } + + for( uint32_t i = 0; i < m_fieldCount; ++i ) + { + m_currentRow[i].setValue( row[i] ); + } + + return true; +} + +Database::Database() +{ + m_port = 0; + _counter = 0; + m_pConnections = nullptr; + m_connectionCount = -1; // Not connected. +} + +Database::~Database() +{ + for( int32_t i = 0; i < m_connectionCount; ++i ) + { + if( m_pConnections[i].conn != nullptr ) + { + mysql_close( m_pConnections[i].conn ); + } + } + + delete[] m_pConnections; +} + +bool Database::initialize( const DatabaseParams& params ) +{ + uint32_t i; + MYSQL * temp; + MYSQL * temp2; + my_bool my_true = true; + + g_log.Log( Core::LoggingSeverity::info, "Database: Connecting to " + params.hostname + ", database " + params.databaseName + "..." ); + + m_pConnections = new DatabaseConnection[params.connectionCount]; + for( i = 0; i < params.connectionCount; ++i ) + { + temp = mysql_init( NULL ); + if( mysql_options( temp, MYSQL_SET_CHARSET_NAME, "utf8" ) ) + { + g_log.Log( Core::LoggingSeverity::error, "Database: Could not set utf8 character set." ); + } + + if( mysql_options( temp, MYSQL_OPT_RECONNECT, &my_true ) ) + { + g_log.Log( Core::LoggingSeverity::error, "Database: MYSQL_OPT_RECONNECT could not be set, connection drops may occur but will be counteracted." ); + } + + temp2 = mysql_real_connect( temp, + params.hostname.c_str(), + params.username.c_str(), + params.password.c_str(), + params.databaseName.c_str(), + params.port, + NULL, + 0 ); + if( temp2 == NULL ) + { + g_log.Log( Core::LoggingSeverity::fatal, "Database: Connection failed due to: `%s`" + std::string( mysql_error( temp ) ) ); + return false; + } + + m_pConnections[i].conn = temp2; + } + + + return true; +} + +uint64_t Database::getNextUId() +{ + execute( "INSERT INTO uniqueiddata( IdName ) VALUES( 'NOT_SET' );" ); + auto res = query( "SELECT LAST_INSERT_ID();" ); + + if( !res ) + { + return 0; + } + + Db::Field *field = res->fetch(); + + return field[0].getUInt64(); +} + +DatabaseConnection * Database::getFreeConnection() +{ + uint32_t i = 0; + for( ;;) + { + DatabaseConnection * con = &m_pConnections[( ( i++ ) % m_connectionCount )]; + if( con->lock.try_lock() ) + { + return con; + } + + // sleep every 20 iterations, otherwise this can cause 100% cpu if the db link goes dead + if( !( i % 20 ) ) + { + std::this_thread::sleep_for( std::chrono::milliseconds( 10 ) ); + } + } + + // shouldn't be reached + return NULL; +} + +boost::shared_ptr Database::query( const std::string& QueryString ) +{ + + // Send the query + boost::shared_ptr qResult( nullptr ); + DatabaseConnection * con = getFreeConnection(); + + if( _SendQuery( con, QueryString.c_str(), false ) ) + { + qResult = boost::shared_ptr( _StoreQueryResult( con ) ); + } + + con->lock.unlock(); + return qResult; +} + +QueryResult * Database::queryNA( const char* QueryString ) +{ + // Send the query + QueryResult * qResult = NULL; + DatabaseConnection * con = getFreeConnection(); + + if( _SendQuery( con, QueryString, false ) ) + { + qResult = _StoreQueryResult( con ); + } + + con->lock.unlock(); + return qResult; +} + +QueryResult * Database::fQuery( const char * QueryString, DatabaseConnection * con ) { + // Send the query + QueryResult * qResult = NULL; + if( _SendQuery( con, QueryString, false ) ) + { + qResult = _StoreQueryResult( con ); + } + + return qResult; +} + +void Database::fWaitExecute( const char * QueryString, DatabaseConnection * con ) +{ + // Send the query + _SendQuery( con, QueryString, false ); +} + + +bool Database::execute( const char* QueryString, ... ) { + char query[16384]; + + va_list vlist; + va_start( vlist, QueryString ); + vsnprintf( query, 16384, QueryString, vlist ); + va_end( vlist ); + + + return waitExecuteNA( query ); + +} + +bool Database::execute( const std::string& QueryString ) +{ + return waitExecuteNA( QueryString.c_str() ); +} + +bool Database::executeNA( const char* QueryString ) +{ + + return waitExecuteNA( QueryString ); + +} + +//this will wait for completion +bool Database::waitExecute( const char* QueryString, ... ) +{ + char sql[16384]; + va_list vlist; + va_start( vlist, QueryString ); + vsnprintf( sql, 16384, QueryString, vlist ); + va_end( vlist ); + + DatabaseConnection * con = getFreeConnection(); + bool Result = _SendQuery( con, sql, false ); + con->lock.unlock(); + return Result; +} + +bool Database::waitExecuteNA( const char* QueryString ) +{ + DatabaseConnection * con = getFreeConnection(); + bool Result = _SendQuery( con, QueryString, false ); + con->lock.unlock(); + return Result; +} + + +void Database::freeQueryResult( QueryResult * p ) +{ + delete p; +} + +std::string Database::escapeString( std::string Escape ) +{ + char a2[16384] = { 0 }; + + DatabaseConnection * con = getFreeConnection(); + const char * ret; + if( mysql_real_escape_string( con->conn, a2, Escape.c_str(), ( unsigned long ) Escape.length() ) == 0 ) + { + ret = Escape.c_str(); + } + else { + ret = a2; + } + + con->lock.unlock(); + return std::string( ret ); +} + +void Database::escapeLongString( const char * str, uint32_t len, std::stringstream& out ) +{ + char a2[65536 * 3] = { 0 }; + + DatabaseConnection * con = getFreeConnection(); + mysql_real_escape_string( con->conn, a2, str, ( unsigned long ) len ); + + out.write( a2, ( std::streamsize )strlen( a2 ) ); + con->lock.unlock(); +} + +std::string Database::escapeString( const char * esc, DatabaseConnection * con ) +{ + char a2[16384] = { 0 }; + const char * ret; + if( mysql_real_escape_string( con->conn, a2, ( char* ) esc, ( unsigned long ) strlen( esc ) ) == 0 ) + { + ret = esc; + } + else + { + ret = a2; + } + + return std::string( ret ); +} + +bool Database::_SendQuery( DatabaseConnection *con, const char* Sql, bool Self ) +{ + //dunno what it does ...leaving untouched + int result = mysql_query( con->conn, Sql ); + if( result > 0 ) + { + if( Self == false && _HandleError( con, mysql_errno( con->conn ) ) ) + { + // Re-send the query, the connection was successful. + // The true on the end will prevent an endless loop here, as it will + // stop after sending the query twice. + result = _SendQuery( con, Sql, true ); + } + else + { + g_log.Log( Core::LoggingSeverity::error, "Database: query failed " + std::string( mysql_error( con->conn ) ) ); + g_log.Log( Core::LoggingSeverity::error, "\t" + std::string( Sql ) ); + } + } + + return ( result == 0 ? true : false ); +} + +bool Database::_HandleError( DatabaseConnection * con, uint32_t ErrorNumber ) +{ + // Handle errors that should cause a reconnect to the CDatabase. + switch( ErrorNumber ) { + case 2006: // Mysql server has gone away + case 2008: // Client ran out of memory + case 2013: // Lost connection to sql server during query + case 2055: // Lost connection to sql server - system error + { + // Let's instruct a reconnect to the db when we encounter these errors. + return _Reconnect( con ); + }break; + } + + return false; +} + +QueryResult * Database::_StoreQueryResult( DatabaseConnection * con ) +{ + QueryResult *res; + MYSQL_RES * pRes = mysql_store_result( con->conn ); + uint32_t uRows = ( uint32_t ) mysql_affected_rows( con->conn ); + uint32_t uFields = ( uint32_t ) mysql_field_count( con->conn ); + + if( uRows == 0 || uFields == 0 || pRes == 0 ) + { + if( pRes != NULL ) + { + mysql_free_result( pRes ); + } + + return NULL; + } + + res = new QueryResult( pRes, uFields, uRows ); + res->nextRow(); + + return res; +} + +bool Database::_Reconnect( DatabaseConnection * conn ) +{ + MYSQL * temp; + MYSQL * temp2; + + temp = mysql_init( NULL ); + + temp2 = mysql_real_connect( temp, + m_hostname.c_str(), + m_username.c_str(), + m_password.c_str(), + m_databaseName.c_str(), + m_port, + NULL, + 0 ); + if( temp2 == NULL ) + { + g_log.Log( Core::LoggingSeverity::error, "Database: Could not reconnect to database because of " + std::string( mysql_error( temp ) ) ); + mysql_close( temp ); + return false; + } + + if( conn->conn != NULL ) + { + mysql_close( conn->conn ); + } + + conn->conn = temp; + return true; +} + +void Database::cleanupLibs() +{ + mysql_library_end(); +} + + + +void Database::shutdown() +{ + for( int32_t i = 0; i < m_connectionCount; ++i ) + { + if( m_pConnections[i].conn != NULL ) + { + mysql_close( m_pConnections[i].conn ); + m_pConnections[i].conn = NULL; + } + } +} + +} +} diff --git a/src/servers/Server_Common/Database.h b/src/servers/Server_Common/Database.h new file mode 100644 index 00000000..5cea1373 --- /dev/null +++ b/src/servers/Server_Common/Database.h @@ -0,0 +1,242 @@ +#ifndef _DATABASE_H +#define _DATABASE_H + +#include +#include + +#include + +#include +#include + +namespace Core { + namespace Db { + + // CField is used to access db-query resultsets + class Field + { + public: + + // set value + __inline void setValue( char* value ) + { + m_pValue = value; + } + + // return as string + __inline const char *getString() + { + + return m_pValue ? m_pValue : ""; + } + + // return as string + __inline void getBinary( char* dstBuf, uint16_t size ) + { + if( m_pValue ) + { + memcpy( dstBuf, m_pValue, size ); + } + else + { + dstBuf = NULL; + } + } + + // return as float + __inline float getFloat() + { + return m_pValue ? static_cast< float >( atof( m_pValue ) ) : 0; + } + + // return as bool + __inline bool getBool() + { + return m_pValue ? atoi( m_pValue ) > 0 : false; + } + + // return as unsigned 8 bit integer + __inline uint8_t getUInt8() + { + return m_pValue ? static_cast< uint8_t >( atol( m_pValue ) ) : 0; + } + + // return as signed 8 bit integer + __inline int8_t getInt8() + { + return m_pValue ? static_cast< int8_t >( atol( m_pValue ) ) : 0; + } + + // return as unsigned 16 bit integer + __inline uint16_t getUInt16() + { + return m_pValue ? static_cast< uint16_t >( atol( m_pValue ) ) : 0; + } + + // return as signed 16 bit integer + __inline int16_t getInt16() + { + return m_pValue ? static_cast< int16_t >( atol( m_pValue ) ) : 0; + } + + // return as unsigned 32 bit integer + __inline uint32_t getUInt32() + { + return m_pValue ? static_cast< uint32_t >( atol( m_pValue ) ) : 0; + } + + // return as signed 8 bit integer + __inline int32_t getInt32() + { + return m_pValue ? static_cast< int32_t >( atol( m_pValue ) ) : 0; + } + + // return as unsigned 64 bit integer + uint64_t getUInt64() + { + if( m_pValue ) + { + #ifdef _WIN32 + uint64_t value; + sscanf( m_pValue, "%I64d", &value ); + return value; + #else + uint64_t value; + sscanf( m_pValue, "%Lu", &value ); + return value; + + #endif + } + else + return 0; + } + + private: + char *m_pValue; + }; + + + class QueryResult + { + public: + QueryResult( MYSQL_RES *res, uint32_t fields, uint32_t rows ); + ~QueryResult(); + + bool nextRow(); + void Delete() + { + delete this; + } + + __inline Field* fetch() + { + return m_currentRow; + } + __inline uint32_t getFieldCount() const + { + return m_fieldCount; + } + __inline uint32_t getRowCount() const + { + return m_rowCount; + } + + protected: + uint32_t m_fieldCount; + uint32_t m_rowCount; + Field *m_currentRow; + MYSQL_RES *m_result; + }; + + struct DatabaseConnection + { + std::mutex lock; + MYSQL *conn; + }; + + struct DatabaseParams + { + std::string hostname; + std::string username; + std::string password; + std::string databaseName; + uint16_t port; + uint32_t bufferSize; + uint32_t connectionCount; + }; + + class Database + { + public: + Database(); + virtual ~Database(); + + /************************************************************************/ + /* Virtual Functions */ + /************************************************************************/ + bool initialize( const DatabaseParams& params ); + + void shutdown(); + + boost::shared_ptr query( const std::string& QueryString ); + QueryResult* queryNA( const char* QueryString ); + QueryResult* fQuery( const char * QueryString, DatabaseConnection *con ); + void fWaitExecute( const char * QueryString, DatabaseConnection *con ); + bool waitExecute( const char* QueryString, ... );//Wait For Request Completion + bool waitExecuteNA( const char* QueryString );//Wait For Request Completion + bool execute( const char* QueryString, ... ); + bool execute( const std::string& QueryString ); + bool executeNA( const char* QueryString ); + + __inline const std::string& getHostName() + { + return m_hostname; + } + + __inline const std::string& getDatabaseName() + { + return m_databaseName; + } + + std::string escapeString( std::string Escape ); + void escapeLongString( const char * str, uint32_t len, std::stringstream& out ); + std::string escapeString( const char * esc, DatabaseConnection *con ); + + void freeQueryResult( QueryResult * p ); + + DatabaseConnection *getFreeConnection(); + + void cleanupLibs(); + + /* database is killed off manually. */ + void onShutdown() {} + + uint64_t getNextUId(); + + protected: + + // actual query function + bool _SendQuery( DatabaseConnection *con, const char* Sql, bool Self ); + QueryResult * _StoreQueryResult( DatabaseConnection * con ); + bool _HandleError( DatabaseConnection *conn, uint32_t ErrorNumber ); + bool _Reconnect( DatabaseConnection *conn ); + + DatabaseConnection *m_pConnections; + + uint32_t _counter; + /////////////////////////////// + + int32_t m_connectionCount; + + // For reconnecting a broken connection + std::string m_hostname; + std::string m_username; + std::string m_password; + std::string m_databaseName; + uint32_t m_port; + + }; + + } +} +#endif diff --git a/src/servers/Server_Common/ExdData.cpp b/src/servers/Server_Common/ExdData.cpp new file mode 100644 index 00000000..8cc1e6e8 --- /dev/null +++ b/src/servers/Server_Common/ExdData.cpp @@ -0,0 +1,672 @@ +#include "ExdData.h" +#include + +#include + +/* TYPES !! + case DataType::boolean: 1 + case DataType::int8: 2 + case DataType::uint8: 3 + case DataType::int16: 4 + case DataType::uint16: 5 + case DataType::int32: 6 + case DataType::uint32: 7 + case DataType::float32: 8 + case DataType::uint64: 9 + */ + + + +Core::Data::ExdData::ExdData() +{ +} + +Core::Data::ExdData::~ExdData( void ) +{ +} + +xiv::exd::Exd Core::Data::ExdData::setupDatAccess( const std::string& name, xiv::exd::Language lang ) +{ + auto& cat = m_exd_data->get_category( name ); + return static_cast< xiv::exd::Exd >( cat.get_data_ln( lang ) ); +}; + +bool Core::Data::ExdData::init( const std::string& path ) +{ + try + { + m_data = boost::make_shared< xiv::dat::GameData >( path ); + m_exd_data = boost::make_shared< xiv::exd::ExdData >( *m_data ); + + m_questDat = setupDatAccess( "Quest", xiv::exd::Language::en ); + m_openingDat = setupDatAccess( "Opening", xiv::exd::Language::none ); + m_customTalkDat = setupDatAccess( "CustomTalk", xiv::exd::Language::en ); + m_aetheryteDat = setupDatAccess( "Aetheryte", xiv::exd::Language::en ); + m_levelDat = setupDatAccess( "Level", xiv::exd::Language::none ); + m_placeNameDat = setupDatAccess( "PlaceName", xiv::exd::Language::en ); + m_itemsDat = setupDatAccess( "Item", xiv::exd::Language::en ); + m_classJobCatDat = setupDatAccess( "ClassJobCategory", xiv::exd::Language::en ); + m_raceDat = setupDatAccess( "Race", xiv::exd::Language::en ); + m_eventItemDat = setupDatAccess( "EventItem", xiv::exd::Language::en ); + } + catch( std::runtime_error ) + { + return false; + } + + return true; +} + +bool Core::Data::ExdData::loadZoneInfo() +{ + auto territoryTypeData = setupDatAccess( "TerritoryType", xiv::exd::Language::none ); + auto placeNameData = setupDatAccess( "PlaceName", xiv::exd::Language::en ); + auto mapData = setupDatAccess( "Map", xiv::exd::Language::none ); + auto weatherRate = setupDatAccess( "WeatherRate", xiv::exd::Language::none ); + + auto territoryTypeDataRows = territoryTypeData.get_rows(); + + for( auto row : territoryTypeDataRows ) + { + auto& fields = row.second; + uint32_t id = row.first; + + uint16_t place_id = getField< uint16_t >( fields, 5 ); + uint16_t map_id = getField< uint16_t >( fields, 6 ); + std::string zoneStr = getField< std::string >( fields, 0 ); + + if( zoneStr.empty() ) + continue; + + auto placeNameDataFields = placeNameData.get_row( place_id ); + std::string zone_str = getField< std::string >( placeNameDataFields, 0 ); + + auto mapDataFields = mapData.get_row( map_id ); + int16_t map_index = getField< int16_t >( mapDataFields, 12 ); + bool is_two_bytes = getField< bool >( mapDataFields, 15 ); + + uint8_t weather_rate = getField< uint8_t >( fields, 10 ) > 75 ? 0 : getField< uint8_t >( fields, 10 ); + auto weatherRateFields = weatherRate.get_row( weather_rate ); + + int32_t aetheryte_index = getField< int32_t >( fields, 20 ); + + + ZoneInfo info{ 0 }; + info.id = id; + info.zone_name = zoneStr; + info.zone_str = zone_str; + info.layout_id = id; + info.discovery_index = map_index; + info.is_two_byte = is_two_bytes; + info.map_id = map_id; + info.weather_rate = weather_rate; // TODO: deal with weather groups + info.aetheryte_index = aetheryte_index; + + uint8_t sumPc = 0; + for( size_t i = 0; i < 16; ) + { + int32_t weatherId = getField< int32_t >( weatherRateFields, i ); + + if( weatherId == 0 ) + break; + + sumPc += getField< uint8_t >( weatherRateFields, i + 1 ); + info.weather_rate_map[sumPc] = weatherId; + + i += 2; + } + + m_zoneInfoMap[id] = info; + + } + + return true; +} + +bool Core::Data::ExdData::loadStatusEffectInfo() +{ + auto StatusDat = setupDatAccess( "Status", xiv::exd::Language::en ); + auto rows1 = StatusDat.get_rows(); + + for( auto row : rows1 ) + { + auto& fields = row.second; + uint32_t id = row.first; + + StatusEffectInfo info { 0 }; + info.id = id; + info.name = getField< std::string >( fields, 0 ); + m_statusEffectInfoMap[id] = info; + } + + return true; +} + +bool Core::Data::ExdData::loadAetheryteInfo() +{ + auto AetheryteDat = setupDatAccess( "Aetheryte", xiv::exd::Language::en ); + auto rows = AetheryteDat.get_rows(); + + for( auto row : rows ) + { + auto& fields = row.second; + auto info = boost::make_shared< AetheryteInfo >(); + info->id = row.first; + info->target_zone = getField< uint16_t >( fields, 10 ); + + info->isAetheryte = getField< bool >( fields, 15 ); + + uint16_t placename = getField< uint16_t >( fields, 8 ); + auto placeNameInfo = getPlaceNameInfo( placename ); + + if( placeNameInfo ) + { + info->placename = placeNameInfo->placename; + } + + + uint16_t placename_aethernet = getField< uint16_t >( fields, 9 ); + + auto placename_aethernetInfo = getPlaceNameInfo( placename_aethernet ); + + if( placename_aethernetInfo ) + { + info->placename_aethernet = placename_aethernetInfo->placename; + } + + info->levelId = getField< uint32_t >( fields, 11 ); + + info->map_coord_x = getField< int16_t >( fields, 20 ); + info->map_coord_y = getField< int16_t >( fields, 21 ); + m_aetheryteInfoMap.emplace( std::make_pair( info->id, info ) ); + } + return true; +} + +bool Core::Data::ExdData::loadClassJobInfo() +{ + auto ClassJobDat = setupDatAccess( "ClassJob", xiv::exd::Language::en ); + auto rows = ClassJobDat.get_rows(); + + for( auto row : rows ) + { + auto& fields = row.second; + ClassJobInfo info { 0 }; + + uint32_t id = row.first; + + if( id == 0 ) + continue; + + std::string name = getField< std::string >( fields, 0 ); + std::string short_name = getField< std::string >( fields, 1 ); + int8_t exp_idx = getField< int8_t >( fields, 4 ); + + + info.id = id; + info.name = name; + info.name_short = short_name; + info.exp_idx = exp_idx; + info.start_weapon_id = getField< int32_t >( fields, 28 ); + info.mod_hp = getField< uint16_t >( fields, 9 ); + info.mod_mpcpgp = getField< uint16_t >( fields, 10 ); + info.mod_str = getField< uint16_t >( fields, 11 ); + info.mod_vit = getField< uint16_t >( fields, 12 ); + info.mod_dex = getField< uint16_t >( fields, 13 ); + info.mod_int = getField< uint16_t >( fields, 14 ); + info.mod_mnd = getField< uint16_t >( fields, 15 ); + info.mod_pie = getField< uint16_t >( fields, 16 ); + + m_classJobInfoMap[id] = info; + } + + return true; +} + +bool Core::Data::ExdData::loadParamGrowInfo() +{ + auto ParamGrowDat = setupDatAccess( "ParamGrow", xiv::exd::Language::none ); + auto rows = ParamGrowDat.get_rows(); + + for( auto row : rows ) + { + auto& fields = row.second; + + ParamGrowthInfo info { 0 }; + uint32_t id = row.first; + info.level = id; + info.needed_exp = getField< int32_t >( fields, 0 ); + info.piety_scalar = getField< uint16_t >( fields, 3 ); // 3 + info.mp_const = getField< int32_t >( fields, 4 ); // 4 + info.base_secondary = getField< int32_t >( fields, 5 );// 5 + info.hp_mod = getField< uint16_t >( fields, 8 ); // 8 + info.quest_exp_mod = getField< uint8_t >( fields, 7 ); // 7 + + + m_paramGrowthInfoMap[id] = info; + } + + return true; +} + +bool Core::Data::ExdData::loadTribeInfo() +{ + auto tribeDat = setupDatAccess( "Tribe", xiv::exd::Language::en ); + auto rows = tribeDat.get_rows(); + + for( auto row : rows ) + { + auto& fields = row.second; + + TribeInfo info { 0 }; + uint32_t id = row.first; + info.id = id; + info.name = getField< std::string >( fields, 0 ); + info.mod_str = getField< int8_t >( fields, 4 ); + info.mod_vit = getField< int8_t >( fields, 5 ); + info.mod_dex = getField< int8_t >( fields, 6 ); + info.mod_int = getField< int8_t >( fields, 7 ); + info.mod_mnd = getField< int8_t >( fields, 8 ); + info.mod_pie = getField< int8_t >( fields, 9 ); + + m_tribeInfoMap[id] = info; + } + + return true; +} + +bool Core::Data::ExdData::loadEventActionInfo() +{ + auto EventActionDat = setupDatAccess( "EventAction", xiv::exd::Language::en ); + auto rows = EventActionDat.get_rows(); + + for( auto row : rows ) + { + auto& fields = row.second; + + EventActionInfo info { 0 }; + + uint32_t id = row.first; + + if( id == 0 ) + { + continue; + } + + std::string name = getField< std::string >( fields, 0 ); + uint8_t time = getField< uint8_t >( fields, 2 ); + + info.id = id; + info.name = name; + info.castTime = time * 1000; + + m_EventActionInfoMap[id] = info; + + } + + return true; +} + +bool Core::Data::ExdData::loadActionInfo() +{ + auto ActionDat = setupDatAccess( "Action", xiv::exd::Language::en ); + auto rows = ActionDat.get_rows(); + + for( auto row : rows ) + { + auto& fields = row.second; + + ActionInfo info{ 0 }; + + uint32_t id = row.first; + if( id == 0 ) + { + continue; + } + + std::string name = getField< std::string >( fields, 0 ); + uint8_t category = getField< uint8_t >( fields, 3 ); + + int8_t class_job = getField< int8_t >( fields, 10 );//9 + uint8_t unlock_level = getField< uint8_t >( fields, 11 );//10 + int8_t range = getField< int8_t >( fields, 13 );//11 + bool can_target_self = getField< bool >( fields, 14 );//12 + bool can_target_party = getField< bool>( fields, 15 );//13 + bool can_target_friendly = getField< bool >( fields, 16 );//14 + bool can_target_enemy = getField< bool >( fields, 17 );//15 + + bool is_aoe = getField< bool >( fields, 20 );//18 + + bool can_target_ko = getField< bool >( fields, 24 );//22 + + uint8_t aoe_type = getField< uint8_t >( fields, 26 );//24 + uint8_t radius = getField< uint8_t >( fields, 27 );//25 + + uint8_t points_type = getField< uint8_t >( fields, 30 );//28 + uint16_t points_cost = getField< uint16_t >( fields, 31 );//29 + + bool is_instant = getField< bool >( fields, 35 ); + uint16_t cast_time = getField< uint16_t >( fields, 36 ); + uint16_t recast_time = getField< uint16_t >( fields, 37 ); + + info.id = id; + info.name = name; + info.category = category; + + info.class_job = class_job; + info.unlock_level = unlock_level; + info.range = range; + info.can_target_self = can_target_self; + info.can_target_party = can_target_party; + info.can_target_friendly = can_target_friendly; + info.can_target_enemy = can_target_enemy; + + info.can_target_ko = can_target_ko; + + info.is_aoe = is_aoe; + + info.aoe_type = aoe_type; + info.radius = radius; + + info.points_type = points_type; + info.points_cost = points_cost; + + info.is_instant = is_instant; + info.cast_time = cast_time * 100; + info.recast_time = recast_time * 100; + + m_actionInfoMap[id] = info; + + } + + return true; +} + +boost::shared_ptr< Core::Data::PlaceNameInfo > + Core::Data::ExdData::getPlaceNameInfo( uint32_t placeNameId ) +{ + try + { + auto row = m_placeNameDat.get_row( placeNameId ); + auto info = boost::make_shared< PlaceNameInfo >(); + info->id = placeNameId; + info->placename = getField< std::string >( row, 0 ); + return info; + } + catch( ... ) + { + return nullptr; + } + + return nullptr; + +} + +boost::shared_ptr< Core::Data::ItemInfo > + Core::Data::ExdData::getItemInfo( uint32_t catalogId ) +{ + try + { + auto row = m_itemsDat.get_row( catalogId ); + auto info = boost::make_shared< ItemInfo >(); + info->id = catalogId; + info->name = getField< std::string >( row, 0 ); + info->item_level = getField< uint16_t >( row, 11 ); + info->required_level = getField< uint8_t >( row, 12 ); + info->ui_category = getField< uint8_t >( row, 17 ); + info->stack_size = getField< uint32_t >( row, 19 ); + info->is_hqable = getField< bool >( row, 20 ); + info->model_primary = getField< uint64_t >( row, 45 ); + info->model_secondary = getField< uint64_t >( row, 46 ); + info->delayMs = getField< uint16_t >( row, 51 ); + info->is_unique = getField< int16_t >( row, 64 ) != 0 ? true : false; + info->is_untradeable = getField< uint8_t >( row, 65 ) != 0 ? true : false; + + return info; + } + catch( ... ) + { + return nullptr; + } + + return nullptr; +} + +boost::shared_ptr< Core::Data::AetheryteInfo > + Core::Data::ExdData::getAetheryteInfo( uint32_t aetheryteId ) +{ + try + { + return m_aetheryteInfoMap[aetheryteId]; + } + catch( ... ) + { + return nullptr; + } + + return nullptr; + +} + +boost::shared_ptr< Core::Data::CustomTalkInfo > + Core::Data::ExdData::getCustomTalkInfo( uint32_t customTalkId ) +{ + + try + { + auto row = m_customTalkDat.get_row( customTalkId ); + auto info = boost::make_shared< CustomTalkInfo >(); + info->id = customTalkId; + info->name_intern = getField< std::string >( row, 2 ); + + return info; + } + catch( ... ) + { + return nullptr; + } + + return nullptr; + +} + +boost::shared_ptr< Core::Data::QuestInfo > + Core::Data::ExdData::getQuestInfo( uint32_t questId ) +{ + + + try + { + auto row = m_questDat.get_row( questId ); + auto info = boost::make_shared< QuestInfo >(); + info->id = questId; + info->name = getField< std::string >( row, 0 ); + info->name_intern = getField< std::string >( row, 1 ); + + info->quest_level = getField< uint16_t >( row, 4 ); + + info->enpc_resident_start = getField< uint32_t >( row, 38 ); + info->enpc_resident_end = getField< uint32_t >( row, 40 ); + + info->reward_exp_factor = getField< uint16_t >( row, 1437 ); + info->reward_gil = getField< uint32_t >( row, 1438 ); + info->reward_gc_seals = getField< uint16_t >( row, 1440 ); + + info->reward_item_type = getField< uint8_t >( row, 1447 ); + + for( uint32_t i = 0; i < 6; i++ ) + { + uint32_t entry = getField< uint32_t >( row, i + 1448 ); + if( entry > 0 ) + info->reward_item.push_back( entry ); + + uint8_t entry1 = getField< uint8_t >( row, i + 1455 ); + if( entry1 > 0 ) + info->reward_item_count.push_back( entry1 ); + + uint8_t entry2 = getField< uint8_t >( row, i + 1462 ); + if( entry2 > 0 ) + info->reward_item_stain.push_back( entry2 ); + + } + + for( uint32_t i = 0; i < 5; i++ ) + { + uint32_t entry = getField< uint32_t >( row, i + 1469 ); + if( entry > 0 ) + info->reward_item_optional.push_back( entry ); + + uint8_t entry1 = getField< uint8_t >( row, i + 1474 ); + if( entry1 > 0 ) + info->reward_item_optional_count.push_back( entry1 ); + + uint8_t entry2 = getField< uint8_t >( row, i + 1484 ); + if( entry2 > 0 ) + info->reward_item_optional_stain.push_back( entry2 ); + } + + info->reward_emote = getField< uint8_t >( row, 1489 ); + info->reward_action = getField< uint16_t >( row, 1490 ); + info->reward_action_general1 = getField< uint8_t >( row, 1491 ); + info->reward_action_general2 = getField< uint8_t >( row, 1492 ); + info->reward_other = getField< uint8_t >( row, 1494 ); + + info->instanced_content_unlock = getField< uint32_t >( row, 1497 ); + + info->reward_tome_type = getField< uint8_t >( row, 1499 ); + info->reward_tome_count = getField< uint8_t >( row, 1500 ); + + info->reward_reputation = getField< uint8_t >( row, 1501 ); + + for( uint32_t i = 0; i < 50; i++ ) + { + std::string entry = getField< std::string >( row, i + 47 ); + if( entry.size() > 0 ) + { + info->script_entity.push_back( entry ); + uint32_t entry1 = getField< uint32_t >( row, i + 97 ); + info->script_value.push_back( entry1 ); + } + } + + return info; + } + catch( ... ) + { + return nullptr; + } + + return nullptr; + +} + +boost::shared_ptr< Core::Data::EventItemInfo > + Core::Data::ExdData::getEventItemInfo( uint32_t eventItemId ) +{ + + try + { + auto row = m_eventItemDat.get_row( eventItemId ); + auto info = boost::make_shared< EventItemInfo >(); + info->id = eventItemId; + info->name = getField< std::string >( row, 0 ); + info->eventId = getField< uint32_t >( row, 14 ); + info->castTime = getField< uint8_t >( row, 15 ) * 1000; + return info; + } + catch( ... ) + { + return nullptr; + } + + return nullptr; + +} + +boost::shared_ptr< Core::Data::LevelInfo > + Core::Data::ExdData::getLevelInfo( uint32_t levelId ) +{ + try + { + auto row = m_levelDat.get_row( levelId ); + auto info = boost::make_shared< LevelInfo >(); + info->id = levelId; + info->x = getField< float >( row, 0 ); + info->y = getField< float >( row, 1 ); + info->z = getField< float >( row, 2 ); + info->r = getField< float >( row, 3 ); + info->actor_id = getField< uint32_t >( row, 6 ); + info->zone_id = getField< uint16_t >( row, 9 ); + return info; + } + catch( ... ) + { + return nullptr; + } + + return nullptr; +} + +const std::vector > Core::Data::ExdData::getAetheryteInfoForZone( uint16_t zoneId ) +{ + std::vector< boost::shared_ptr< AetheryteInfo > > aetheryteList; + + for( auto& aetheryteInfo : m_aetheryteInfoMap ) + { + if( aetheryteInfo.second->target_zone == zoneId ) + { + aetheryteList.push_back( aetheryteInfo.second ); + } + } + return aetheryteList; +} + + +boost::shared_ptr< Core::Data::OpeningInfo > + Core::Data::ExdData::getOpeningInfo( uint32_t openingId ) +{ + try + { + auto row = m_openingDat.get_row( openingId ); + auto info = boost::make_shared< OpeningInfo >(); + info->id = openingId; + info->name = getField< std::string >( row, 0 ); + + return info; + } + catch( ... ) + { + return nullptr; + } + + return nullptr; +} + +boost::shared_ptr< Core::Data::RaceInfo > + Core::Data::ExdData::getRaceInfo( uint32_t raceId ) +{ + try + { + + auto row = m_raceDat.get_row( raceId ); + auto info = boost::make_shared< RaceInfo >(); + info->id = raceId; + info->name = getField< std::string >( row, 0 ); + info->male_body = getField< int32_t >( row, 2 ); + info->male_hands = getField< int32_t >( row, 3 ); + info->male_legs = getField< int32_t >( row, 4 ); + info->male_feet = getField< int32_t >( row, 5 ); + info->female_body = getField< int32_t >( row, 6 ); + info->female_hands = getField< int32_t >( row, 7 ); + info->female_legs = getField< int32_t >( row, 8 ); + info->female_feet = getField< int32_t >( row, 9 ); + + return info; + } + catch( ... ) + { + return nullptr; + } + + return nullptr; +} diff --git a/src/servers/Server_Common/ExdData.h b/src/servers/Server_Common/ExdData.h new file mode 100644 index 00000000..781b62e7 --- /dev/null +++ b/src/servers/Server_Common/ExdData.h @@ -0,0 +1,329 @@ +#ifndef _EXDDATA_H +#define _EXDDATA_H + +#include +#include +#include +#include +#include + +/* TYPES !! +case DataType::boolean: 1 +case DataType::int8: 2 +case DataType::uint8: 3 +case DataType::int16: 4 +case DataType::uint16: 5 +case DataType::int32: 6 +case DataType::uint32: 7 +case DataType::float32: 8 +case DataType::uint64: 9 +*/ + + +namespace Core { + + namespace Data { + + struct ZoneInfo + { + uint16_t id; + std::string zone_str; + std::string zone_name; + uint32_t layout_id; + uint16_t map_id; + int16_t discovery_index; + bool is_two_byte; + uint8_t weather_rate; + std::map< uint8_t, int32_t> weather_rate_map; + + int32_t aetheryte_index; + }; + + struct ClassJobInfo + { + uint8_t id; + std::string name; + std::string name_short; + uint8_t exp_idx; + uint32_t start_weapon_id; + uint16_t mod_hp; + uint16_t mod_mpcpgp; + uint16_t mod_str; + uint16_t mod_vit; + uint16_t mod_dex; + uint16_t mod_int; + uint16_t mod_mnd; + uint16_t mod_pie; + }; + + struct QuestInfo + { + uint32_t id; + std::string name; + std::string name_intern; + uint16_t quest_level; + uint32_t enpc_resident_start; + uint32_t enpc_resident_end; + uint16_t reward_exp_factor; + uint32_t reward_gil; + uint16_t reward_gc_seals; + uint8_t reward_item_type; + + std::vector< uint32_t > reward_item; + std::vector< uint8_t > reward_item_count; + std::vector< uint8_t > reward_item_stain; + + std::vector< uint32_t > reward_item_optional; + std::vector< uint8_t > reward_item_optional_count; + std::vector< uint8_t > reward_item_optional_stain; + + uint8_t reward_emote; + uint16_t reward_action; + uint8_t reward_action_general1; + uint8_t reward_action_general2; + + uint8_t reward_other; + + uint32_t instanced_content_unlock; + + uint8_t reward_tome_type; + uint8_t reward_tome_count; + + uint8_t reward_reputation; + + + + std::vector< std::string > script_entity; + std::vector< uint32_t > script_value; + }; + + struct EventActionInfo + { + uint32_t id; + std::string name; + uint32_t castTime; + }; + + struct OpeningInfo + { + uint32_t id; + std::string name; + }; + + struct ParamGrowthInfo + { + uint32_t level; + uint32_t needed_exp; + int16_t hp_mod; + int32_t mp_const; + int16_t piety_scalar; + int32_t base_secondary; + uint16_t quest_exp_mod; + }; + + struct CustomTalkInfo + { + uint32_t id; + std::string name_intern; + }; + + struct PlaceNameInfo + { + uint32_t id; + std::string placename; + }; + + struct AetheryteInfo + { + uint32_t id; + std::string placename; + std::string placename_aethernet; + int32_t target_zone; + int32_t levelId; + bool isAetheryte; + + int16_t map_coord_x; + int16_t map_coord_y; + }; + + struct RaceInfo + { + uint32_t id; + std::string name; + uint32_t male_body; + uint32_t male_hands; + uint32_t male_legs; + uint32_t male_feet; + uint32_t female_body; + uint32_t female_hands; + uint32_t female_legs; + uint32_t female_feet; + + int8_t mod_str; + int8_t mod_dex; + int8_t mod_vit; + int8_t mod_int; + int8_t mod_mnd; + int8_t mod_pie; + }; + + struct TribeInfo + { + uint32_t id; + std::string name; + + int8_t mod_str; + int8_t mod_dex; + int8_t mod_vit; + int8_t mod_int; + int8_t mod_mnd; + int8_t mod_pie; + }; + + struct LevelInfo + { + uint32_t id; + float x; + float y; + float z; + float r; + uint32_t actor_id; + uint32_t zone_id; + }; + + struct ClassJobCategoryInfo + { + uint32_t id; + // should they add new jobs, this needs to be changed + bool can_equip[0x33]; + }; + + struct ItemInfo + { + uint32_t id; + std::string name; //0 + uint16_t item_level;//11 + uint8_t required_level;//12 + uint32_t stack_size;//19 + uint16_t unknown_category;//15 + uint16_t ui_category;//17 + bool is_hqable;//20 + uint64_t model_primary;//28 + uint64_t model_secondary;//29 + uint32_t class_job_requirement;//58 + uint16_t delayMs; //59 + bool is_unique;//72 + bool is_untradeable;//73 + uint32_t class_job_index;//86 + }; + + struct ActionInfo + { + uint32_t id; + std::string name; //0 + uint16_t category;//3 + + int8_t class_job;//9 + uint8_t unlock_level;//10 + int8_t range;//11 + bool can_target_self;//12 + bool can_target_party;//13 + bool can_target_friendly;//14 + bool can_target_enemy;//15 + + bool is_aoe;//18 + + bool can_target_ko;//22 + + uint8_t aoe_type;//24 + uint8_t radius;//25 + + uint8_t points_type;//28 + uint16_t points_cost;//29 + + bool is_instant;//33 + uint32_t cast_time;//34 + uint32_t recast_time;//35 + }; + + struct EventItemInfo + { + uint32_t id; + std::string name; //0 + uint32_t eventId; + uint32_t castTime; + }; + + struct StatusEffectInfo + { + uint32_t id; + std::string name; //0 + }; + + class ExdData + { + public: + ExdData(); + ~ExdData(void); + + bool init( const std::string& path ); + + xiv::exd::Exd setupDatAccess( const std::string& name, xiv::exd::Language lang ); + + template< class T > + T getField( std::vector< xiv::exd::Field >& fields, uint32_t index ) + { + return *boost::get< T >( &fields.at( index ) ); + } + + boost::shared_ptr m_data; + boost::shared_ptr m_exd_data; + + xiv::exd::Exd m_questDat; + xiv::exd::Exd m_openingDat; + xiv::exd::Exd m_customTalkDat; + xiv::exd::Exd m_aetheryteDat; + xiv::exd::Exd m_levelDat; + xiv::exd::Exd m_placeNameDat; + xiv::exd::Exd m_itemsDat; + xiv::exd::Exd m_classJobCatDat; + xiv::exd::Exd m_raceDat; + xiv::exd::Exd m_eventItemDat; + + std::map m_zoneInfoMap; + std::map m_classJobInfoMap; + std::map m_paramGrowthInfoMap; + std::map m_EventActionInfoMap; + std::map m_actionInfoMap; + std::map m_statusEffectInfoMap; + std::map > m_aetheryteInfoMap; + std::map m_tribeInfoMap; + + bool loadZoneInfo(); + bool loadClassJobInfo(); + bool loadParamGrowInfo(); + bool loadEventActionInfo(); + bool loadActionInfo(); + bool loadStatusEffectInfo(); + bool loadAetheryteInfo(); + bool loadTribeInfo(); + + boost::shared_ptr< QuestInfo > getQuestInfo( uint32_t questId ); + boost::shared_ptr< OpeningInfo > getOpeningInfo( uint32_t openingId ); + boost::shared_ptr< CustomTalkInfo > getCustomTalkInfo( uint32_t customTalkId ); + boost::shared_ptr< AetheryteInfo > getAetheryteInfo( uint32_t aetheryteId ); + boost::shared_ptr< PlaceNameInfo > getPlaceNameInfo( uint32_t placeNameId ); + boost::shared_ptr< ItemInfo > getItemInfo( uint32_t catalogId ); + boost::shared_ptr< RaceInfo > getRaceInfo( uint32_t raceId ); + boost::shared_ptr< EventItemInfo > getEventItemInfo( uint32_t eventItemId ); + boost::shared_ptr< LevelInfo > getLevelInfo( uint32_t levelId ); + + const std::vector< boost::shared_ptr< AetheryteInfo > > getAetheryteInfoForZone( uint16_t zoneId ); + + }; + + } +} + +#endif + diff --git a/src/servers/Server_Common/Forwards.h b/src/servers/Server_Common/Forwards.h new file mode 100644 index 00000000..515bfe0e --- /dev/null +++ b/src/servers/Server_Common/Forwards.h @@ -0,0 +1,38 @@ +#ifndef _COMMON_FORWARDS_H +#define _COMMON_FORWARDS_H + +#include + +namespace Core +{ + + class XMLConfig; + + typedef boost::shared_ptr XMLConfigPtr; + + + namespace Network + { + class Hive; + class Acceptor; + class Connection; + + typedef boost::shared_ptr HivePtr; + typedef boost::shared_ptr AcceptorPtr; + typedef boost::shared_ptr ConnectionPtr; + + namespace Packets + { + class GamePacket; + + typedef boost::shared_ptr GamePacketPtr; + } + + } + + + +} + + +#endif \ No newline at end of file diff --git a/src/servers/Server_Common/GamePacket.cpp b/src/servers/Server_Common/GamePacket.cpp new file mode 100644 index 00000000..a7084c72 --- /dev/null +++ b/src/servers/Server_Common/GamePacket.cpp @@ -0,0 +1,111 @@ + +#include +#include "GamePacket.h" + +#include +#include +#include + +Core::Network::Packets::GamePacket::GamePacket( uint16_t subType, uint16_t size, uint32_t id1, uint32_t id2, uint16_t type ) +{ + m_dataBuf = std::vector( size ); + memset( &m_segHdr, 0, sizeof( m_segHdr ) ); + + setHeader( size, type, id1, id2, subType, 0x00 ); + +} + +void Core::Network::Packets::GamePacket::setHeader( uint16_t size, uint16_t type, uint32_t id1, uint32_t id2, uint16_t subType, uint32_t unknown ) +{ + + m_segHdr.size = size; + m_segHdr.type = type; + m_segHdr.source_actor = id1; + m_segHdr.target_actor = id2; + m_segHdr._reserved_E = 0x00; + m_subType = subType; + + m_timeStamp = static_cast< uint32_t >( time( nullptr ) ); + if( size > 0 ) + { + memcpy( &m_dataBuf[0], &m_segHdr, sizeof( m_segHdr ) ); + m_dataBuf[0x10] = 0x14; + *reinterpret_cast< uint16_t* >( &m_dataBuf[0] + 0x12 ) = m_subType; + } + if( size > 0x18 ) + *reinterpret_cast< uint32_t* >( &m_dataBuf[0] + 0x18 ) = m_timeStamp; +} + +Core::Network::Packets::GamePacket::GamePacket( char * pData, uint16_t size, bool bWriteStamp ) +{ + + m_dataBuf = std::vector( size ); + memcpy( &m_dataBuf[0], pData, size ); + m_unknown2 = 0; + + if( bWriteStamp && size > 0x18 ) + { + m_timeStamp = static_cast< uint32_t >( time( nullptr ) ); + *reinterpret_cast< uint32_t* >( &m_dataBuf[0] + 0x18 ) = m_timeStamp; + } + + m_segHdr._reserved_E = 0; + m_segHdr.size = *reinterpret_cast< uint32_t* >( &m_dataBuf[0] ); + m_segHdr.type = *reinterpret_cast< uint16_t* >( &m_dataBuf[0] + 0x0C ); + m_subType = *reinterpret_cast< uint16_t* >( &m_dataBuf[0] + 0x12 ); + + m_segHdr.source_actor = *reinterpret_cast< uint32_t* >( &m_dataBuf[0] + 0x04 ); + m_segHdr.target_actor = *reinterpret_cast< uint32_t* >( &m_dataBuf[0] + 0x08 ); + +} + +Core::Network::Packets::GamePacket::GamePacket( const Packets::FFXIVARR_PACKET_RAW& packetData ) +{ + + m_segHdr = packetData.segHdr; + m_dataBuf = std::vector( m_segHdr.size ); + + memcpy( &m_dataBuf[0] + sizeof( Packets::FFXIVARR_PACKET_SEGMENT_HEADER ), &packetData.data[0], m_segHdr.size - sizeof( Packets::FFXIVARR_PACKET_SEGMENT_HEADER ) ); + memcpy( &m_dataBuf[0], &m_segHdr, sizeof( Packets::FFXIVARR_PACKET_SEGMENT_HEADER ) ); + + m_subType = *reinterpret_cast< uint16_t* >( &m_dataBuf[0] + 0x12 ); + + if( m_segHdr.size > 0x18 ) + m_timeStamp = *reinterpret_cast< uint32_t* >( &m_dataBuf[0] + 0x18 ); +} + +Core::Network::Packets::GamePacket::GamePacket() +{ +} + + +Core::Network::Packets::GamePacket::~GamePacket() +{ +} + +void Core::Network::Packets::GamePacket::savePacket() +{ + char filename[20]; + sprintf( filename, "dump_0x%x.dat", m_subType ); + FILE * fp = nullptr; + fp = fopen( filename, "wb" ); + fwrite( &m_dataBuf[0], 1, m_segHdr.size, fp ); + fclose( fp ); +} + + +std::string Core::Network::Packets::GamePacket::toString() +{ + + std::string str = "\n"; + for( unsigned int i = 0; i < getSize(); i++ ) + { + str += boost::str( boost::format( "%|02X|" ) % ( int ) ( m_dataBuf[i] & 0xFF ) ) + " "; + + if( ( i + 1 ) % 16 == 0 ) + str += "\n"; + } + str += "\n"; + + return str; +} diff --git a/src/servers/Server_Common/GamePacket.h b/src/servers/Server_Common/GamePacket.h new file mode 100644 index 00000000..bee8675a --- /dev/null +++ b/src/servers/Server_Common/GamePacket.h @@ -0,0 +1,92 @@ +#ifndef _GAMEPACKET_H_ +#define _GAMEPACKET_H_ + +#include "CommonNetwork.h" +#include "Forwards.h" +#include +#include + +namespace Core { +namespace Network { +namespace Packets { + +class GamePacket { +public: + GamePacket( uint16_t subType, uint16_t size, uint32_t id1, uint32_t id2, uint16_t type = 0x03 ); + GamePacket( char * pData, uint16_t size, bool bWriteStamp = true ); + + GamePacket( const Packets::FFXIVARR_PACKET_RAW& packetData ); + + GamePacket( void ); + ~GamePacket( void ); + + uint16_t getSize() + { + return m_segHdr.size; + } + + uint16_t getType() + { + return m_segHdr.type; + } + + uint16_t getSubType() + { + return m_subType; + } + + template + void setValAt( uint16_t pos, T value ) + { + memcpy( reinterpret_cast< unsigned char* >( &m_dataBuf[0] + pos ), &value, sizeof( T ) ); + } + + template + T getValAt( uint16_t pos ) + { + return *reinterpret_cast< T* >( &m_dataBuf[0] + pos ); + } + + void setBytesAt( uint16_t offset, unsigned char * bytes, uint16_t length ) + { + memcpy( reinterpret_cast< unsigned char* >( &m_dataBuf[0] + offset ), bytes, length ); + } + + char * getStringAt( uint16_t pos ) + { + return reinterpret_cast< char* >( &m_dataBuf[0] + pos ); + } + + void setStringAt( uint16_t pos, const std::string& str ) + { + memcpy( reinterpret_cast< unsigned char* >( &m_dataBuf[0] + pos ), str.c_str(), str.length() ); + } + + unsigned char * getData() + { + return reinterpret_cast< unsigned char* >( &m_dataBuf[0] ); + } + + void setHeader( uint16_t size, uint16_t type, uint32_t id1, uint32_t id2, uint16_t subType, uint32_t unknown = 0xFED2E000 ); + + std::string toString(); + + void savePacket(); + + FFXIVARR_PACKET_SEGMENT_HEADER m_segHdr; + +protected: + + uint16_t m_unknown2; + uint16_t m_subType; + uint32_t m_timeStamp; + std::vector m_dataBuf; + +}; + + + +} +} +} +#endif diff --git a/src/servers/Server_Common/GamePacketNew.h b/src/servers/Server_Common/GamePacketNew.h new file mode 100644 index 00000000..7fd9a8d9 --- /dev/null +++ b/src/servers/Server_Common/GamePacketNew.h @@ -0,0 +1,234 @@ +#ifndef _GAMEPACKETNEW_H +#define _GAMEPACKETNEW_H + +#include +#include + +#include "GamePacket.h" + +#include +#include + +namespace Core { +namespace Network { +namespace Packets { + +// Must forward define these in order to enable the compiler to produce the +// correct template functions. + +template +class GamePacketNew; + +template +std::ostream& operator<< ( std::ostream& os, const GamePacketNew& packet ); + +/** +* The base implementation of a game packet. Needed for parsing packets. +*/ +class GamePacketNewBase +{ +public: + virtual ~GamePacketNewBase() = default; + /** + * @brief Gets the IPC type of this packet. (Useful for determining the + * type of a parsed packet.) + */ + virtual ServerIpcType ipcType( void ) = 0; +}; + +/** +* A game packet, or IPC packet, object is a template class for constructing +* the data to be sent or parsed. The template works by accepting a structure +* type that represents just the IPC data portion (the bytes after the initial +* 32 byte header information.) +*/ +template +class GamePacketNew : public GamePacketNewBase +{ +public: + /** + * @brief Constructs a new game packet with the specified actors. + * @param sourceActorId The source actor id. + * @param targetActorId The target actor id. + */ + GamePacketNew( uint32_t sourceActorId, uint32_t targetActorId ) + { + initialize(); + m_segHdr.source_actor = sourceActorId; + m_segHdr.target_actor = targetActorId; + }; + + /** + * @brief Constructs a new game packet with the specified actors. + * @param sourceActorId The source and target actor id. + */ + GamePacketNew( uint32_t bothActorId ) + { + initialize(); + m_segHdr.source_actor = bothActorId; + m_segHdr.target_actor = bothActorId; + }; + +protected: + /** Initializes the fields of the header structures */ + virtual void initialize( void ) + { + // Zero out the structures. + memset( &m_segHdr, 0, sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ) ); + memset( &m_ipcHdr, 0, sizeof( FFXIVARR_IPC_HEADER ) ); + memset( &m_data, 0, sizeof( T ) ); + + // Set the values of static fields. + // The size must be the sum of the segment header, the ipc header, and + // the IPC data itself. + m_segHdr.size = sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ) + sizeof( FFXIVARR_IPC_HEADER ) + sizeof( T ); + // Game packets (IPC) are type 3. + m_segHdr.type = 3; + // The IPC type itself. + m_ipcHdr.type = static_cast< ServerIpcType >( m_data._ServerIpcType ); + }; + +public: + virtual ServerIpcType ipcType( void ) + { + return static_cast< ServerIpcType >( m_data._ServerIpcType ); + }; + + /** Gets a reference to the underlying IPC data structure. */ + T& data( void ) { return m_data; }; + + /** + * @brief Sets the source actor id for this IPC packet. + * @param actorId The source actor id. + * @return This IPC packet object (can be used for chaining). + */ + GamePacketNew sourceActor( uint32_t actorId ) + { + m_segHdr.source_actor = actorId; + return this; + }; + + /** + * @brief Gets the source actor id for this IPC packet. + * @return The source actor id. + */ + uint32_t sourceActor( void ) const + { + return m_segHdr.source_actor; + }; + + /** + * @brief Sets the target actor id for this IPC packet. + * @param actorId The target actor id. + * @return This IPC packet object (can be used for chaining). + */ + GamePacketNew targetActor( uint32_t actorId ) + { + m_segHdr.target_actor = actorId; + return this; + }; + + /** + * @brief Gets the target actor id for this IPC packet. + * @return The target actor id. + */ + uint32_t targetActor( void ) const + { + return m_segHdr.target_actor; + }; + + friend std::ostream& operator<< <> ( std::ostream& os, const GamePacketNew& packet ); + + friend class GamePacketFactory; + + /** + * @brief Adapts the new-style packet into the old style. + */ + operator GamePacket* ( ) const + { + std::ostringstream buf; + serialize( buf ); + // NOTE: This should be ok because CGamePacket's constructor will + // copy the contents of the buffer. + GamePacket* pOldStyle = new GamePacket( const_cast< char* >( buf.str().c_str() ), m_segHdr.size, false ); + return pOldStyle; + }; + + operator GamePacketPtr () const + { + std::ostringstream buf; + serialize( buf ); + // NOTE: This should be ok because CGamePacket's constructor will + // copy the contents of the buffer. + GamePacketPtr pOldStyle( new GamePacket( const_cast< char* >( buf.str().c_str() ), m_segHdr.size, true ) ); + return pOldStyle; + }; + +protected: + // TODO: Is this a waste of storage memory? + /** The segment header */ + FFXIVARR_PACKET_SEGMENT_HEADER m_segHdr; + /** The IPC packet header */ + FFXIVARR_IPC_HEADER m_ipcHdr; + /** The underlying data portion of the packet as a structure */ + T m_data; + +private: + std::ostream& serialize( std::ostream& os ) const + { + // Since the packet itself is constant, we need to make a copy of the IPC + // header in order to set the timestamp. + FFXIVARR_IPC_HEADER ipcHdr; + memcpy( &ipcHdr, &m_ipcHdr, sizeof( ipcHdr ) ); + + // TODO: Fixed timestamp? Can we use a manipulator on the stream to assign + // a fixed timestamp value. This might be useful if several packets must + // be sent having the exact same timestamp. (Maybe this doesn't really + // need to happen though...) + ipcHdr.timestamp = static_cast< uint32_t >( time( nullptr ) ); + + // TODO: What about encryption? compression? + // Ideally, these could come directly from the stream using manipulators. + // We could check the stream's flags, and perform the appropriate + // operations here. The snag is encryption, which does not occur for + // segment headers, but may occur for IPC headers, and their data. + // Compression occurs for the entire segment header down. + os << m_segHdr << ipcHdr; + return os.write( reinterpret_cast< const char* >( &m_data ), sizeof( T ) ); + }; +}; + +template +std::ostream& operator<<( std::ostream& os, const GamePacketNew& packet ) +{ +#if 0 + // Since the packet itself is constant, we need to make a copy of the IPC + // header in order to set the timestamp. + FFXIVARR_IPC_HEADER ipcHdr; + memcpy( &ipcHdr, &packet.m_ipcHdr, sizeof( ipcHdr ) ); + + // TODO: Fixed timestamp? Can we use a manipulator on the stream to assign + // a fixed timestamp value. This might be useful if several packets must + // be sent having the exact same timestamp. (Maybe this doesn't really + // need to happen though...) + ipcHdr.timestamp = time( NULL ); + + // TODO: What about encryption? compression? + // Ideally, these could come directly from the stream using manipulators. + // We could check the stream's flags, and perform the appropriate + // operations here. The snag is encryption, which does not occur for + // segment headers, but may occur for IPC headers, and their data. + // Compression occurs for the entire segment header down. + os << packet.m_segHdr << ipcHdr; + return os.write( + reinterpret_cast< const char* >( &packet.m_data ), sizeof( T ) ); +#else + return packet.serialize( os ); +#endif +} + +} /* Packets */ +} /* Network */ +} /* Core */ + +#endif /*_CORE_NETWORK_PACKETS_CGAMEPACKETNEW_H*/ \ No newline at end of file diff --git a/src/servers/Server_Common/Hive.cpp b/src/servers/Server_Common/Hive.cpp new file mode 100644 index 00000000..41cf0e25 --- /dev/null +++ b/src/servers/Server_Common/Hive.cpp @@ -0,0 +1,61 @@ +#include +#include +#include +#include "Hive.h" + +namespace Core { + namespace Network { + + //----------------------------------------------------------------------------- + + Hive::Hive() + : m_work_ptr( new boost::asio::io_service::work( m_io_service ) ), + m_shutdown( 0 ) + { + } + + Hive::~Hive() + { + } + + boost::asio::io_service & Hive::GetService() + { + return m_io_service; + } + + bool Hive::HasStopped() + { + return ( boost::interprocess::ipcdetail::atomic_cas32( &m_shutdown, 1, 1 ) == 1 ); + } + + void Hive::Poll() + { + m_io_service.poll(); + } + + void Hive::Run() + { + m_io_service.run(); + } + + void Hive::Stop() + { + if( boost::interprocess::ipcdetail::atomic_cas32( &m_shutdown, 1, 0 ) == 0 ) + { + m_work_ptr.reset(); + m_io_service.run(); + m_io_service.stop(); + } + } + + void Hive::Reset() + { + if( boost::interprocess::ipcdetail::atomic_cas32( &m_shutdown, 0, 1 ) == 1 ) + { + m_io_service.reset(); + m_work_ptr.reset( new boost::asio::io_service::work( m_io_service ) ); + } + } + + } +} \ No newline at end of file diff --git a/src/servers/Server_Common/Hive.h b/src/servers/Server_Common/Hive.h new file mode 100644 index 00000000..0448cfc8 --- /dev/null +++ b/src/servers/Server_Common/Hive.h @@ -0,0 +1,54 @@ +#ifndef HIVE_H_ +#define HIVE_H_ + +#include + +#include + +namespace Core { + namespace Network { + + class Hive : public boost::enable_shared_from_this< Hive > + { + private: + boost::asio::io_service m_io_service; + boost::shared_ptr< boost::asio::io_service::work > m_work_ptr; + volatile uint32_t m_shutdown; + + private: + Hive( const Hive & rhs ); + Hive & operator =( const Hive & rhs ); + + public: + Hive(); + virtual ~Hive(); + + // Returns the io_service of this object. + boost::asio::io_service & GetService(); + + // Returns true if the Stop function has been called. + bool HasStopped(); + + // Polls the networking subsystem once from the current thread and + // returns. + void Poll(); + + // Runs the networking system on the current thread. This function blocks + // until the networking system is stopped, so do not call on a single + // threaded application with no other means of being able to call Stop + // unless you code in such logic. + void Run(); + + // Stops the networking system. All work is finished and no more + // networking interactions will be possible afterwards until Reset is called. + void Stop(); + + // Restarts the networking system after Stop as been called. A new work + // object is created ad the shutdown flag is cleared. + void Reset(); + }; + + } +} +//----------------------------------------------------------------------------- +#endif \ No newline at end of file diff --git a/src/servers/Server_Common/LockedQueue.h b/src/servers/Server_Common/LockedQueue.h new file mode 100644 index 00000000..02cd24f9 --- /dev/null +++ b/src/servers/Server_Common/LockedQueue.h @@ -0,0 +1,124 @@ +#pragma once +#include +#include +#include +#include +#include + +namespace Core { + + template + class LockedQueue + { + public: + LockedQueue(); + ~LockedQueue(); + + T pop(); + + //we can pass this in by reference, instead of copying + void push(const T object); + + //we can pass this in by reference + //this will push it onto the queue, and swap the object + // with a default-constructed T at the same time. + void push_swap(T& object); + void push_reset(T& object); + + + std::size_t size(); + + + protected: + std::queue m_queue; + std::mutex m_mutex; + + }; + + template + LockedQueue::LockedQueue() + { + + } + + template + std::size_t LockedQueue::size() + { + std::lock_guard lock( m_mutex); + return m_queue.size(); + } + + + template + LockedQueue::~LockedQueue() + { + + + } + + + template + T LockedQueue::pop() + { + std::lock_guard lock( m_mutex); + + if( m_queue.empty()) + { + return T(); + } + + T result = m_queue.front(); + + m_queue.pop(); + + return result; + } + + template + void LockedQueue::push(const T object) + { + std::lock_guard lock( m_mutex); + m_queue.push(object); + } + + template + void LockedQueue::push_swap(T& object) + { + std::lock_guard lock( m_mutex); + + m_queue.push(object); + + T default_ctored_object = T(); + //this is a special swap that will do a legit naive swap normally, + // except if there exists a function called T::swap(), which is + // specialized and possibly faster. + boost::swap(object, default_ctored_object); + + + + //default_ctored_object is now the value of object, and it will go out + // of scope here. In the case that T is a shared_ptr of some kind, + // this will allow that the object on the queue is the *last* shared_ptr + // in existance by the time this function returns. + + } + + template + void LockedQueue::push_reset(T& object) + { + std::lock_guard lock( m_mutex); + + m_queue.push(object); + + T default_ctored_object = T(); + + object.reset(); + + //default_ctored_object is now the value of object, and it will go out + // of scope here. In the case that T is a shared_ptr of some kind, + // this will allow that the object on the queue is the *last* shared_ptr + // in existance by the time this function returns. + + } + +} \ No newline at end of file diff --git a/src/servers/Server_Common/Logger.cpp b/src/servers/Server_Common/Logger.cpp new file mode 100644 index 00000000..6beb7a6e --- /dev/null +++ b/src/servers/Server_Common/Logger.cpp @@ -0,0 +1,88 @@ +#include "Logger.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Core { + + + Logger::Logger() + { + + } + + Logger::~Logger() + { + + } + + void Logger::setLogPath(const std::string& logPath) + { + m_logFile = logPath; + } + + void Logger::init() + { + + auto format = ( + boost::log::expressions::stream << + boost::log::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "[%H:%M:%S]") << + "[" << boost::log::trivial::severity << "] " << + boost::log::expressions::smessage + ); + + boost::log::add_file_log + ( + boost::log::keywords::file_name = m_logFile + "%Y-%m-%d.log", /*< file name pattern >*/ + boost::log::keywords::rotation_size = 10 * 1024 * 1024, /*< rotate files every 10 MiB... >*/ + boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), /*< ...or at midnight >*/ + boost::log::keywords::open_mode = std::ios::app, + boost::log::keywords::format = format, + boost::log::keywords::auto_flush = true + ); + + boost::log::add_console_log(std::cout, boost::log::keywords::format = format); + + boost::log::add_common_attributes(); + } + + + void Logger::Log(LoggingSeverity logSev, const std::string& text) + { + BOOST_LOG_SEV(m_lg, (boost::log::trivial::severity_level)logSev) << text; + } + + void Logger::error( const std::string& text ) + { + BOOST_LOG_SEV( m_lg, boost::log::trivial::severity_level::error ) << text; + } + + void Logger::info( const std::string& text ) + { + BOOST_LOG_SEV( m_lg, boost::log::trivial::severity_level::info ) << text; + } + + void Logger::debug( const std::string& text ) + { + BOOST_LOG_SEV( m_lg, boost::log::trivial::severity_level::debug ) << text; + } + + void Logger::fatal( const std::string& text ) + { + BOOST_LOG_SEV( m_lg, boost::log::trivial::severity_level::fatal ) << text; + } + + + +} \ No newline at end of file diff --git a/src/servers/Server_Common/Logger.h b/src/servers/Server_Common/Logger.h new file mode 100644 index 00000000..731ba5d0 --- /dev/null +++ b/src/servers/Server_Common/Logger.h @@ -0,0 +1,51 @@ +#ifndef _LOGGER_H +#define _LOGGER_H + +#include + +namespace Core { + + + enum struct LoggingSeverity : uint8_t + { + trace = 0, + debug = 1, + info = 2, + warning = 3, + error = 4, + fatal = 5 + }; + + class Logger + { + + private: + boost::log::sources::severity_logger_mt< boost::log::trivial::severity_level > m_lg; + + std::string m_logFile; + + public: + Logger(); + + ~Logger(); + + void init(); + + void Log(LoggingSeverity logSev, const std::string& text); + + void error( const std::string& text ); + void info( const std::string& text ); + void debug( const std::string& text ); + void fatal( const std::string& text ); + + void setLogPath(const std::string& logPath); + + }; + + + +} + + + +#endif \ No newline at end of file diff --git a/src/servers/Server_Common/PacketContainer.cpp b/src/servers/Server_Common/PacketContainer.cpp new file mode 100644 index 00000000..956f548d --- /dev/null +++ b/src/servers/Server_Common/PacketContainer.cpp @@ -0,0 +1,79 @@ +#include "PacketContainer.h" +#include "GamePacket.h" +#include "Common.h" + +#include + +#include + + +Core::Network::Packets::PacketContainer::PacketContainer( void ) +{ + memset( &m_ipcHdr, 0, sizeof( FFXIVARR_PACKET_HEADER ) ); + m_ipcHdr.size = sizeof( FFXIVARR_PACKET_HEADER ); + m_ipcHdr.count = 0; +} + +Core::Network::Packets::PacketContainer::~PacketContainer( void ) +{ + m_entryList.clear(); +} + +void Core::Network::Packets::PacketContainer::addPacket( GamePacket pEntry ) +{ + m_entryList.push_back( pEntry ); + + m_ipcHdr.size += pEntry.getSize(); + m_ipcHdr.count++; +} + +void Core::Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8_t >& sendBuffer ) +{ + uint8_t* tempBuffer = new uint8_t[m_ipcHdr.size]; + memset( tempBuffer, 0, m_ipcHdr.size ); + + using namespace std::chrono; + auto ms = duration_cast< milliseconds >( system_clock::now().time_since_epoch() ); + uint64_t tick = ms.count(); + m_ipcHdr.timestamp = tick; + m_ipcHdr.unknown_20 = 1; + + memcpy( tempBuffer, &m_ipcHdr, sizeof( FFXIVARR_PACKET_HEADER ) ); + + auto it = m_entryList.begin(); + uint16_t offset = 0; + + if( m_entryList.size() > 1 ) + offset = 0; + + for( ; it != m_entryList.end(); ++it ) + { + memcpy( tempBuffer + sizeof( FFXIVARR_PACKET_HEADER ) + offset, it->getData(), it->m_segHdr.size ); + offset += it->m_segHdr.size; + } + + sendBuffer.assign( tempBuffer, tempBuffer + m_ipcHdr.size ); + + delete[] tempBuffer; + +} + +std::string Core::Network::Packets::PacketContainer::toString() +{ + std::vector< uint8_t > tmpBuffer; + + fillSendBuffer( tmpBuffer ); + + std::string str = "\n"; + for( unsigned int i = 0; i < m_ipcHdr.size; i++ ) + { + str += boost::str( boost::format( "%|02X|" ) % static_cast< int >( tmpBuffer[i] & 0xFF ) ) + " "; + + if( ( i + 1 ) % 16 == 0 ) + str += "\n"; + } + str += "\n"; + + return str; +} + diff --git a/src/servers/Server_Common/PacketContainer.h b/src/servers/Server_Common/PacketContainer.h new file mode 100644 index 00000000..a00e0b88 --- /dev/null +++ b/src/servers/Server_Common/PacketContainer.h @@ -0,0 +1,38 @@ +#ifndef _PacketContainer_H_ +#define _PacketContainer_H_ + +#include + +#include "Common.h" +#include "CommonNetwork.h" +#include "GamePacket.h" + +namespace Core { +namespace Network { +namespace Packets { + +class GamePacket; + +class PacketContainer +{ +public: + PacketContainer( void ); + ~PacketContainer( void ); + + void addPacket( GamePacket pEntry ); + + FFXIVARR_PACKET_HEADER m_ipcHdr; + + std::vector m_entryList; + + std::string toString(); + + void fillSendBuffer( std::vector< uint8_t >& sendBuffer ); + +}; + +} +} +} + +#endif diff --git a/src/servers/Server_Common/ServerPacketDef.h b/src/servers/Server_Common/ServerPacketDef.h new file mode 100644 index 00000000..b2984aca --- /dev/null +++ b/src/servers/Server_Common/ServerPacketDef.h @@ -0,0 +1,1365 @@ +/** +* IPC Packet Definitions (Server IPC Packets) +* Structural definitions for the various server IPC packet types. +* IMPORTANT NOTE: Do not use these for parsing IPC packets sent by the +* client. See the Client namespace for those types! +*/ +#ifndef _CORE_NETWORK_PACKETS_SERVER_IPC_H +#define _CORE_NETWORK_PACKETS_SERVER_IPC_H + +#include "Common.h" +#include "CommonNetwork.h" + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +template struct FFXIVIpcBasePacket +{ + /** Creates a constant representing the IPC type */ + enum { _ServerIpcType = T }; +}; + +struct FFXIVIpcRetainerList : FFXIVIpcBasePacket +{ + uint8_t padding[0x210]; +}; + +/** +*/ +struct FFXIVIpcServiceIdInfo : FFXIVIpcBasePacket +{ + uint64_t seq; + uint8_t padding; + uint8_t numServiceAccounts; + uint8_t u1; + uint8_t u2; + uint32_t padding1; + + struct + { + uint32_t id; + uint32_t unknown; + uint32_t index; + char name[0x44]; + } serviceAccount[8]; +}; + + +struct FFXIVIpcServerList : FFXIVIpcBasePacket +{ + uint64_t seq; + uint16_t final; + uint16_t offset; + uint32_t numServers; + uint32_t padding; + uint32_t padding1; + + struct + { + uint16_t id; + uint16_t index; + uint32_t flags; // 0x02 = World not accepting new characters + uint32_t padding1; + uint32_t icon; // 2 = bonus XP star + uint32_t padding2; + char name[0x40]; + } server[6]; +}; + +struct FFXIVIpcCharList : FFXIVIpcBasePacket +{ + uint64_t seq; + uint8_t counter; // current packet count * 4, count * 4 +1 on last packet. + uint8_t numInPacket; // always 2?? + uint16_t padding; + uint8_t unknown1; + uint8_t unknown2; + uint8_t unknown3; + uint8_t unknown4; // 0x80 in case of last packet + uint32_t unknown5[7]; + uint8_t unknown6; // 0x80 in case of last packet + uint8_t veteranRank; + uint8_t unknown7; + uint8_t padding1; + uint32_t daysSubscribed; + uint32_t remainingDays; + uint32_t daysToNextRank; + uint16_t maxCharOnWorld; + uint16_t unknown8; + uint32_t entitledExpansion; + uint32_t padding2; + + struct CharaDetails + { + uint32_t uniqueId; + uint32_t padding; + uint64_t contentId; + uint32_t index; + uint32_t padding2; + uint16_t serverId; + char nameChara[32]; + char nameServer[32]; + char charDetailJson[1030]; + } charaDetails[2]; + +}; + +struct FFXIVIpcEnterWorld : FFXIVIpcBasePacket +{ + uint64_t seq; + uint32_t charId; + uint32_t padding; + uint64_t contentId; + uint32_t padding2; + char sid[66]; + uint16_t port; + char host[48]; + uint64_t padding3; + uint64_t padding4; +}; + +struct FFXIVIpcCharCreate : FFXIVIpcBasePacket +{ + uint64_t seq; + uint8_t unknown; + uint8_t unknown_2; + uint8_t type; + uint8_t padding; + uint32_t unknown_3; + uint32_t unknown_4; + uint32_t unknown_5; + uint64_t content_id; + uint16_t unknown_7; + uint16_t unknown_8; + uint32_t unknown_9; + uint16_t unknown_10; + char name[32]; + char world[32]; +}; + +struct FFXIVIpcLobbyError : FFXIVIpcBasePacket +{ + uint64_t seq; + uint32_t error_id; + uint32_t param; + uint16_t message_id; + char message[516]; +}; + +/** +* Structural representation of the packet sent by the server as response +* to a ping packet +*/ +struct FFXIVIpcPing : FFXIVIpcBasePacket +{ + /* 0000 */ uint64_t timeInMilliseconds; + /* 0008 */ uint8_t unknown_8[0x38]; +}; + +/** +* Structural representation of the packet sent by the server as response +* to a ping packet +*/ +struct FFXIVIpcInit : FFXIVIpcBasePacket +{ + uint64_t unknown; + uint32_t charId; + uint32_t unknown1; +}; + +/** +* Structural representation of the packet sent by the server +* carrying chat messages +*/ +struct FFXIVIpcChat : FFXIVIpcBasePacket +{ + /* 0000 */ Common::ChatType chatType; + uint8_t padding[16]; //Maybe this is SubCode, or some kind of talker ID... + char name[32]; + char msg[1012]; +}; + +/** +* Structural representation of the packet sent by the server +* carrying chat messages +*/ +struct FFXIVIpcLogout : FFXIVIpcBasePacket +{ + uint32_t flags1; + uint32_t flags2; +}; + +/** +* Structural representation of the packet sent by the server +* sent to show the play time +*/ +struct FFXIVIpcPlayTime : FFXIVIpcBasePacket +{ + uint32_t playTimeInMinutes; + uint32_t padding; +}; + + +/** +* Structural representation of the packet sent by the server +* with a list of players ( party list | friend list | search results ) +*/ +struct PlayerEntry { + uint64_t contentId; + char bytes[12]; + uint16_t zoneId; + uint16_t zoneId1; + char bytes1[8]; + uint64_t onlineStatusMask; + uint8_t classJob; + uint8_t padding; + uint8_t level; + uint8_t padding1; + uint16_t padding2; + uint8_t one; + char name[0x20]; + char fcTag[9]; +}; + +struct FFXIVIpcSocialList : FFXIVIpcBasePacket +{ + uint32_t padding; + uint32_t padding1; + uint32_t padding2; + uint8_t type; + uint8_t sequence; + uint16_t padding3; + + PlayerEntry entries[10]; +}; + + +struct FFXIVIpcSetSearchInfo : FFXIVIpcBasePacket +{ + uint64_t onlineStatusFlags; + uint64_t unknown; + uint32_t unknown1; + uint8_t padding; + uint8_t selectRegion; + char searchMessage[193]; + uint8_t padding2; +}; + +struct FFXIVIpcInitSearchInfo : FFXIVIpcBasePacket +{ + uint64_t onlineStatusFlags; + uint64_t unknown; + uint8_t unknown1; + uint8_t selectRegion; + char searchMessage[193]; + char padding[5]; +}; + +/** +* Structural representation of the packet sent by the server +* to display a server notice message +*/ +struct FFXIVIpcServerNotice : FFXIVIpcBasePacket +{ + /* 0000 */ uint8_t padding; + char message[307]; +}; + +struct FFXIVIpcSetOnlineStatus : FFXIVIpcBasePacket +{ + uint64_t onlineStatusFlags; +}; + +struct FFXIVIpcBlackList : FFXIVIpcBasePacket +{ + struct BlEntry + { + uint64_t contentId; + char name[32]; + } entry[20]; + uint8_t padding; + uint8_t padding1; + uint16_t sequence; + uint32_t padding2; +}; + +struct FFXIVIpcLinkshellList : FFXIVIpcBasePacket +{ + struct LsEntry + { + uint64_t lsId; + uint64_t unknownId; + uint8_t unknown; + uint8_t rank; + uint16_t padding; + uint8_t lsName[20]; + } entry[8]; +}; + +struct FFXIVIpcStatusEffectList : FFXIVIpcBasePacket +{ + uint8_t classId; + uint8_t classId1; + uint16_t level; + uint32_t current_hp; + uint32_t max_hp; + uint16_t current_mp; + uint16_t max_mp; + uint16_t currentTp; + uint16_t unknown1; + Common::StatusEffect effect[30]; + uint32_t padding; +}; + +struct FFXIVGCAffiliation : FFXIVIpcBasePacket +{ + uint8_t gcId; + uint8_t gcRank[3]; +}; + +/** +* Structural representation of the packet sent by the server +* add a status effect +*/ +struct FFXIVIpcAddStatusEffect : FFXIVIpcBasePacket +{ + uint32_t unknown; + uint32_t actor_id; + uint8_t unknown1; + uint8_t unknown2; + uint16_t padding1; + uint32_t current_hp; + uint16_t current_mp; + uint16_t current_tp; + uint32_t max_hp; + uint16_t max_mp; + uint16_t max_something; + uint8_t effect_index; // which position do i display this + uint8_t unknown3; + uint16_t effect_id; + uint32_t power; + float duration; + uint32_t actor_id1; + uint8_t unknown4[52]; +}; + +/** +* Structural representation of the packet sent by the server +* to update certain player details / status +*/ +struct FFXIVIpcActorControl142 : FFXIVIpcBasePacket +{ + /* 0000 */ uint16_t category; + /* 0002 */ uint16_t padding; + /* 0004 */ uint32_t param1; + /* 0008 */ uint32_t param2; + /* 000C */ uint32_t param3; + /* 0010 */ uint32_t param4; + /* 0014 */ uint32_t padding1; +}; + +/** +* Structural representation of the packet sent by the server +* to update certain player details / status +*/ +struct FFXIVIpcActorControl143 : FFXIVIpcBasePacket +{ + /* 0000 */ uint16_t category; + /* 0002 */ uint16_t padding; + /* 0004 */ uint32_t param1; + /* 0008 */ uint32_t param2; + /* 000C */ uint32_t param3; + /* 0010 */ uint32_t param4; + /* 0014 */ uint32_t param5; + /* 0018 */ uint32_t param6; + /* 0018 */ uint32_t padding1; +}; + +/** +* Structural representation of the packet sent by the server +* to update certain player details / status +*/ +struct FFXIVIpcActorControl144 : FFXIVIpcBasePacket +{ + /* 0000 */ uint16_t category; + /* 0002 */ uint16_t padding; + /* 0004 */ uint32_t param1; + /* 0008 */ uint32_t param2; + /* 000C */ uint32_t param3; + /* 0010 */ uint32_t param4; + /* 0014 */ uint32_t padding1; + /* 0018 */ uint64_t targetId; +}; + +/** +* Structural representation of the packet sent by the server +* to update HP / MP / TP +*/ +struct FFXIVIpcUpdateHpMpTp : FFXIVIpcBasePacket +{ + /* 0000 */ uint32_t hp; + /* 0004 */ uint16_t mp; + /* 0006 */ uint16_t tp; + /* 0008 */ uint32_t unknown_8; + /* 000C */ uint32_t unknown_12; +}; + + +/** +* Structural representation of the packet sent by the server +* to update HP / MP / TP +*/ +struct effectEntry +{ + uint8_t unknown_1; + uint8_t unknown_2; + uint8_t unknown_3; + int8_t bonusPercent; + int16_t param1; + uint8_t unknown_5; + uint8_t unknown_6; +}; + +struct FFXIVIpcEffect : FFXIVIpcBasePacket +{ + uint32_t targetId; + uint32_t unknown_1; + uint32_t actionAnimationId; + uint32_t unknown_2; + uint32_t unknown_5; + uint32_t unknown_6; + uint32_t effectTargetId; + uint16_t rotation; + uint16_t actionTextId; + uint8_t unknown_61; + uint8_t unknown_62; + uint8_t unknown_10; + uint8_t numEffects; + uint32_t u11; + effectEntry effects[8]; + uint32_t effectTarget; + uint64_t unknown_8; +}; + + +/** +* Structural representation of the packet sent by the server +* to spawn an actor +*/ +struct FFXIVIpcPlayerSpawn : FFXIVIpcBasePacket +{ + uint16_t title; + uint16_t u1b; + uint8_t gmRank; + uint8_t u2ab; + uint8_t u2b; + uint8_t onlineStatus; + + uint8_t pose; + uint8_t u3b; + uint8_t u3c; + uint8_t u3d; + + uint32_t u4; + + uint64_t targetId; + uint32_t u6; + uint32_t u7; + uint64_t mainWeaponModel; + uint64_t secWeaponModel; + uint64_t craftToolModel; + + uint32_t u14; + uint32_t u15; + uint32_t bNPCBase; + uint32_t bNPCName; + uint32_t u18; + uint32_t u19; + uint32_t u20; + uint32_t ownerId; + uint32_t u22; + uint32_t hPCurr; + uint32_t hPMax; + uint32_t displayFlags; + uint16_t fateID; + uint16_t mPCurr; + uint16_t tPCurr; + uint16_t mPMax; + uint16_t tPMax; + uint16_t modelChara; + uint16_t rotation; + uint16_t activeMinion; + uint8_t spawnIndex; + uint8_t state; + uint8_t persistantEmote; + uint8_t type; + uint8_t subtype; + uint8_t voice; + uint16_t u25c; + uint8_t enemyType; + uint8_t level; + uint8_t classJob; + uint8_t u26d; + uint16_t u27a; + uint8_t currentMount; + uint8_t mountHead; + uint8_t mountBody; + uint8_t mountFeet; + uint8_t mountColor; + uint8_t scale; + uint32_t u29b; + Common::StatusEffect effect[30]; + Common::FFXIVARR_POSITION3 pos; + uint32_t models[10]; + char name[32]; + uint8_t look[26]; + char fcTag[6]; + uint32_t unk30; +}; + +/** +* Structural representation of the packet sent by the server +* to spawn an actor +*/ +struct FFXIVIpcNpcSpawn : FFXIVIpcBasePacket +{ + uint16_t title; + uint16_t u1b; + uint16_t u2a; + uint16_t u2b; + + uint8_t pose; + uint8_t u3b; + uint8_t u3c; + uint8_t u3d; + + uint32_t u4; + + uint64_t targetId; + uint32_t u6; + uint32_t u7; + + uint64_t mainWeaponModel; + uint64_t secWeaponModel; + uint64_t craftToolModel; + + uint32_t u14; + uint32_t u15; + uint32_t bNPCBase; + uint32_t bNPCName; + uint32_t u18; + uint32_t u19; + uint32_t u20; + uint32_t u21; + uint32_t u22; + + uint32_t hPCurr; + uint32_t hPMax; + uint32_t displayFlags; + uint16_t fateID; + uint16_t mPCurr; + uint16_t tPCurr; + uint16_t mPMax; + + uint16_t unk21a; + uint16_t modelChara; + uint16_t rotation; + uint16_t unk22b; + uint8_t spawnIndex; + uint8_t state; // ActorState + uint8_t u24a; + uint8_t type; // 1 for player, 2 for NPC, else furniture; + uint8_t subtype; // 4 for players, 2 for pet, 3 for companion, 5 for mob, 7 for minion + uint8_t u25b; + uint16_t u25c; + + uint8_t enemyType; // 0 for friendly, anything else is an enemy + uint8_t level; + uint8_t classJob; + uint8_t u26d; + + uint16_t u27a; + + uint8_t currentMount; + uint8_t mountHead; + uint8_t mountBody; + uint8_t mountFeet; + uint16_t mountColor; + + uint32_t u29b; + Common::StatusEffect effect[30]; + Common::FFXIVARR_POSITION3 pos; + uint32_t models[10]; + char name[32]; + uint8_t look[26]; + char fcTag[6]; + uint32_t unk30; +}; + +struct FFXIVIpcActorSpawn : FFXIVIpcBasePacket +{ + uint32_t unknown_0; + uint32_t nameId; + uint32_t bnpcBaseId; + uint32_t unknown_C[2]; + uint32_t ownerId; + uint32_t unknown_E[2]; + uint64_t targetId; + uint32_t fateId; + uint8_t gmRank; + uint8_t spawnIndex; + uint8_t status; /** 1 = alive, 2 = dead, 3 = use pose*/ + uint8_t pose; /** sitting, dancing, etc */ + uint8_t mobAgressive; /** 0 passive, 2 agressive */ + uint8_t mobTypeIcon; /** normal, nm, etc */ + uint8_t type; /** 0 = nothing, 1 = player, 2 = npc*/ + uint8_t unknown_33; + uint32_t unknown_34; + uint8_t voice; + uint8_t scale; + uint8_t v1; + uint8_t v2; + uint32_t unknown_38_1; + int32_t unknown_89; + int32_t unknown_90; + uint64_t mainWeaponModel; + uint64_t secWeaponModel; + uint64_t craftToolModel; + uint16_t rotation; + uint16_t model; /** 0 if look array is being used */ + uint16_t title; + uint8_t typeFlags; /** has something to do with type 4 for mobs */ + uint8_t minion; + uint8_t unknown_60; /** for players 01 */ + uint8_t unknown_61; /** for players 09 */ + uint8_t level; + uint8_t classJob; + uint32_t hPCurr; + uint16_t mPCurr; + uint16_t tPCurr; + uint32_t hPMax; + uint16_t mPMax; + uint16_t tPMax; + Common::OnlineStatus statusIcon; + uint8_t unknown_B0[17]; + uint8_t persistantPose; + uint8_t unknown_C0; + uint32_t displayFlags; + Common::StatusEffect effect[30]; + uint8_t currentMount; + uint8_t mountHead; + uint8_t mountBody; + uint8_t mountFeet; + uint32_t mountColor; + uint32_t unknown_236; + char name[32]; + uint8_t look[28]; + uint32_t models[10]; + Common::FFXIVARR_POSITION3 pos; + char fcTag[6]; + uint8_t unknown_250[10]; +}; + + +/** +* Structural representation of the packet sent by the server +* to show player movement +*/ +struct FFXIVIpcActorFreeSpawn : FFXIVIpcBasePacket +{ + uint32_t spawnId; + uint32_t actorId; +}; + +/** +* Structural representation of the packet sent by the server +* to show player movement +*/ +struct FFXIVIpcActorMove : FFXIVIpcBasePacket +{ + /* 0000 */ uint8_t rotation; + /* 0001 */ uint8_t unknown_1; + /* 0002 */ uint8_t unknown_2; + /* 0003 */ uint8_t unknown_3; + /* 0004 */ uint16_t unknown_4; + /* 0006 */ uint16_t posX; + /* 0008 */ uint16_t posY; + /* 000a */ uint16_t posZ; + /* 000C */ uint32_t unknown_12; +}; + +/** +* Structural representation of the packet sent by the server +* to set an actors position +*/ +struct FFXIVIpcActorSetPos : FFXIVIpcBasePacket +{ + uint16_t r16; + uint8_t waitForLoad; + uint8_t unknown1; + uint32_t unknown2; + float x; + float y; + float z; + uint32_t unknown3; + +}; + + + +/** +* Structural representation of the packet sent by the server +* to start an actors casting +*/ +struct FFXIVIpcActorCast : FFXIVIpcBasePacket +{ + uint16_t action_id; + uint16_t unknown; + uint32_t unknown_1; // Also action id + float cast_time; + uint32_t target_id; + float rotation; // In radians + uint32_t unknown_2; + uint16_t posX; + uint16_t posY; + uint16_t posZ; + uint16_t unknown_3; +}; + +struct FFXIVIpcHateList : FFXIVIpcBasePacket +{ + uint32_t numEntries; + struct LsEntry + { + uint32_t actorId; + uint8_t hatePercent; + uint8_t unknown; + uint16_t padding; + } entry[32]; + uint32_t padding; +}; + +struct FFXIVIpcUpdateClassInfo : FFXIVIpcBasePacket +{ + uint8_t classId; + uint8_t classId1; + uint16_t level; + uint32_t nextLevelIndex; + uint32_t currentExp; + uint32_t restedExp; +}; + + +/** +* Structural representation of the packet sent by the server +* to initialize a zone for the player +*/ +struct FFXIVIpcInitZone : FFXIVIpcBasePacket +{ + uint16_t serverId; + uint16_t zoneId; + uint16_t unknown1; + uint16_t unknown2; + uint32_t unknown3; + uint32_t unknown4; + uint8_t weatherId; + uint8_t bitmask; + uint16_t unknown5; + uint16_t unknown6; + uint16_t unknown7; + uint32_t unknown8; + Common::FFXIVARR_POSITION3 pos; +}; + + +/** +* Structural representation of the packet sent by the server to initialize +* the client UI upon initial connection. +*/ +struct FFXIVIpcInitUI : FFXIVIpcBasePacket +{ + uint64_t contentId; + uint32_t unknown_8; + uint32_t unknown_9; + uint32_t charId; + uint32_t restedExp; + uint16_t unknown_12; + uint16_t unknown_13; + uint8_t race; + uint8_t tribe; + uint8_t gender; + uint8_t currentJob; + uint8_t currentClass; + uint8_t deity; + uint8_t namedayMonth; + uint8_t namedayDay; + Common::GrandCompany grandCompany; + uint8_t homepoint; + uint8_t unknown_19; + uint8_t petHotBar; + uint8_t companionRank; + uint8_t companionStars; + uint8_t companionSp; + uint8_t companionUnk1; + uint8_t companionColor; + uint8_t companionFavoFeed; + uint8_t companionUnk2[2]; + float companionTimePassed; + uint32_t companionCurrentExp; + uint32_t unknown_1b; + uint32_t fishCaught; + uint32_t useBaitCatalogId; + uint32_t unknown_1c; + uint16_t pvpWolfFoldMatches; + uint16_t pvpWolfFoldVictories; + uint16_t pvpWolfFoldWeeklyMatches; + uint16_t pvpWolfFoldWeeklyVictories; + uint16_t playerCommendations; + uint8_t pvpStats[14]; + uint32_t frontlineCampaigns; + uint16_t frontlineCampaignsWeekly; + uint8_t unknown_112; + uint8_t masterCrafterMask; + uint8_t unknown_001; + uint8_t unknown_002; + uint8_t unknown_003; + uint8_t unknown_004; + uint16_t unknown_005; + uint8_t unknown_114; + uint8_t padding_114; + uint8_t unknown_1141[52]; + uint8_t preNamePadding; + char name[32]; + uint8_t unknown_54[16]; + uint8_t unknown55; + uint16_t levels[25]; + uint32_t exp[25]; + uint8_t unlockBitmask[64]; + uint8_t aetheryte[16]; + uint8_t discovery[420]; + uint8_t howto[33]; + uint8_t minions[33]; + uint8_t chocoboTaxiMask[8]; + uint8_t contentClearMask[104]; + uint8_t companionBardingMask[8]; + uint8_t companionEquippedHead; + uint8_t companionEquippedBody; + uint8_t companionEquippedFeet; + uint8_t companion_fields[15]; + uint8_t companion_name[21]; + uint8_t companionDefRank; + uint8_t companionAttRank; + uint8_t companionHealRank; + uint8_t mountGuideMask[13]; + uint8_t fishingGuideMask[77]; + uint8_t fishingSpotVisited[25]; + uint8_t unknown_41; + uint16_t fishingRecordsFish[26]; + uint16_t fishingRecordsFishWeight[26]; + uint8_t unknown_590[62]; + uint8_t rankAmalJaa; + uint8_t rankSylph; + uint8_t rankKobold; + uint8_t rankSahagin; + uint8_t rankIxal; + uint8_t rankVanu; + uint8_t rankVath; + uint8_t rankMoogle; + uint16_t expAmalJaa; + uint16_t expSylph; + uint16_t expKobold; + uint16_t expSahagin; + uint16_t expIxal; + uint16_t expVanu; + uint16_t expVath; + uint16_t expMoogle; + uint8_t unknown_0341[20]; + uint8_t unknownMask0[5]; + uint8_t unknown_0342[15]; + uint8_t unknownMask1[28]; + uint32_t unknownDword0; + uint8_t unknown_0343[12]; + uint8_t sightseeingMask[19]; + uint8_t unknown_421; + uint32_t pvpFrontlineOverall1st; + uint32_t pvpFrontlineOverall2nd; + uint32_t pvpFrontlineOverall3rd; + uint16_t pvpFrontlineWeekly1st; + uint16_t pvpFrontlineWeekly2nd; + uint16_t pvpFrontlineWeekly3rd; + uint8_t unknownRest[32]; + uint8_t tripleTriadCards[26]; + uint8_t unknownRest1[21]; + uint8_t orchestrionMask[19]; + uint8_t hallOfNoviceCompleteMask[3]; + uint8_t unknownMask2[11]; + uint8_t unknownMask3[16]; + uint8_t unknown_500[9]; +}; + +/** +* Structural representation of the packet sent by the server +* to set a players stats +*/ +struct FFXIVIpcPlayerStats : FFXIVIpcBasePacket +{ + uint32_t strength; + uint32_t dexterity; + uint32_t vitality; + uint32_t intelligence; + uint32_t mind; + uint32_t piety; + uint32_t hp; + uint32_t mp; + uint32_t tp; + uint32_t unknown; + uint32_t unknown_1; + uint32_t unknown_2; + uint32_t parry; + uint32_t attack; + uint32_t defense; + uint32_t accuracy; + uint32_t spellSpeed; + uint32_t magicDefense; + uint32_t criticalHitRate; + uint32_t resistanceSlashing; + uint32_t resistancePiercing; + uint32_t resistanceBlunt; + uint32_t attackMagicPotency; + uint32_t healingMagicPotency; + uint32_t fire; + uint32_t ice; + uint32_t wind; + uint32_t earth; + uint32_t lightning; + uint32_t water; + uint32_t determination; + uint32_t skillSpeed; + uint32_t spellSpeed1; + uint32_t spellSpeedMod; + uint32_t unknown_6[5]; + uint32_t resistanceSlow; + uint32_t resistanceSilence; + uint32_t resistanceBlind; + uint32_t resistancePoison; + uint32_t resistanceStun; + uint32_t resistanceSleep; + uint32_t resistanceBind; + uint32_t resistanceHeavy; + uint32_t unknown_7[9]; +}; + +/** +* Structural representation of the packet sent by the server +* to set an actors current owner +*/ +struct FFXIVIpcActorOwner : FFXIVIpcBasePacket +{ + uint8_t type; + uint8_t padding[7]; + uint32_t actorId; + uint32_t actorId2; +}; + +/** +* Structural representation of the packet sent by the server +* to set a players state +*/ +struct FFXIVIpcPlayerStateFlags : FFXIVIpcBasePacket +{ + /* 0000 */ uint16_t padding; + /* 0002 */ uint8_t flags[7]; + /* 0009 */ uint8_t padding1[3]; + /* 000C */ uint32_t padding2; + +}; + +/** +* Structural representation of the packet sent by the server +* containing current class information +*/ +struct FFXIVIpcPlayerClassInfo : FFXIVIpcBasePacket +{ + uint16_t classId; + uint16_t unknown; + uint16_t level; + uint16_t level1; + uint8_t unknownFields[48]; +}; + +/** +* Structural representation of the packet sent by the server +* to update a players appearance +*/ +struct FFXIVIpcModelEquip : FFXIVIpcBasePacket +{ + /* 0000 */ uint64_t mainWeapon; + /* 0008 */ uint64_t offWeapon; + /* 0010 */ uint32_t padding1; + /* 0014 */ uint32_t models[10]; + /* 003C */ uint32_t padding2; +}; + +/** +* Structural representation of the packet sent by the server +* to update a players appearance +*/ +struct FFXIVIpcItemInfo : FFXIVIpcBasePacket +{ + uint32_t sequence; + uint32_t unknown; + uint16_t containerId; + uint16_t slot; + uint32_t quantity; + uint32_t catalogId; + uint32_t reservedFlag; + uint64_t signatureId; + uint8_t hqFlag; + uint8_t unknown2; + uint16_t condition; + uint16_t spiritBond; + uint16_t color; + uint32_t glamourCatalogId; + uint16_t materia1; + uint16_t materia2; + uint16_t materia3; + uint16_t materia4; + uint16_t materia5; + uint8_t buffer1; + uint8_t buffer2; + uint8_t buffer3; + uint8_t buffer4; + uint8_t buffer5; + uint8_t padding; + uint32_t unknown10; +}; + +/** +* Structural representation of the packet sent by the server +* to update a players appearance +*/ +struct FFXIVIpcContainerInfo : FFXIVIpcBasePacket +{ + uint32_t sequence; + uint32_t numItems; + uint32_t containerId; + uint32_t unknown; +}; + +/** +* Structural representation of the packet sent by the server +* to update a players appearance +*/ +struct FFXIVIpcCurrencyCrystalInfo : FFXIVIpcBasePacket +{ + uint32_t sequence; + uint16_t containerId; + uint16_t slot; + uint32_t quantity; + uint32_t unknown; + uint32_t catalogId; + uint32_t unknown1; + uint32_t unknown2; + uint32_t unknown3; +}; + +struct FFXIVIpcInventoryTransactionFinish : FFXIVIpcBasePacket +{ + uint32_t transactionId; + uint32_t transactionId1; + uint64_t padding; +}; + +struct FFXIVIpcInventoryTransaction : FFXIVIpcBasePacket +{ + uint32_t transactionId; + uint8_t type; + uint8_t padding; + uint16_t padding1; + uint32_t ownerId; + uint32_t storageId; + uint16_t slotId; + uint16_t padding2; + uint32_t stackSize; + uint32_t catalogId; + uint32_t someActorId; + int32_t targetStorageId; + uint32_t padding3[3]; +}; + + +struct FFXIVIpcInventoryActionAck : FFXIVIpcBasePacket +{ + uint32_t sequence; + uint16_t type; + uint16_t padding; + uint32_t padding1; + uint32_t padding2; +}; + + +/** +* Structural representation of the packet sent by the server +* to update a slot in the inventory +*/ +struct FFXIVIpcUpdateInventorySlot : FFXIVIpcBasePacket +{ + uint32_t sequence; + uint32_t unknown; + uint16_t containerId; + uint16_t slot; + uint32_t quantity; + uint32_t catalogId; + uint32_t reservedFlag; + uint64_t signatureId; + uint16_t hqFlag; + uint16_t condition; + uint16_t spiritBond; + uint16_t color; + uint32_t glamourCatalogId; + uint16_t materia1; + uint16_t materia2; + uint16_t materia3; + uint16_t materia4; + uint16_t materia5; + uint8_t buffer1; + uint8_t buffer2; + uint8_t buffer3; + uint8_t buffer4; + uint8_t buffer5; + uint8_t padding; + uint32_t unknown10; +}; + +/** +* Structural representation of the packet sent by the server +* to start an event, not actually playing it, but registering +*/ +struct FFXIVIpcEventStart : FFXIVIpcBasePacket +{ + /* 0000 */ uint64_t actorId; + /* 0008 */ uint32_t eventId; + /* 000C */ uint8_t param1; + /* 000D */ uint8_t param2; + /* 000E */ uint16_t padding; + /* 0010 */ uint32_t param3; + /* 0014 */ uint32_t padding1; +}; + + +/** +* Structural representation of the packet sent by the server +* to play an event +*/ +struct FFXIVIpcEventPlay : FFXIVIpcBasePacket +{ + uint64_t actorId; + uint32_t eventId; + uint16_t scene; + uint16_t padding; + uint32_t flags; + uint32_t param3; + uint8_t param4; + uint8_t padding1[3]; + uint32_t param5; + uint8_t unknown[8]; +}; + +/** +* Structural representation of the packet sent by the server +* to finish an event +*/ +struct FFXIVIpcEventFinish : FFXIVIpcBasePacket +{ + /* 0000 */ uint32_t eventId; + /* 0004 */ uint8_t param1; + /* 0005 */ uint8_t param2; + /* 0006 */ uint16_t padding; + /* 0008 */ uint32_t param3; + /* 000C */ uint32_t padding1; +}; + +/** +* Structural representation of the packet sent by the server +* to send the active quests +*/ +struct FFXIVIpcQuestActiveList : FFXIVIpcBasePacket +{ + Common::QuestActive activeQuests[30]; +}; + +/** +* Structural representation of the packet sent by the server +* to send update a quest slot +*/ +struct FFXIVIpcQuestUpdate : FFXIVIpcBasePacket +{ + /* 0000 */ uint8_t slot; + /* 0001 */ uint8_t padding[3]; + Common::QuestActive questInfo; +}; + +/** +* Structural representation of the packet sent by the server +* to send the completed quests mask +*/ +struct FFXIVIpcQuestCompleteList : FFXIVIpcBasePacket +{ + /* 0000 */ uint8_t questCompleteMask[200]; +}; + +/** +* Structural representation of the packet sent by the server +* to finish a quest +*/ +struct FFXIVIpcQuestFinish : FFXIVIpcBasePacket +{ + uint16_t questId; + uint8_t flag1; + uint8_t flag2; + uint32_t padding; +}; + +/** +* Structural representation of the packet sent by the server +* to send a quest message +* type 0 default +* type 1 icon +* type 5 status +*/ +struct FFXIVIpcQuestMessage : FFXIVIpcBasePacket +{ + /* 0000 */ uint32_t questId; + /* 0000 */ uint8_t msgId; + /* 0000 */ uint8_t type; + /* 0000 */ uint16_t padding1; + /* 0000 */ uint32_t var1; + /* 0000 */ uint32_t var2; +}; + +struct FFXIVIpcQuestTracker : FFXIVIpcBasePacket +{ + struct TrackerEntry + { + uint8_t active; + uint8_t questIndex; + } entry[5]; + uint16_t padding[3]; +}; + + +struct FFXIVIpcWeatherChange : FFXIVIpcBasePacket +{ + uint32_t weatherId; + float delay; +}; + +/** +* Structural representation of the packet sent by the server +* to send a unviel a map +*/ +struct FFXIVIpcDiscovery : FFXIVIpcBasePacket +{ + /* 0000 */ uint32_t map_part_id; + /* 0004 */ uint32_t map_id; +}; + + +/** +* UNKOWN TYPE +*/ +struct FFXIVARR_IPC_UNK322 : FFXIVIpcBasePacket +{ + /* 0000 */ uint8_t unk[8]; +}; + +/** +* UNKOWN TYPE +*/ +struct FFXIVARR_IPC_UNK320 : FFXIVIpcBasePacket +{ + /* 0000 */ uint8_t unk[32]; +}; + +/** +* Structural representation of the packet sent by the server +* prepare zoning, showing screenmessage +*/ +struct FFXIVIpcPrepareZoning : FFXIVIpcBasePacket +{ + uint32_t logMessage; + uint16_t targetZone; + uint16_t param3; + uint8_t param4; + uint8_t hideChar; + uint8_t fadeOut; + uint8_t param7; + uint32_t padding; +}; + +/** +* Structural representation of the packet sent by the server +* to trigger content finder events +* +* See https://gist.github.com/Minoost/c35843c4c8a7a931f31fdaac9bce64c2 +*/ +struct FFXIVIpcCFNotify : FFXIVIpcBasePacket +{ + uint32_t state1; // 3 = cancelled, 4 = duty ready + uint32_t state2; // if state1 == 3, state2 is cancelled reason + + uint8_t classJob; // classJobId you registered + uint8_t unknown0[3]; + + uint32_t unknown1; // unknown, just used 0x20442 from the dumped packet + + uint8_t languages; + uint8_t unknown2[3]; + + uint16_t unknown3; + uint16_t contents[5]; +}; + +/** +* Structural representation of the packet sent by the server +* to update contents available in duty finder or raid finder +* +* Do note that this packet has to come early in login phase (around initui packet) +* or it won't be applied until you reconnect +*/ +struct FFXIVIpcCFAvailableContents : FFXIVIpcBasePacket +{ + uint8_t contents[0x48]; +}; + +/** +* Structural representation of the packet sent by the server +* to update adventure in needs in duty roulette +*/ +struct FFXIVIpcCFPlayerInNeed : FFXIVIpcBasePacket +{ + // Ordered by roulette id + uint8_t inNeeds[0x10]; +}; + +/** +* Structural representation of the packet sent by the server +* to update duty info in general +*/ +struct FFXIVIpcCFDutyInfo : FFXIVIpcBasePacket +{ + uint8_t penaltyTime; + uint8_t unknown[7]; +}; + + +} /* Server */ +} /* Packets */ +} /* Network */ +} /* Core */ + + + +#endif /*_CORE_NETWORK_PACKETS_SERVER_IPC_H*/ diff --git a/src/servers/Server_Common/Util.cpp b/src/servers/Server_Common/Util.cpp new file mode 100644 index 00000000..2d09f7cc --- /dev/null +++ b/src/servers/Server_Common/Util.cpp @@ -0,0 +1,42 @@ +#include "Util.h" +#include + +std::string Core::Util::binaryToHexString( uint8_t* pBinData, uint16_t size ) +{ + + std::string outStr; + + for( unsigned int i = 0; i < size; i++ ) + { + outStr += boost::str( boost::format( "%|02X|" ) % ( int ) ( pBinData[i] & 0xFF ) ); + } + + return outStr; + +} + +uint64_t Core::Util::getTimeMs() +{ + std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_clock::now(); + auto now_ms = std::chrono::time_point_cast< std::chrono::milliseconds >( t1 ).time_since_epoch().count(); + + return now_ms; +} + +uint64_t Core::Util::getEorzeanTimeStamp() +{ + std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_clock::now(); + auto now = std::chrono::time_point_cast< std::chrono::seconds >( t1 ).time_since_epoch().count(); + + return static_cast< uint64_t >( now * 20.571428571428573f ); +} + +void Core::Util::valueToFlagByteIndexValue( uint32_t inVal, uint8_t& outVal, uint16_t& outIndex ) +{ + uint32_t id = inVal; + outIndex = id / 8; + uint8_t bitIndex = id % 8; + + outVal = 1 << bitIndex; +} + diff --git a/src/servers/Server_Common/Util.h b/src/servers/Server_Common/Util.h new file mode 100644 index 00000000..4aa19c7e --- /dev/null +++ b/src/servers/Server_Common/Util.h @@ -0,0 +1,20 @@ +#ifndef _UTIL_H +#define _UTIL_H + +#include +#include + +namespace Core { +namespace Util { + +std::string binaryToHexString( uint8_t* pBinData, uint16_t size ); + +uint64_t getTimeMs(); + +uint64_t getEorzeanTimeStamp(); + +void valueToFlagByteIndexValue( uint32_t inVal, uint8_t& outVal, uint16_t& outIndex ); +} +} + +#endif diff --git a/src/servers/Server_Common/UtilMath.cpp b/src/servers/Server_Common/UtilMath.cpp new file mode 100644 index 00000000..fe534f5f --- /dev/null +++ b/src/servers/Server_Common/UtilMath.cpp @@ -0,0 +1,71 @@ +#include +#include "UtilMath.h" + +float Core::Math::Util::distanceSq( float x, float y, float z, float x1, float y1, float z1 ) +{ + float deltaX = x - x1; + float deltaY = y - y1; + float deltaZ = z - z1; + + return ( deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ ); +} + +float Core::Math::Util::distance( float x, float y, float z, float x1, float y1, float z1 ) +{ + return sqrtf( distanceSq( x, y, z, x1, y1, z1 ) ); +} + +float Core::Math::Util::distance2DSq( float x, float y, float x1, float y1 ) +{ + float deltaX = x - x1; + float deltaY = y - y1; + return ( deltaX * deltaX + deltaY * deltaY ); +} + +float Core::Math::Util::distance2D( float x, float y, float x1, float y1 ) +{ + return sqrtf( distance2DSq( x, y, x1, y1 ) ); +} + +float Core::Math::Util::calcAngTo( float x, float y, float x1, float y1 ) +{ + float dx = x - x1; + float dy = y - y1; + if( dy != 0.0f ) + { + return atan2( dy, dx ); + } + else + { + return 0.0f; + } +} + +float Core::Math::Util::calcAngFrom( float x, float y, float x1, float y1 ) +{ + float dx = x - x1; + float dy = y - y1; + if( dy != 0.0f ) + { + return atan2( dy, dx ); + } + else + { + return 0.0f; + } +} + +uint16_t Core::Math::Util::floatToUInt16( float val ) +{ + return static_cast< uint16_t >( 0x8000 + val * 32.767f ); +} + +uint16_t Core::Math::Util::floatToUInt16Rot( float val ) +{ + return static_cast< uint16_t >( 0x8000 * ( ( val + PI ) ) / PI ); +} + +uint8_t Core::Math::Util::floatToUInt8Rot( float val ) +{ + return static_cast< uint8_t >( 0x80 * ( ( val + PI ) ) / PI ); +} \ No newline at end of file diff --git a/src/servers/Server_Common/UtilMath.h b/src/servers/Server_Common/UtilMath.h new file mode 100644 index 00000000..326c54e6 --- /dev/null +++ b/src/servers/Server_Common/UtilMath.h @@ -0,0 +1,38 @@ +#ifndef _UTILMATH_H +#define _UTILMATH_H + +#include "Common.h" + +#define PI 3.14159265358979323846f + +namespace Core { +namespace Math { +namespace Util { + +float distanceSq( float x, float y, float z, float x1, float y1, float z1 ); + +float distance( float x, float y, float z, float x1, float y1, float z1 ); + +float distance2DSq( float x, float y, float x1, float y1 ); + +float distance2D( float x, float y, float x1, float y1 ); + +float calcAngTo( float x, float y, float x1, float y1 ); + +float calcAngFrom( float x, float y, float x1, float y1 ); + +uint16_t floatToUInt16( float val ); +uint16_t floatToUInt16Rot( float val ); +uint8_t floatToUInt8Rot( float val ); + +template + +T clamp( T val, T minimum, T maximum ) +{ + return std::max( std::min( val, maximum ), minimum ); +} +} +} +} + +#endif \ No newline at end of file diff --git a/src/servers/Server_Common/UtilNetwork.cpp b/src/servers/Server_Common/UtilNetwork.cpp new file mode 100644 index 00000000..84905726 --- /dev/null +++ b/src/servers/Server_Common/UtilNetwork.cpp @@ -0,0 +1,35 @@ +#include "UtilNetwork.h" +#include + +bool Core::Network::Util::bufferToPacketList( const std::vector< uint8_t > &buffer, + Packets::FFXIVARR_PACKET_HEADER &ipcHeader, + std::vector< Packets::FFXIVARR_PACKET_RAW > &packetList ) +{ + memcpy( &ipcHeader, ( uint8_t* ) &buffer[0], sizeof( struct Packets::FFXIVARR_PACKET_HEADER ) ); + + uint16_t offset = 0; + for( std::size_t x = 0; x < ipcHeader.count; x++ ) + { + Packets::FFXIVARR_PACKET_RAW packet; + + uint32_t headerSize = sizeof( struct Packets::FFXIVARR_PACKET_HEADER ); + uint32_t headerSegSize = sizeof( struct Packets::FFXIVARR_PACKET_SEGMENT_HEADER ); + memcpy( &packet.segHdr, ( uint8_t* ) &buffer[headerSize + offset], headerSegSize ); + + std::vector packetData; + + uint16_t startOff = sizeof( struct Packets::FFXIVARR_PACKET_HEADER ) + offset; + + for( std::size_t y = 0; y < packet.segHdr.size - sizeof( struct Packets::FFXIVARR_PACKET_SEGMENT_HEADER ); y++ ) + { + packet.data.push_back( buffer.at( startOff + y + sizeof( struct Packets::FFXIVARR_PACKET_SEGMENT_HEADER ) ) ); + } + + offset += packet.segHdr.size; + + packetList.push_back( packet ); + + } + + return true; +} diff --git a/src/servers/Server_Common/UtilNetwork.h b/src/servers/Server_Common/UtilNetwork.h new file mode 100644 index 00000000..8b7d7748 --- /dev/null +++ b/src/servers/Server_Common/UtilNetwork.h @@ -0,0 +1,18 @@ +#ifndef _UTILNETWORK_H +#define _UTILNETWORK_H + +#include "CommonNetwork.h" + +namespace Core { +namespace Network { +namespace Util { + + + bool bufferToPacketList( const std::vector< uint8_t > &buffer, + Packets::FFXIVARR_PACKET_HEADER &ipcHeader, + std::vector< Packets::FFXIVARR_PACKET_RAW > &packetList ); +} +} +} + +#endif \ No newline at end of file diff --git a/src/servers/Server_Common/XMLConfig.cpp b/src/servers/Server_Common/XMLConfig.cpp new file mode 100644 index 00000000..a28d8dfa --- /dev/null +++ b/src/servers/Server_Common/XMLConfig.cpp @@ -0,0 +1,35 @@ +#include "XMLConfig.h" +#include +#include +#include +#include +#include +#include + +namespace Core { + // instanciate and load a config + XMLConfig::XMLConfig() + { + + } + + XMLConfig::~XMLConfig() + { + + } + + using boost::property_tree::ptree; + const ptree& empty_ptree() + { + static ptree t; + return t; + }; + + bool XMLConfig::loadConfig( const std::string& fileName ) + { + + boost::property_tree::read_xml( fileName, m_propTree ); + return true; + } + +} diff --git a/src/servers/Server_Common/XMLConfig.h b/src/servers/Server_Common/XMLConfig.h new file mode 100644 index 00000000..cf9395b2 --- /dev/null +++ b/src/servers/Server_Common/XMLConfig.h @@ -0,0 +1,73 @@ +#ifndef __XMLCONFIG_H +#define __XMLCONFIG_H + +#include + +#include + +#include + +namespace Core { + + // very simple XML parser class + // this hasn't gotten much attention yet as it works good as it is. + class XMLConfig + { + public: + typedef std::map SettingMap; + typedef std::map CategoryMap; + + // instanciate and load a config + XMLConfig(); + + ~XMLConfig(); + + // load a config file + bool loadConfig( const std::string& fileName ); + + template< class T > + T getValue( const std::string& name, T defaultValue = T() ) + { + try + { + return m_propTree.get< T >( name ); + } + catch( ... ) + { + return defaultValue; + } + } + + template< class T > + void setValue( const std::string& name, T defaultValue = T() ) + { + m_propTree.put( name, defaultValue ); + } + + template< class T > + T getAttrValue( boost::property_tree::ptree node, const std::string& name, T defaultValue = T() ) + { + try + { + T outVal = node.get< T >( "." + name ); + return outVal; + } + catch( const std::runtime_error& ) + { + T outVal = defaultValue; + return outVal; + } + } + + boost::property_tree::ptree getChild( const std::string& name ) + { + auto val = m_propTree.get_child( name ); + return val; + } + + private: + boost::property_tree::ptree m_propTree; + }; + +} +#endif diff --git a/src/servers/Server_Common/base64.cpp b/src/servers/Server_Common/base64.cpp new file mode 100644 index 00000000..16e77159 --- /dev/null +++ b/src/servers/Server_Common/base64.cpp @@ -0,0 +1,123 @@ +/* + base64.cpp and base64.h + + Copyright (C) 2004-2008 René Nyffenegger + + This source code is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this source code must not be misrepresented; you must not + claim that you wrote the original source code. If you use this source code + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original source code. + + 3. This notice may not be removed or altered from any source distribution. + + René Nyffenegger rene.nyffenegger@adp-gmbh.ch + +*/ + +#include "base64.h" +#include + +static const std::string base64_chars = +"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +"abcdefghijklmnopqrstuvwxyz" +"0123456789+/"; + + +static inline bool is_base64( unsigned char c ) { + return ( isalnum( c ) || ( c == '+' ) || ( c == '/' ) ); +} + +std::string Core::Util::base64_encode( unsigned char const* bytes_to_encode, unsigned int in_len ) { + std::string ret; + int i = 0; + int j = 0; + unsigned char char_array_3[3]; + unsigned char char_array_4[4]; + + while( in_len-- ) { + char_array_3[i++] = *( bytes_to_encode++ ); + if( i == 3 ) { + char_array_4[0] = ( char_array_3[0] & 0xfc ) >> 2; + char_array_4[1] = ( ( char_array_3[0] & 0x03 ) << 4 ) + ( ( char_array_3[1] & 0xf0 ) >> 4 ); + char_array_4[2] = ( ( char_array_3[1] & 0x0f ) << 2 ) + ( ( char_array_3[2] & 0xc0 ) >> 6 ); + char_array_4[3] = char_array_3[2] & 0x3f; + + for( i = 0; ( i < 4 ); i++ ) + ret += base64_chars[char_array_4[i]]; + i = 0; + } + } + + if( i ) + { + for( j = i; j < 3; j++ ) + char_array_3[j] = '\0'; + + char_array_4[0] = ( char_array_3[0] & 0xfc ) >> 2; + char_array_4[1] = ( ( char_array_3[0] & 0x03 ) << 4 ) + ( ( char_array_3[1] & 0xf0 ) >> 4 ); + char_array_4[2] = ( ( char_array_3[1] & 0x0f ) << 2 ) + ( ( char_array_3[2] & 0xc0 ) >> 6 ); + char_array_4[3] = char_array_3[2] & 0x3f; + + for( j = 0; ( j < i + 1 ); j++ ) + ret += base64_chars[char_array_4[j]]; + + while( ( i++ < 3 ) ) + ret += '='; + + } + + return ret; + +} + +std::string Core::Util::base64_decode( std::string const& encoded_string ) { + int in_len = encoded_string.size(); + int i = 0; + int j = 0; + int in_ = 0; + unsigned char char_array_4[4], char_array_3[3]; + std::string ret; + + while( in_len-- && ( encoded_string[in_] != '=' ) && is_base64( encoded_string[in_] ) ) { + char_array_4[i++] = encoded_string[in_]; in_++; + if( i == 4 ) { + for( i = 0; i < 4; i++ ) + char_array_4[i] = base64_chars.find( char_array_4[i] ); + + char_array_3[0] = ( char_array_4[0] << 2 ) + ( ( char_array_4[1] & 0x30 ) >> 4 ); + char_array_3[1] = ( ( char_array_4[1] & 0xf ) << 4 ) + ( ( char_array_4[2] & 0x3c ) >> 2 ); + char_array_3[2] = ( ( char_array_4[2] & 0x3 ) << 6 ) + char_array_4[3]; + + for( i = 0; ( i < 3 ); i++ ) + ret += char_array_3[i]; + i = 0; + } + } + + if( i ) { + for( j = i; j < 4; j++ ) + char_array_4[j] = 0; + + for( j = 0; j < 4; j++ ) + char_array_4[j] = base64_chars.find( char_array_4[j] ); + + char_array_3[0] = ( char_array_4[0] << 2 ) + ( ( char_array_4[1] & 0x30 ) >> 4 ); + char_array_3[1] = ( ( char_array_4[1] & 0xf ) << 4 ) + ( ( char_array_4[2] & 0x3c ) >> 2 ); + char_array_3[2] = ( ( char_array_4[2] & 0x3 ) << 6 ) + char_array_4[3]; + + for( j = 0; ( j < i - 1 ); j++ ) ret += char_array_3[j]; + } + + return ret; +} diff --git a/src/servers/Server_Common/base64.h b/src/servers/Server_Common/base64.h new file mode 100644 index 00000000..01b53c55 --- /dev/null +++ b/src/servers/Server_Common/base64.h @@ -0,0 +1,11 @@ +#include + +namespace Core +{ + namespace Util + { + std::string base64_encode( unsigned char const*, unsigned int len ); + std::string base64_decode( std::string const& s ); + } +} + diff --git a/src/servers/Server_Common/md5.cpp b/src/servers/Server_Common/md5.cpp new file mode 100644 index 00000000..1c1eaf6b --- /dev/null +++ b/src/servers/Server_Common/md5.cpp @@ -0,0 +1,256 @@ +/* +* RFC 1321 compliant MD5 implementation +* +* Copyright (C) 2001-2003 Christophe Devine +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#include "md5.h" + +#define GET_UINT32(n,b,i) \ +{ \ + (n) = ( (uint32_t) (b)[(i) ] ) \ + | ( (uint32_t) (b)[(i) + 1] << 8 ) \ + | ( (uint32_t) (b)[(i) + 2] << 16 ) \ + | ( (uint32_t) (b)[(i) + 3] << 24 ); \ +} + +#define PUT_UINT32(n,b,i) \ +{ \ + (b)[(i) ] = (uint8_t) ( (n) ); \ + (b)[(i) + 1] = (uint8_t) ( (n) >> 8 ); \ + (b)[(i) + 2] = (uint8_t) ( (n) >> 16 ); \ + (b)[(i) + 3] = (uint8_t) ( (n) >> 24 ); \ +} + +void Core::Util::md5_starts( md5_context *ctx ) +{ + ctx->total[0] = 0; + ctx->total[1] = 0; + + ctx->state[0] = 0x67452301; + ctx->state[1] = 0xEFCDAB89; + ctx->state[2] = 0x98BADCFE; + ctx->state[3] = 0x10325476; +} + +void md5_process( Core::Util::md5_context *ctx, uint8_t data[64] ) +{ + uint32_t X[16], A, B, C, D; + + GET_UINT32( X[0], data, 0 ); + GET_UINT32( X[1], data, 4 ); + GET_UINT32( X[2], data, 8 ); + GET_UINT32( X[3], data, 12 ); + GET_UINT32( X[4], data, 16 ); + GET_UINT32( X[5], data, 20 ); + GET_UINT32( X[6], data, 24 ); + GET_UINT32( X[7], data, 28 ); + GET_UINT32( X[8], data, 32 ); + GET_UINT32( X[9], data, 36 ); + GET_UINT32( X[10], data, 40 ); + GET_UINT32( X[11], data, 44 ); + GET_UINT32( X[12], data, 48 ); + GET_UINT32( X[13], data, 52 ); + GET_UINT32( X[14], data, 56 ); + GET_UINT32( X[15], data, 60 ); + +#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) + +#define P(a,b,c,d,k,s,t) \ + { \ + a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \ + } + + A = ctx->state[0]; + B = ctx->state[1]; + C = ctx->state[2]; + D = ctx->state[3]; + +#define F(x,y,z) (z ^ (x & (y ^ z))) + + P( A, B, C, D, 0, 7, 0xD76AA478 ); + P( D, A, B, C, 1, 12, 0xE8C7B756 ); + P( C, D, A, B, 2, 17, 0x242070DB ); + P( B, C, D, A, 3, 22, 0xC1BDCEEE ); + P( A, B, C, D, 4, 7, 0xF57C0FAF ); + P( D, A, B, C, 5, 12, 0x4787C62A ); + P( C, D, A, B, 6, 17, 0xA8304613 ); + P( B, C, D, A, 7, 22, 0xFD469501 ); + P( A, B, C, D, 8, 7, 0x698098D8 ); + P( D, A, B, C, 9, 12, 0x8B44F7AF ); + P( C, D, A, B, 10, 17, 0xFFFF5BB1 ); + P( B, C, D, A, 11, 22, 0x895CD7BE ); + P( A, B, C, D, 12, 7, 0x6B901122 ); + P( D, A, B, C, 13, 12, 0xFD987193 ); + P( C, D, A, B, 14, 17, 0xA679438E ); + P( B, C, D, A, 15, 22, 0x49B40821 ); + +#undef F + +#define F(x,y,z) (y ^ (z & (x ^ y))) + + P( A, B, C, D, 1, 5, 0xF61E2562 ); + P( D, A, B, C, 6, 9, 0xC040B340 ); + P( C, D, A, B, 11, 14, 0x265E5A51 ); + P( B, C, D, A, 0, 20, 0xE9B6C7AA ); + P( A, B, C, D, 5, 5, 0xD62F105D ); + P( D, A, B, C, 10, 9, 0x02441453 ); + P( C, D, A, B, 15, 14, 0xD8A1E681 ); + P( B, C, D, A, 4, 20, 0xE7D3FBC8 ); + P( A, B, C, D, 9, 5, 0x21E1CDE6 ); + P( D, A, B, C, 14, 9, 0xC33707D6 ); + P( C, D, A, B, 3, 14, 0xF4D50D87 ); + P( B, C, D, A, 8, 20, 0x455A14ED ); + P( A, B, C, D, 13, 5, 0xA9E3E905 ); + P( D, A, B, C, 2, 9, 0xFCEFA3F8 ); + P( C, D, A, B, 7, 14, 0x676F02D9 ); + P( B, C, D, A, 12, 20, 0x8D2A4C8A ); + +#undef F + +#define F(x,y,z) (x ^ y ^ z) + + P( A, B, C, D, 5, 4, 0xFFFA3942 ); + P( D, A, B, C, 8, 11, 0x8771F681 ); + P( C, D, A, B, 11, 16, 0x6D9D6122 ); + P( B, C, D, A, 14, 23, 0xFDE5380C ); + P( A, B, C, D, 1, 4, 0xA4BEEA44 ); + P( D, A, B, C, 4, 11, 0x4BDECFA9 ); + P( C, D, A, B, 7, 16, 0xF6BB4B60 ); + P( B, C, D, A, 10, 23, 0xBEBFBC70 ); + P( A, B, C, D, 13, 4, 0x289B7EC6 ); + P( D, A, B, C, 0, 11, 0xEAA127FA ); + P( C, D, A, B, 3, 16, 0xD4EF3085 ); + P( B, C, D, A, 6, 23, 0x04881D05 ); + P( A, B, C, D, 9, 4, 0xD9D4D039 ); + P( D, A, B, C, 12, 11, 0xE6DB99E5 ); + P( C, D, A, B, 15, 16, 0x1FA27CF8 ); + P( B, C, D, A, 2, 23, 0xC4AC5665 ); + +#undef F + +#define F(x,y,z) (y ^ (x | ~z)) + + P( A, B, C, D, 0, 6, 0xF4292244 ); + P( D, A, B, C, 7, 10, 0x432AFF97 ); + P( C, D, A, B, 14, 15, 0xAB9423A7 ); + P( B, C, D, A, 5, 21, 0xFC93A039 ); + P( A, B, C, D, 12, 6, 0x655B59C3 ); + P( D, A, B, C, 3, 10, 0x8F0CCC92 ); + P( C, D, A, B, 10, 15, 0xFFEFF47D ); + P( B, C, D, A, 1, 21, 0x85845DD1 ); + P( A, B, C, D, 8, 6, 0x6FA87E4F ); + P( D, A, B, C, 15, 10, 0xFE2CE6E0 ); + P( C, D, A, B, 6, 15, 0xA3014314 ); + P( B, C, D, A, 13, 21, 0x4E0811A1 ); + P( A, B, C, D, 4, 6, 0xF7537E82 ); + P( D, A, B, C, 11, 10, 0xBD3AF235 ); + P( C, D, A, B, 2, 15, 0x2AD7D2BB ); + P( B, C, D, A, 9, 21, 0xEB86D391 ); + +#undef F + + ctx->state[0] += A; + ctx->state[1] += B; + ctx->state[2] += C; + ctx->state[3] += D; +} + +void Core::Util::md5_update( md5_context *ctx, uint8_t *input, uint32_t length ) +{ + uint32_t left, fill; + + if( !length ) return; + + left = ctx->total[0] & 0x3F; + fill = 64 - left; + + ctx->total[0] += length; + ctx->total[0] &= 0xFFFFFFFF; + + if( ctx->total[0] < length ) + ctx->total[1]++; + + if( left && length >= fill ) + { + memcpy( ( void * )( ctx->buffer + left ), + ( void * )input, fill ); + md5_process( ctx, ctx->buffer ); + length -= fill; + input += fill; + left = 0; + } + + while( length >= 64 ) + { + md5_process( ctx, input ); + length -= 64; + input += 64; + } + + if( length ) + { + memcpy( ( void * )( ctx->buffer + left ), + ( void * )input, length ); + } +} + +static uint8_t md5_padding[64] = +{ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +void Core::Util::md5_finish( md5_context *ctx, uint8_t digest[16] ) +{ + uint32_t last, padn; + uint32_t high, low; + uint8_t msglen[8]; + + high = ( ctx->total[0] >> 29 ) + | ( ctx->total[1] << 3 ); + low = ( ctx->total[0] << 3 ); + + PUT_UINT32( low, msglen, 0 ); + PUT_UINT32( high, msglen, 4 ); + + last = ctx->total[0] & 0x3F; + padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); + + md5_update( ctx, md5_padding, padn ); + md5_update( ctx, msglen, 8 ); + + PUT_UINT32( ctx->state[0], digest, 0 ); + PUT_UINT32( ctx->state[1], digest, 4 ); + PUT_UINT32( ctx->state[2], digest, 8 ); + PUT_UINT32( ctx->state[3], digest, 12 ); +} + +/* +* those are the standard RFC 1321 test vectors +*/ + +void Core::Util::md5( unsigned char *text, unsigned char *hash, int size ) +{ + md5_context ctx; + md5_starts( &ctx ); + md5_update( &ctx, ( uint8_t * )text, size ); + md5_finish( &ctx, hash ); +} \ No newline at end of file diff --git a/src/servers/Server_Common/md5.h b/src/servers/Server_Common/md5.h new file mode 100644 index 00000000..87bf4d7f --- /dev/null +++ b/src/servers/Server_Common/md5.h @@ -0,0 +1,51 @@ +#include + +#ifndef _MD52_H +#define _MD52_H + +namespace Core +{ + namespace Util + { + typedef struct + { + uint32_t total[2]; + uint32_t state[4]; + uint8_t buffer[64]; + } + md5_context; + + + void md5( unsigned char *text, unsigned char *hash, int size ); + void md5_starts( md5_context *ctx ); + void md5_update( md5_context *ctx, uint8_t *input, uint32_t length ); + void md5_finish( md5_context *ctx, uint8_t digest[16] ); + + static const char *msg[] = + { + "", + "a", + "abc", + "message digest", + "abcdefghijklmnopqrstuvwxyz", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "12345678901234567890123456789012345678901234567890123456789012" \ + "345678901234567890" + }; + + static const char *val[] = + { + "d41d8cd98f00b204e9800998ecf8427e", + "0cc175b9c0f1b6a831c399e269772661", + "900150983cd24fb0d6963f7d28e17f72", + "f96b697d7cb7938d525a2f31aaf161d0", + "c3fcd3d76192e4007dfb496cca67e13b", + "d174ab98d277d9f5a5611c2c9f419d9f", + "57edf4a22be3c955ac49da2e2107b67a" + }; + + } +} + + +#endif /* md5.h */ diff --git a/src/servers/Server_Lobby/CMakeLists.txt b/src/servers/Server_Lobby/CMakeLists.txt new file mode 100644 index 00000000..57cdcd6b --- /dev/null +++ b/src/servers/Server_Lobby/CMakeLists.txt @@ -0,0 +1,87 @@ +cmake_minimum_required(VERSION 2.6) +cmake_policy(SET CMP0015 NEW) +project(Sapphire) + +include_directories("../../libraries/external/ChaiScript-6.0.0/include/") +include_directories("../../libraries/sapphire/datReader/") +include_directories("../") + +file(GLOB SERVER_PUBLIC_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*") +file(GLOB SERVER_SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}*.c*") + +set(SERVER_COMMON_DIR ../Server_Common) +set(Boost_USE_STATIC_LIBS ON) + +if(UNIX) + include_directories("/usr/include/mysql/") + message(STATUS "Setting GCC flags") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -m32") + + find_package(Boost ${SAPPHIRE_BOOST_VER} COMPONENTS log log_setup thread date_time filesystem system) + if(Boost_FOUND) + set(BOOST_LIBRARY_DIR ${Boost_LIBRARY_DIR}) + else() + if (EXISTS /opt/build_libs/${SAPPHIRE_BOOST_FOLDER_NAME}) + set(Boost_INCLUDE_DIR /opt/build_libs/${SAPPHIRE_BOOST_FOLDER_NAME}) + set(BOOST_LIBRARYDIR /opt/build_libs/${SAPPHIRE_BOOST_FOLDER_NAME}/stage/lib) + find_package(Boost ${SAPPHIRE_BOOST_VER} COMPONENTS log log_setup thread date_time filesystem system) + else() + message(FATAL_ERROR "Unable to find boost ${SAPPHIRE_BOOST_VER} package!") + endif() + endif() +else() + add_definitions(-D_WIN32_WINNT=0x601) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) + include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/MySQL/") + message(STATUS "Setting MSVC flags") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHc") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") + + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/${SAPPHIRE_BOOST_FOLDER_NAME}) + message(STATUS "Using boost in /libraries/external") + set(Boost_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/${SAPPHIRE_BOOST_FOLDER_NAME}) + set(BOOST_LIBRARYDIR ${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/${SAPPHIRE_BOOST_FOLDER_NAME}/lib32-msvc-14.0) + else() + find_package(Boost ${SAPPHIRE_BOOST_VER} COMPONENTS log log_setup thread date_time filesystem system) + if(Boost_FOUND) + set(BOOST_LIBRARY_DIR ${Boost_LIBRARY_DIR}) + elseif ((EXISTS $ENV{BOOST_ROOT_DIR}) AND (EXISTS $ENV{BOOST_LIB_DIR})) + set(Boost_INCLUDE_DIR $ENV{BOOST_ROOT_DIR}) + set(BOOST_LIBRARYDIR $ENV{BOOST_LIB_DIR}) + else() + message(FATAL_ERROR "SapphireError: Unable to find boost ${SAPPHIRE_BOOST_VER} package and environment variables BOOST_ROOT_DIR and BOOST_LIB_DIR not set!") + endif() + endif() +endif() + + +include_directories(${Boost_INCLUDE_DIR}) + +link_directories(${BOOST_LIBRARYDIR}) +link_directories(${SERVER_COMMON_DIR}) +link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/sapphire/datReader) +link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/MySQL) +link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/zlib) + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/") + +add_executable(server_lobby ${SERVER_PUBLIC_INCLUDE_FILES} ${SERVER_SOURCE_FILES}) +add_dependencies(server_lobby Common xivdat) + +set_target_properties(server_lobby PROPERTIES + CXX_STANDARD 14 + CXX_STANDARD_REQUIRED ON + CXX_EXTENSIONS ON + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" + RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" + RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" +) + +if (UNIX) + target_link_libraries(server_lobby Common xivdat pthread mysqlclient dl z) +else() + target_link_libraries(server_lobby Common xivdat libmysql zlib1) +endif() + +target_link_libraries(server_lobby ${Boost_LIBRARIES} ${Boost_LIBRARIES}) diff --git a/src/servers/Server_Lobby/Forwards.h b/src/servers/Server_Lobby/Forwards.h new file mode 100644 index 00000000..94cebd2c --- /dev/null +++ b/src/servers/Server_Lobby/Forwards.h @@ -0,0 +1,33 @@ +#ifndef _FORWARDS_H +#define _FORWARDS_H + +#include +#include + +#define TYPE_FORWARD( x ) \ +class x; \ +typedef boost::shared_ptr< x > x ## Ptr; \ +typedef std::vector< x > x ## PtrList; + +namespace Core +{ + TYPE_FORWARD( LobbySession ); + + namespace Network + { + TYPE_FORWARD( Hive ); + TYPE_FORWARD( Acceptor ); + TYPE_FORWARD( Connection ); + TYPE_FORWARD( GameConnection ); + + namespace Packets + { + TYPE_FORWARD( GamePacket ); + } + } + + +} + + +#endif \ No newline at end of file diff --git a/src/servers/Server_Lobby/GameConnection.cpp b/src/servers/Server_Lobby/GameConnection.cpp new file mode 100644 index 00000000..5f40d522 --- /dev/null +++ b/src/servers/Server_Lobby/GameConnection.cpp @@ -0,0 +1,511 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "GameConnection.h" + +#include "ServerLobby.h" +#include "LobbyPacketContainer.h" + +#include "RestConnector.h" +#include "LobbySession.h" +#include "Forwards.h" +#include "blowfish.h" + + + + +extern Core::Logger g_log; +extern Core::ServerLobby g_serverLobby; +extern Core::Network::RestConnector g_restConnector; + +using namespace Core::Common; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +Core::Network::GameConnection::GameConnection( Core::Network::HivePtr pHive, + Core::Network::AcceptorPtr pAcceptor ) + : Connection( pHive ) + , m_pAcceptor( pAcceptor ) + , m_bEncryptionInitialized( false ) +{ +} + +Core::Network::GameConnection::~GameConnection() +{ + +} + + +// overwrite the parents onConnect for our game socket needs +void Core::Network::GameConnection::OnAccept( const std::string & host, uint16_t port ) +{ + GameConnectionPtr connection( new GameConnection( m_hive, m_pAcceptor ) ); + m_pAcceptor->Accept( connection ); + + g_log.info( "Connect from " + m_socket.remote_endpoint().address().to_string() ); +} + + +void Core::Network::GameConnection::OnDisconnect() +{ + g_log.debug( "DISCONNECT" ); +} + +void Core::Network::GameConnection::OnRecv( std::vector< uint8_t > & buffer ) +{ + Packets::FFXIVARR_PACKET_HEADER ipcHeader; + std::vector< Packets::FFXIVARR_PACKET_RAW > packetList; + + Network::Util::bufferToPacketList( buffer, ipcHeader, packetList ); + + handlePackets( ipcHeader, packetList ); + +} + +void Core::Network::GameConnection::OnError( const boost::system::error_code & error ) +{ + g_log.info( "GameConnection closed: " + error.message() ); +} + +void Core::Network::GameConnection::sendError( uint64_t sequence, uint32_t errorcode, uint16_t messageId, uint32_t tmpId ) +{ + GamePacketNew< FFXIVIpcLobbyError > errorPacket( tmpId ); + + errorPacket.data().seq = sequence; + errorPacket.data().error_id = errorcode; + errorPacket.data().message_id = messageId; + + Packets::LobbyPacketContainer pRP( m_encKey ); + pRP.addPacket( errorPacket ); + sendPacket( pRP ); +} + +void Core::Network::GameConnection::getCharList( FFXIVARR_PACKET_RAW& packet, uint32_t tmpId ) +{ + uint64_t sequence = *reinterpret_cast< uint64_t* >( &packet.data[0] + 0x10 ); + g_log.info( "Sequence [" + std::to_string( sequence ) + "]" ); + + g_log.info( "[" + std::to_string( m_pSession->getAccountID() ) + "] ReqCharList" ); + Packets::LobbyPacketContainer pRP( m_encKey ); + + GamePacketNew< FFXIVIpcServerList > serverListPacket( tmpId ); + serverListPacket.data().seq = 1; + serverListPacket.data().offset = 0; + serverListPacket.data().numServers = 1; + serverListPacket.data().server[0].id = 1; + serverListPacket.data().server[0].index = 0; + serverListPacket.data().final = 1; + sprintf( serverListPacket.data().server[0].name, "Sapphire" ); + + pRP.addPacket( serverListPacket ); + + GamePacketNew< FFXIVIpcRetainerList > retainerListPacket( tmpId ); + retainerListPacket.data().padding[8] = 1; + + pRP.addPacket( retainerListPacket ); + + sendPacket( pRP ); + + auto charList = g_restConnector.getCharList( ( char * )m_pSession->getSessionId() ); + + int charIndex = 0; + + for( uint8_t i = 0; i < 4; i++ ) + { + GamePacketNew< FFXIVIpcCharList > charListPacket( tmpId ); + + charListPacket.data().seq = sequence; + charListPacket.data().numInPacket = 2; + charListPacket.data().counter = i * 4; + + for( uint8_t j = 0; j < 2; j++ ) + + { + if( charIndex < charList.size() && charList.size() != 0 ) + { + FFXIVIpcCharList::CharaDetails details; + memset( &details, 0, sizeof( FFXIVIpcCharList::CharaDetails ) ); + + auto& charEntry = charList[charIndex]; + details.uniqueId = get<1>( charEntry ); + details.contentId = get<2>( charEntry ); + details.serverId = 1; + details.index = charIndex; + strcpy( details.charDetailJson, get<3>( charEntry ).c_str() ); + strcpy( details.nameChara, get<0>( charEntry ).c_str() ); + strcpy( details.nameServer, "Sapphire" ); + + charListPacket.data().charaDetails[j] = details; + + g_log.debug( "[" + std::to_string( charIndex ) + "] " + std::to_string( details.index ) + " - " + + get<0>( charEntry ) + " - " + + std::to_string( get<1>( charEntry ) ) + " - " + + std::to_string( get<2>( charEntry ) ) + " - " + + get<3>( charEntry ) ); + } + charIndex++; + } + + + // TODO: Eventually move to account info storage + if( i == 3 ) + { + charListPacket.data().entitledExpansion = 2; + charListPacket.data().maxCharOnWorld = 8; + charListPacket.data().unknown8 = 8; + charListPacket.data().veteranRank = 12; + charListPacket.data().counter = ( i * 4 ) + 1; + charListPacket.data().unknown4 = 128; + } + + Packets::LobbyPacketContainer pRP( m_encKey ); + pRP.addPacket( charListPacket ); + sendPacket( pRP ); + + } +} + +void Core::Network::GameConnection::enterWorld( FFXIVARR_PACKET_RAW& packet, uint32_t tmpId ) +{ + uint64_t sequence = *reinterpret_cast< uint64_t* >( &packet.data[0] + 0x10 ); + g_log.info( "Sequence [" + std::to_string( sequence ) + "]" ); + + g_log.info( "[" + std::to_string( m_pSession->getAccountID() ) + "] ReqEnterWorld" ); + + uint64_t lookupId = *reinterpret_cast< uint64_t* >( &packet.data[0] + 0x18 ); + + uint32_t logInCharId; + std::string logInCharName; + auto charList = g_restConnector.getCharList( ( char * )m_pSession->getSessionId() ); + for( uint32_t i = 0; i < charList.size(); i++ ) + { + uint64_t thisContentId = get<2>( charList[i] ); + + if( thisContentId == lookupId ) + { + logInCharId = get<1>( charList[i] ); + logInCharName = get<0>( charList[i] ); + break; + } + } + + + g_log.info( "[" + std::to_string( m_pSession->getAccountID() ) + "] Logging in as " + logInCharName + "(" + std::to_string( logInCharId ) + ")" ); + + Packets::LobbyPacketContainer pRP( m_encKey ); + + GamePacketNew< FFXIVIpcEnterWorld > enterWorldPacket( tmpId ); + + enterWorldPacket.data().contentId = lookupId; + + enterWorldPacket.data().seq = sequence; + strcpy( enterWorldPacket.data().host, g_serverLobby.m_pConfig->getValue< std::string >( "Settings.General.ZoneIp" ).c_str() ); + enterWorldPacket.data().port = g_serverLobby.m_pConfig->getValue< uint16_t >( "Settings.General.ZonePort" ); + enterWorldPacket.data().charId = logInCharId; + memcpy( enterWorldPacket.data().sid, m_pSession->getSessionId(), 66 ); + + pRP.addPacket( enterWorldPacket ); + sendPacket( pRP ); +} + +bool Core::Network::GameConnection::sendServiceAccountList( FFXIVARR_PACKET_RAW& packet, uint32_t tmpId ) +{ + LobbySessionPtr pSession = g_serverLobby.getSession( ( char* )&packet.data[0] + 0x20 ); + if( pSession != nullptr ) + { + g_log.Log( LoggingSeverity::info, "Found session linked to accountId: " + std::to_string( pSession->getAccountID() ) ); + m_pSession = pSession; + GamePacketNew< FFXIVIpcServiceIdInfo > serviceIdInfoPacket( tmpId ); + sprintf( serviceIdInfoPacket.data().serviceAccount[0].name, "FINAL FANTASY XIV" ); + serviceIdInfoPacket.data().numServiceAccounts = 1; + + serviceIdInfoPacket.data().u1 = 3; + serviceIdInfoPacket.data().u2 = 0x99; + serviceIdInfoPacket.data().serviceAccount[0].id = 0x002E4A2B; + + Packets::LobbyPacketContainer pRP( m_encKey ); + pRP.addPacket( serviceIdInfoPacket ); + sendPacket( pRP ); + } + else + { + g_log.Log( LoggingSeverity::info, "Could not retrieve session: " + std::string( ( char* )&packet.data[0] + 0x20 ) ); + sendError( 1, 5006, 13001, tmpId ); + + return true; + } + return false; +} + +bool Core::Network::GameConnection::createOrModifyChar( FFXIVARR_PACKET_RAW& packet, uint32_t tmpId ) +{ + uint64_t sequence = *reinterpret_cast< uint64_t* >( &packet.data[0] + 0x10 ); + uint8_t type = *reinterpret_cast< uint8_t* >( &packet.data[0] + 0x29 ); + g_log.info( "Sequence [" + std::to_string( sequence ) + "]" ); + g_log.info( "Type [" + std::to_string( type ) + "]" ); + + g_log.info( "[" + std::to_string( m_pSession->getAccountID() ) + "] ReqCharCreate" ); + + std::string name; + uint32_t newId = g_restConnector.getNextCharId(); + uint64_t newContentId = g_restConnector.getNextContentId(); + + if( type == 1 ) //Character creation name check + { + name = std::string( ( char* )&packet.data[0] + 0x2C ); + + g_log.Log( LoggingSeverity::info, "[" + std::to_string( m_pSession->getAccountID() ) + "] Type 1: " + name ); + + Packets::LobbyPacketContainer pRP( m_encKey ); + + m_pSession->newCharName = name; + + if( g_restConnector.checkNameTaken( m_pSession->newCharName ) ) + { + sendError( sequence, 3074, 13004, tmpId ); + return true; + } + + GamePacketNew< FFXIVIpcCharCreate > charCreatePacket( tmpId ); + + charCreatePacket.data().content_id = newContentId; + strcpy( charCreatePacket.data().name, name.c_str() ); + strcpy( charCreatePacket.data().world, "Sapphire" ); + charCreatePacket.data().type = 1; + charCreatePacket.data().seq = sequence; + charCreatePacket.data().unknown = 1; + charCreatePacket.data().unknown_2 = 1; + charCreatePacket.data().unknown_7 = 1; + charCreatePacket.data().unknown_8 = 1; + + pRP.addPacket( charCreatePacket ); + sendPacket( pRP ); + } + else if( type == 2 ) //Character creation finalize + { + std::string charDetails( ( char* )&packet.data[0] + 0x4C ); + g_log.Log( LoggingSeverity::info, "[" + std::to_string( m_pSession->getAccountID() ) + "] Type 2: " + charDetails ); + + if( g_restConnector.createCharacter( ( char* )m_pSession->getSessionId(), m_pSession->newCharName, charDetails ) != -1 ) + { + Packets::LobbyPacketContainer pRP( m_encKey ); + + GamePacketNew< FFXIVIpcCharCreate > charCreatePacket( tmpId ); + + charCreatePacket.data().content_id = newContentId; + strcpy( charCreatePacket.data().name, name.c_str() ); + strcpy( charCreatePacket.data().world, "Sapphire" ); + charCreatePacket.data().type = 2; + charCreatePacket.data().seq = sequence; + charCreatePacket.data().unknown = 1; + charCreatePacket.data().unknown_2 = 1; + charCreatePacket.data().unknown_7 = 1; + charCreatePacket.data().unknown_8 = 1; + + pRP.addPacket( charCreatePacket ); + sendPacket( pRP ); + } + else + { + sendError( sequence, 5006, 13001, tmpId ); + } + } + else if( type == 4 ) //Character delete + { + name = std::string( ( char* )&packet.data[0] + 0x2C ); + g_log.info( "[" + std::to_string( m_pSession->getAccountID() ) + "] Type 4: " + name ); + + + + if( g_restConnector.deleteCharacter( ( char* )m_pSession->getSessionId(), name ) ) + { + + GamePacketNew< FFXIVIpcCharCreate > charCreatePacket( tmpId ); + + //charCreatePacket.data().content_id = deletePlayer.getContentId(); + charCreatePacket.data().content_id = 0; + strcpy( charCreatePacket.data().name, name.c_str() ); + strcpy( charCreatePacket.data().world, "Sapphire" ); + charCreatePacket.data().type = 4; + charCreatePacket.data().seq = sequence; + charCreatePacket.data().unknown = 1; + charCreatePacket.data().unknown_2 = 1; + charCreatePacket.data().unknown_7 = 1; + charCreatePacket.data().unknown_8 = 1; + + Packets::LobbyPacketContainer pRP( m_encKey ); + pRP.addPacket( charCreatePacket ); + sendPacket( pRP ); + } + else + { + sendError( sequence, 5006, 13001, tmpId ); + } + } + else + { + g_log.error( "[" + std::to_string( m_pSession->getAccountID() ) + "] Unknown Character Creation Type: " + std::to_string( type ) ); + } + return false; +} + +void Core::Network::GameConnection::handleGamePacket( Packets::FFXIVARR_PACKET_RAW &packet ) +{ + + uint32_t tmpId = packet.segHdr.target_actor; + + g_log.info( "OpCode [" + std::to_string( *reinterpret_cast< uint16_t* >( &packet.data[2] ) ) + "]" ); + + switch( *reinterpret_cast< uint16_t* >( &packet.data[2] ) ) + { + case ReqServiceAccountList: + { + sendServiceAccountList( packet, tmpId ); + } + break; + + case ReqCharList: + { + getCharList( packet, tmpId ); + } + break; + + case ReqEnterWorld: + { + enterWorld( packet, tmpId ); + } + break; + + case ReqCharCreate: + { + createOrModifyChar( packet, tmpId ); + } + break; + + } + +} + +void Core::Network::GameConnection::sendPacket( Packets::LobbyPacketContainer& pLpc ) +{ + uint16_t size = pLpc.getSize(); + uint8_t* dataPtr = pLpc.getRawData( false ); + std::vector< uint8_t > sendBuffer; + sendBuffer.assign( dataPtr, dataPtr + size ); + Send( sendBuffer ); +} + +void Core::Network::GameConnection::sendPackets( Packets::PacketContainer * pPacket ) +{ + //g_log.Log(LoggingSeverity::info, pPacket->toString()); + std::vector< uint8_t > sendBuffer; + + pPacket->fillSendBuffer( sendBuffer ); + Send( sendBuffer ); +} + +void Core::Network::GameConnection::sendSinglePacket( Packets::GamePacket * pPacket ) +{ + PacketContainer pRP = PacketContainer(); + pRP.addPacket( *pPacket ); + sendPackets( &pRP ); +} + +void Core::Network::GameConnection::sendSinglePacket( Packets::GamePacket & pPacket ) +{ + PacketContainer pRP = PacketContainer(); + pRP.addPacket( pPacket ); + sendPackets( &pRP ); +} + +void Core::Network::GameConnection::generateEncryptionKey( uint32_t key, const std::string& keyPhrase ) +{ + memset( m_baseKey, 0, 0x2C ); + m_baseKey[0] = 0x78; + m_baseKey[1] = 0x56; + m_baseKey[2] = 0x34; + m_baseKey[3] = 0x12; + memcpy( m_baseKey + 0x04, &key, 4 ); + m_baseKey[8] = 0xA0; + m_baseKey[9] = 0x0F; + memcpy( ( char* )m_baseKey + 0x0C, keyPhrase.c_str(), keyPhrase.size() ); + Core::Util::md5( m_baseKey, m_encKey, 0x2C ); +} + +void Core::Network::GameConnection::handlePackets( const Core::Network::Packets::FFXIVARR_PACKET_HEADER& ipcHeader, + const std::vector& packetData ) +{ + + for( auto inPacket : packetData ) + { + + if( m_bEncryptionInitialized && inPacket.segHdr.type == 3 ) + { + BlowFish blowfish; + blowfish.initialize( m_encKey, 0x10 ); + blowfish.Decode( ( unsigned char* )( &inPacket.data[0] ), ( unsigned char* )( &inPacket.data[0] ), + ( inPacket.data.size() ) - 0x10 ); + } + + switch( inPacket.segHdr.type ) + { + case 9: // Encryption init + { + std::string key_phrase( reinterpret_cast< char* >( &inPacket.data[36] ) ); + generateEncryptionKey( *reinterpret_cast< uint32_t* >( &inPacket.data[100] ), key_phrase ); + m_bEncryptionInitialized = true; + + std::vector< uint8_t > samplePacket( 0x290 ); + memset( &samplePacket[0], 0, 0x290 ); + + *reinterpret_cast< uint16_t* >( &samplePacket[0] ) = 0x290; + *reinterpret_cast< uint8_t* >( &samplePacket[0] + 0x0C ) = 0x0A; + *reinterpret_cast< uint32_t* >( &samplePacket[0] + 0x10 ) = 0xE0003C2A; + + BlowFish blowfish; + blowfish.initialize( m_encKey, 0x10 ); + blowfish.Encode( &samplePacket[0] + 0x10, &samplePacket[0] + 0x10, 0x280 ); + + auto packet = GamePacket( reinterpret_cast< char* >( &samplePacket[0] ), static_cast< uint16_t >( samplePacket.size() ) ); + sendSinglePacket( packet ); + break; + } + + + case 3: // game packet + { + g_log.info( "GamePacket [" + std::to_string( inPacket.segHdr.type ) + "]" ); + handleGamePacket( inPacket ); + break; + } + case 7: // keep alive + { + uint32_t id = *reinterpret_cast< uint32_t* >( &inPacket.data[0] ); + uint32_t timeStamp = *reinterpret_cast< uint32_t* >( &inPacket.data[4] ); + + GamePacket pPe( 0x00, 0x18, 0, 0, 0x08 ); + pPe.setValAt< uint32_t >( 0x10, id ); + pPe.setValAt< uint32_t >( 0x14, timeStamp ); + sendSinglePacket( &pPe ); + + break; + } + case 8: + { + break; + } + } + } +} diff --git a/src/servers/Server_Lobby/GameConnection.h b/src/servers/Server_Lobby/GameConnection.h new file mode 100644 index 00000000..a8b73bdb --- /dev/null +++ b/src/servers/Server_Lobby/GameConnection.h @@ -0,0 +1,87 @@ +#ifndef GAMECONNECTION_H +#define GAMECONNECTION_H + +#include +#include +#include + +#include +#include +#include "LobbyPacketContainer.h" + + +#include + +#include "Forwards.h" + +#define DECLARE_HANDLER( x ) void x( Packets::GamePacketPtr pInPacket, Entity::PlayerPtr pPlayer ) + +namespace Core { +namespace Network { + +class GameConnection : public Connection +{ + +private: + // TODO move the next three params to the session, makes more sense there + // encryption key + uint8_t m_encKey[0x10]; + + // base key, the encryption key is generated from this + uint8_t m_baseKey[0x2C]; + + bool m_bEncryptionInitialized; + + AcceptorPtr m_pAcceptor; + + LobbySessionPtr m_pSession; + + LockedQueue< Packets::GamePacketPtr > m_inQueue; + LockedQueue< Packets::GamePacketPtr > m_outQueue; + +public: + GameConnection( HivePtr pHive, AcceptorPtr pAcceptor ); + + ~GameConnection(); + + void generateEncryptionKey( uint32_t key, const std::string& keyPhrase ); + + // overwrite the parents onConnect for our game socket needs + void OnAccept( const std::string & host, uint16_t port ) override; + + void OnDisconnect() override; + + void OnRecv( std::vector< uint8_t > & buffer ) override; + + void OnError( const boost::system::error_code & error ) override; + void sendError( uint64_t sequence, uint32_t errorcode, uint16_t messageId, uint32_t tmpId ); + + void getCharList( Packets::FFXIVARR_PACKET_RAW& packet, uint32_t tmpId ); + void enterWorld( Packets::FFXIVARR_PACKET_RAW& packet, uint32_t tmpId ); + bool sendServiceAccountList( Packets::FFXIVARR_PACKET_RAW& packet, uint32_t tmpId ); + bool createOrModifyChar( Packets::FFXIVARR_PACKET_RAW& packet, uint32_t tmpId ); + + void handlePackets( const Packets::FFXIVARR_PACKET_HEADER& ipcHeader, + const std::vector& packetData ); + + void handleGamePacket( Packets::FFXIVARR_PACKET_RAW &pPacket ); + + void handleGamePacket( Packets::GamePacketPtr pPacket ); + + void sendPackets( Packets::PacketContainer * pPacket ); + + void sendPacket( Packets::LobbyPacketContainer& pLpc ); + + void sendSinglePacket( Packets::GamePacket * pPacket ); + + void sendSinglePacket( Packets::GamePacket & pPacket ); + +}; + + + +} +} + + +#endif \ No newline at end of file diff --git a/src/servers/Server_Lobby/LobbyPacketContainer.cpp b/src/servers/Server_Lobby/LobbyPacketContainer.cpp new file mode 100644 index 00000000..3b70a67b --- /dev/null +++ b/src/servers/Server_Lobby/LobbyPacketContainer.cpp @@ -0,0 +1,59 @@ +#include "LobbyPacketContainer.h" +#include +#include + +#include "blowfish.h" + +namespace Core { + namespace Network { + namespace Packets { + + LobbyPacketContainer::LobbyPacketContainer( uint8_t* encKey ) + { + memset( &m_header, 0, sizeof( Core::Network::Packets::FFXIVARR_PACKET_HEADER ) ); + m_header.size = sizeof( Core::Network::Packets::FFXIVARR_PACKET_HEADER ); + + m_encKey = encKey; + + memset( m_dataBuf, 0, 0x1570 ); + } + + LobbyPacketContainer::~LobbyPacketContainer() + { + m_entryList.clear(); + } + + void LobbyPacketContainer::addPacket( GamePacketPtr pEntry ) + { + memcpy( m_dataBuf + m_header.size, pEntry->getData(), pEntry->getSize() ); + + // encryption key is set, we want to encrypt this packet + if( m_encKey != NULL ) + { + BlowFish blowfish; + blowfish.initialize( m_encKey, 0x10 ); + blowfish.Encode( m_dataBuf + m_header.size + 0x10, m_dataBuf + m_header.size + 0x10, pEntry->getSize() - 0x10 ); + } + + m_header.size += pEntry->getSize(); + m_header.count++; + } + + uint16_t LobbyPacketContainer::getSize() const + { + return m_header.size; + } + + uint8_t* LobbyPacketContainer::getRawData( bool addstuff ) + { + if( addstuff ) + { + m_header.unknown_0 = 0xff41a05252; + m_header.timestamp = Core::Util::getTimeMs(); + } + memcpy( m_dataBuf, &m_header, sizeof( Core::Network::Packets::FFXIVARR_PACKET_HEADER ) ); + return m_dataBuf; + } + } + } +} diff --git a/src/servers/Server_Lobby/LobbyPacketContainer.h b/src/servers/Server_Lobby/LobbyPacketContainer.h new file mode 100644 index 00000000..cc17e55d --- /dev/null +++ b/src/servers/Server_Lobby/LobbyPacketContainer.h @@ -0,0 +1,45 @@ +#pragma once + +#ifndef _LobbyPacketContainer_H_ +#define _LobbyPacketContainer_H_ + +#include +#include + +#include +#include + +#include "Forwards.h" + +namespace Core { + namespace Network { + namespace Packets { + class GamePacket; + + class LobbyPacketContainer + { + public: + LobbyPacketContainer( uint8_t* encKey = nullptr ); + ~LobbyPacketContainer(); + + void addPacket( GamePacketPtr pEntry ); + + uint16_t getSize() const; + + uint8_t* getRawData( bool addstuff = true ); + + private: + Core::Network::Packets::FFXIVARR_PACKET_HEADER m_header; + + uint8_t * m_encKey; + + std::vector m_entryList; + + uint8_t m_dataBuf[0x2000]; + + }; + + } + } +} +#endif diff --git a/src/servers/Server_Lobby/LobbySession.cpp b/src/servers/Server_Lobby/LobbySession.cpp new file mode 100644 index 00000000..e8f4d902 --- /dev/null +++ b/src/servers/Server_Lobby/LobbySession.cpp @@ -0,0 +1,15 @@ +#include "LobbySession.h" +namespace Core +{ + LobbySession::LobbySession( void ) + { + //setSocket(NULL); + + } + + LobbySession::~LobbySession( void ) + { + + } +} + diff --git a/src/servers/Server_Lobby/LobbySession.h b/src/servers/Server_Lobby/LobbySession.h new file mode 100644 index 00000000..867a1008 --- /dev/null +++ b/src/servers/Server_Lobby/LobbySession.h @@ -0,0 +1,62 @@ +#pragma once + +#ifndef _CLobbySession_H_ +#define _CLobbySession_H_ + +#include +#include +#include + +namespace Core { + + class LobbySession + { + + private: + uint32_t m_IP; + uint32_t m_accountID; + + uint8_t m_sessionId[56]; + + public: + + std::string newCharName; + + LobbySession( void ); + ~LobbySession( void ); + + uint32_t getIP() + { + return m_IP; + } + + uint8_t * getSessionId() + { + return m_sessionId; + } + + void setSessionId( uint8_t * sessionId ) + { + memcpy( m_sessionId, sessionId, 56 ); + } + + void setIP( uint32_t iP ) + { + m_IP = iP; + } + + uint32_t getAccountID() + { + return m_accountID; + } + + void setAccountID( uint32_t iD ) + { + m_accountID = iD; + } + + }; + +} + +#endif diff --git a/src/servers/Server_Lobby/RestConnector.cpp b/src/servers/Server_Lobby/RestConnector.cpp new file mode 100644 index 00000000..997739e0 --- /dev/null +++ b/src/servers/Server_Lobby/RestConnector.cpp @@ -0,0 +1,343 @@ +#include "RestConnector.h" +#include "LobbySession.h" +#include "ServerLobby.h" +#include +#include +#include +#include +#include + +#define BOOST_SPIRIT_THREADSAFE +#include +#include +#include +#include +#include +#include + +extern Core::Logger g_log; + +typedef std::vector> CharList; + +Core::Network::RestConnector::RestConnector() +{ + +} + +Core::Network::RestConnector::~RestConnector() +{ + +} + +HttpResponse Core::Network::RestConnector::requestApi( std::string endpoint, std::string data ) +{ + HttpClient client( restHost ); + + std::string reqstr = "/sapphire-api/lobby/" + endpoint; + + HttpResponse r; + try + { + r = client.request( "POST", reqstr, data ); + } + catch( std::exception& e ) + { + g_log.error( endpoint + " failed, REST is not reachable: " + std::string( e.what() ) ); + return nullptr; + } + return r; +} + +Core::LobbySessionPtr Core::Network::RestConnector::getSession( char* sId ) +{ + std::string json_string = "{\"sId\": \"" + std::string( sId ) + "\",\"secret\": \"" + serverSecret + "\"}"; + + HttpResponse r = requestApi( "checkSession", json_string ); + + if( r == nullptr ) + return nullptr; + + std::string content = std::string( std::istreambuf_iterator( r->content ), {} ); + if( r->status_code.find( "200" ) != std::string::npos ) + { + using namespace boost::property_tree; + ptree pt; + + try { + std::stringstream ss; + ss << content; + + read_json( ss, pt ); + } + catch( std::exception& e ) + { + g_log.debug( "Could not parse REST response: " + std::string( e.what() ) ); + return nullptr; + } + + if( content.find( "invalid" ) == std::string::npos ) + { + LobbySessionPtr pSession( new Core::LobbySession() ); + pSession->setAccountID( atoi( pt.get( "result" ).c_str() ) ); + pSession->setSessionId( (uint8_t *)sId ); + return pSession; + } + else + { + return nullptr; + } + } + else + { + return nullptr; + } +} + +bool Core::Network::RestConnector::checkNameTaken( std::string name ) +{ + std::string json_string = "{\"name\": \"" + name + "\",\"secret\": \"" + serverSecret + "\"}"; + + HttpResponse r = requestApi( "checkNameTaken", json_string ); + + if( r == nullptr ) + return true; + + std::string content = std::string( std::istreambuf_iterator( r->content ), {} ); + if( r->status_code.find( "200" ) != std::string::npos ) + { + using namespace boost::property_tree; + ptree pt; + + try { + std::stringstream ss; + ss << content; + + read_json( ss, pt ); + } + catch( std::exception& e ) + { + g_log.debug( "Could not parse REST response: " + std::string( e.what() ) ); + return true; + } + + if( pt.get( "result" ) != "invalid" && pt.get( "result" ) == "false" ) + return false; + return true; + } + else + { + return true; + } +} + +uint32_t Core::Network::RestConnector::getNextCharId() +{ + std::string json_string = "{\"secret\": \"" + serverSecret + "\"}"; + + HttpResponse r = requestApi( "getNextCharId", json_string ); + + if( r == nullptr ) + return -1; + + std::string content = std::string( std::istreambuf_iterator( r->content ), {} ); + if( r->status_code.find( "200" ) != std::string::npos ) + { + using namespace boost::property_tree; + ptree pt; + + try { + std::stringstream ss; + ss << content; + + read_json( ss, pt ); + } + catch( std::exception& e ) + { + g_log.debug( "Could not parse REST response: " + std::string( e.what() ) ); + return -1; + } + + if( content.find( "invalid" ) == std::string::npos ) + { + return pt.get( "result" ); + } + else + { + return -1; + } + } + else + { + return -1; + } +} + +uint64_t Core::Network::RestConnector::getNextContentId() +{ + std::string json_string = "{\"secret\": \"" + serverSecret + "\"}"; + + HttpResponse r = requestApi( "getNextContentId", json_string ); + + if( r == nullptr ) + return -1; + + std::string content = std::string( std::istreambuf_iterator( r->content ), {} ); + if( r->status_code.find( "200" ) != std::string::npos ) + { + using namespace boost::property_tree; + ptree pt; + + try { + std::stringstream ss; + ss << content; + + read_json( ss, pt ); + } + catch( std::exception& e ) + { + g_log.debug( "Could not parse REST response: " + std::string( e.what() ) ); + return -1; + } + + if( content.find( "invalid" ) == std::string::npos ) + { + return pt.get( "result" ); + } + else + { + return -1; + } + } + else + { + return -1; + } +} + +CharList Core::Network::RestConnector::getCharList( char * sId ) +{ + std::string json_string = "{\"sId\": \"" + std::string( sId, 56 ) + "\",\"secret\": \"" + serverSecret + "\"}"; + + HttpResponse r = requestApi( "getCharacterList", json_string ); + + CharList list; + if( r == nullptr ) + return list; + + std::string content = std::string( std::istreambuf_iterator( r->content ), {} ); + g_log.debug( content ); + if( r->status_code.find( "200" ) != std::string::npos ) + { + using namespace boost::property_tree; + ptree pt; + + try { + std::stringstream ss; + ss << content; + + read_json( ss, pt ); + } + catch( std::exception& e ) + { + g_log.debug( "Could not parse REST response: " + std::string( e.what() ) ); + return list; + } + + if( pt.get( "result" ).find( "invalid" ) == std::string::npos ) + { + + g_log.debug( pt.get_value( "result" ) ); + + for( auto& child : pt.get_child( "charArray" ) ){ + g_log.debug( child.second.get( "contentId" ) ); + list.push_back( std::make_tuple( child.second.get( "name" ), atoi( child.second.get( "charId" ).c_str() ), child.second.get( "contentId" ), child.second.get( "infoJson" ) ) ); + } + + return list; + + } + else + { + return list; + } + } + else + { + return list; + } +} + +bool Core::Network::RestConnector::deleteCharacter( char* sId, std::string name ) +{ + std::string json_string = "{\"sId\": \"" + std::string( sId, 56 ) + "\",\"secret\": \"" + serverSecret + "\",\"name\": \"" + name + "\"}"; + + HttpResponse r = requestApi( "deleteCharacter", json_string ); + + if( r == nullptr ) + return false; + + std::string content = std::string( std::istreambuf_iterator( r->content ), {} ); + if( r->status_code.find( "200" ) != std::string::npos ) + { + using namespace boost::property_tree; + ptree pt; + + try { + std::stringstream ss; + ss << content; + + read_json( ss, pt ); + } + catch( std::exception& e ) + { + g_log.debug( "Could not parse REST response: " + std::string( e.what() ) ); + return false; + } + + if( content.find( "invalid" ) == std::string::npos ) + return true; + return false; + } + else + { + return false; + } +} + +int Core::Network::RestConnector::createCharacter( char * sId, std::string name, std::string infoJson ) +{ + std::string json_string = "{\"sId\": \"" + std::string( sId, 56 ) + "\",\"secret\": \"" + serverSecret + "\",\"name\": \"" + name + "\",\"infoJson\": \"" + Core::Util::base64_encode( (unsigned char *)infoJson.c_str(), infoJson.length() ) + "\"}"; + + HttpResponse r = requestApi( "createCharacter", json_string ); + + if( r == nullptr ) + return -1; + + std::string content = std::string( std::istreambuf_iterator( r->content ), {} ); + g_log.debug( content ); + if( r->status_code.find( "200" ) != std::string::npos ) + { + using namespace boost::property_tree; + ptree pt; + + try { + std::stringstream ss; + ss << content; + + read_json( ss, pt ); + } + catch( std::exception& e ) + { + g_log.debug( "Could not parse REST response: " + std::string( e.what() ) ); + return -1; + } + + if( content.find( "invalid" ) == std::string::npos ) + return atoi( pt.get( "result" ).c_str() ); + return -1; + } + else + { + return -1; + } +} \ No newline at end of file diff --git a/src/servers/Server_Lobby/RestConnector.h b/src/servers/Server_Lobby/RestConnector.h new file mode 100644 index 00000000..c31c2a6e --- /dev/null +++ b/src/servers/Server_Lobby/RestConnector.h @@ -0,0 +1,44 @@ +#ifndef _RESTCONNECTOR_H_ +#define _RESTCONNECTOR_H_ + +#include +#include +#include + +#include "client_http.hpp" +#include "Forwards.h" + +typedef SimpleWeb::Client HttpClient; +typedef std::shared_ptr::Response> HttpResponse; + +namespace Core +{ + class Session; + + namespace Network + { + class LobbySession; + + class RestConnector + { + public: + RestConnector(); + ~RestConnector(); + + HttpResponse requestApi( std::string endpoint, std::string data ); + LobbySessionPtr getSession( char* sId ); + int createCharacter( char * sId, std::string name, std::string infoJson ); + std::vector> getCharList( char * sId ); + bool deleteCharacter( char* sId, std::string name ); + bool checkNameTaken( std::string name ); + uint32_t getNextCharId(); + uint64_t getNextContentId(); + + std::string serverSecret; + std::string restHost; + + }; + } +} + +#endif diff --git a/src/servers/Server_Lobby/ServerLobby.cpp b/src/servers/Server_Lobby/ServerLobby.cpp new file mode 100644 index 00000000..c8724111 --- /dev/null +++ b/src/servers/Server_Lobby/ServerLobby.cpp @@ -0,0 +1,137 @@ + +#include +#include +#include + +#include +#include + +#include +#include + +//#include "LobbySession.h" + +#include "ServerLobby.h" + +#include "GameConnection.h" +#include "RestConnector.h" + +#include +#include + +#include +#include + +#include + +Core::Logger g_log; +Core::Network::RestConnector g_restConnector; + +namespace Core { + + + ServerLobby::ServerLobby( const std::string& configPath ) : + m_configPath( configPath ), + m_numConnections( 0 ) + { + m_pConfig = boost::shared_ptr( new XMLConfig ); + } + + ServerLobby::~ServerLobby( void ) + { + } + + LobbySessionPtr ServerLobby::getSession( char* sessionId ) + { + return g_restConnector.getSession( sessionId ); + } + + void ServerLobby::run( int argc, char* argv[] ) + { + g_log.setLogPath( "log\\SapphireLobby" ); + g_log.init(); + + g_log.info( "===========================================================" ); + g_log.info( "Sapphire Server Project " ); + g_log.info( "Version: x.y.z" ); + g_log.info( "Compiled: " __DATE__ " " __TIME__ ); + g_log.info( "===========================================================" ); + + if( !loadSettings( argc, argv ) ) + { + g_log.fatal( "Error loading settings! " ); + return; + } + + Network::HivePtr hive( new Network::Hive() ); + Network::addServerToHive< Network::GameConnection >( m_ip, m_port, hive ); + + g_log.info( "Lobbyserver ready for connections." ); + + boost::thread_group worker_threads; + worker_threads.create_thread( boost::bind( &Network::Hive::Run, hive.get() ) ); + worker_threads.join_all(); + + } + + bool ServerLobby::loadSettings( int argc, char* argv[] ) + { + g_log.info( "Loading config " + m_configPath ); + + if( !m_pConfig->loadConfig( m_configPath ) ) + { + g_log.fatal( "Error loading config " + m_configPath ); + return false; + } + std::vector args( argv + 1, argv + argc ); + for( auto i = 0; i + 1 < args.size(); i += 2 ) + { + std::string arg( "" ); + std::string val( "" ); + + try + { + arg = std::string( args[i] ); + val = std::string( args[i + 1] ); + + // trim '-' from start of arg + arg = arg.erase( 0, arg.find_first_not_of( '-' ) ); + + if( arg == "ip" ) + { + // todo: ip addr in config + m_pConfig->setValue< std::string >( "Settings.General.ListenIP", val ); + } + else if( arg == "p" || arg == "port" ) + { + m_pConfig->setValue< std::string >( "Settings.General.ListenPort", val ); + } + else if( arg == "ap" || arg == "auth" || arg == "authport" ) + { + m_pConfig->setValue< std::string>( "Settings.General.AuthPort", val ); + } + else if( arg == "worldIP" || arg == "worldIp" ) + { + m_pConfig->setValue < std::string >( "Settings.General.WorldIp", val ); + } + else if( arg == "worldPort" ) + { + m_pConfig->setValue< std::string >( "Settings.General.WorldPort", val ); + } + } + catch( ... ) + { + g_log.error( "Error parsing argument: " + arg + " " + "value: " + val + "\n" ); + g_log.error( "Usage: \n" ); + } + } + + m_port = m_pConfig->getValue< uint16_t >( "Settings.General.ListenPort" ); + m_ip = m_pConfig->getValue< std::string >( "Settings.General.ListenIp" ); + + g_restConnector.restHost = m_pConfig->getValue< std::string >( "Settings.General.RestHost" ); + g_restConnector.serverSecret = m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ); + + return true; + } +} diff --git a/src/servers/Server_Lobby/ServerLobby.h b/src/servers/Server_Lobby/ServerLobby.h new file mode 100644 index 00000000..6bc07868 --- /dev/null +++ b/src/servers/Server_Lobby/ServerLobby.h @@ -0,0 +1,55 @@ +#pragma once + +#ifndef _CSERVERLOBBY_H_ +#define _CSERVERLOBBY_H_ + +#include + +#include +#include + +#include "Forwards.h" + +const std::string LOBBY_VERSION = "0.0.5"; + +namespace Core +{ + class LobbySession; + class XMLConfig; + typedef std::map< std::string, LobbySessionPtr > LobbySessionMap; + + class ServerLobby + { + + friend class LobbyConnection; + private: + + LobbySessionMap m_sessionMap; + std::string m_configPath; + + uint16_t m_port; + std::string m_ip; + + public: + ServerLobby( const std::string& configPath ); + ~ServerLobby( void ); + + void run( int argc, char* argv[] ); + + bool loadSettings( int argc, char* argv[] ); + + void addSession( char* sessionId, LobbySessionPtr pSession ) + { + m_sessionMap[std::string( sessionId )] = pSession; + } + + LobbySessionPtr getSession( char* sessionId ); + uint32_t m_numConnections; + boost::shared_ptr m_pConfig; + + }; + + +} + +#endif diff --git a/src/servers/Server_Lobby/blowfish.cpp b/src/servers/Server_Lobby/blowfish.cpp new file mode 100644 index 00000000..ab15ecad --- /dev/null +++ b/src/servers/Server_Lobby/blowfish.cpp @@ -0,0 +1,258 @@ +// blowfish.cpp C++ class implementation of the BLOWFISH encryption algorithm +// _THE BLOWFISH ENCRYPTION ALGORITHM_ +// by Bruce Schneier +// Revised code--3/20/94 +// Converted to C++ class 5/96, Jim Conger + +#include "blowfish.h" +#include "blowfish.h2" // holds the random digit tables + +#define S(x,i) (SBoxes[i][x.w.byte##i]) +#define bf_F(x) (((S(x,0) + S(x,1)) ^ S(x,2)) + S(x,3)) +#define ROUND(a,b,n) (a.dword ^= bf_F(b) ^ PArray[n]) + + +BlowFish::BlowFish () +{ + PArray = new DWORD [18] ; + SBoxes = new DWORD [4][256] ; +} + +BlowFish::~BlowFish () +{ + delete PArray ; + delete [] SBoxes ; +} + + // the low level (private) encryption function +void BlowFish::Blowfish_encipher (DWORD *xl, DWORD *xr) +{ + union aword Xl, Xr ; + + Xl.dword = *xl ; + Xr.dword = *xr ; + + Xl.dword ^= PArray [0]; + ROUND (Xr, Xl, 1) ; ROUND (Xl, Xr, 2) ; + ROUND (Xr, Xl, 3) ; ROUND (Xl, Xr, 4) ; + ROUND (Xr, Xl, 5) ; ROUND (Xl, Xr, 6) ; + ROUND (Xr, Xl, 7) ; ROUND (Xl, Xr, 8) ; + ROUND (Xr, Xl, 9) ; ROUND (Xl, Xr, 10) ; + ROUND (Xr, Xl, 11) ; ROUND (Xl, Xr, 12) ; + ROUND (Xr, Xl, 13) ; ROUND (Xl, Xr, 14) ; + ROUND (Xr, Xl, 15) ; ROUND (Xl, Xr, 16) ; + Xr.dword ^= PArray [17] ; + + *xr = Xl.dword ; + *xl = Xr.dword ; +} + + // the low level (private) decryption function +void BlowFish::Blowfish_decipher (DWORD *xl, DWORD *xr) +{ + union aword Xl ; + union aword Xr ; + + Xl.dword = *xl ; + Xr.dword = *xr ; + + Xl.dword ^= PArray [17] ; + ROUND (Xr, Xl, 16) ; ROUND (Xl, Xr, 15) ; + ROUND (Xr, Xl, 14) ; ROUND (Xl, Xr, 13) ; + ROUND (Xr, Xl, 12) ; ROUND (Xl, Xr, 11) ; + ROUND (Xr, Xl, 10) ; ROUND (Xl, Xr, 9) ; + ROUND (Xr, Xl, 8) ; ROUND (Xl, Xr, 7) ; + ROUND (Xr, Xl, 6) ; ROUND (Xl, Xr, 5) ; + ROUND (Xr, Xl, 4) ; ROUND (Xl, Xr, 3) ; + ROUND (Xr, Xl, 2) ; ROUND (Xl, Xr, 1) ; + Xr.dword ^= PArray[0]; + + *xl = Xr.dword; + *xr = Xl.dword; +} + + + // constructs the enctryption sieve +void BlowFish::initialize (BYTE key[], int keybytes) +{ + int i, j ; + DWORD datal, datar ; + + + // first fill arrays from data tables + for (i = 0 ; i < 18 ; i++) + PArray [i] = bf_P [i] ; + + for (i = 0 ; i < 4 ; i++) + { + for (j = 0 ; j < 256 ; j++) + SBoxes [i][j] = bf_S [i][j] ; + } + + int v12; // eax@6 + int v13; // ecx@6 + int v14; // eax@8 + int v15; // edx@8 + int v16; // edx@8 + int v17; // eax@10 + int v18; // ecx@10 + int v19; // ecx@10 + int v20; // edx@12 + int v21; // edx@12 + + + + int v10 = keybytes; + int v9 = (int)key; + int v8 = 0; + int v11 = 0; + do { + v13 = (char)(*(BYTE *)(v8 + v9)); + v12 = v8 + 1; + if ( v12 >= v10 ) + v12 = 0; + v16 = (char)*(BYTE *)(v12 + v9); + v14 = v12 + 1; + v15 = (v13 << 8) | v16; + if ( v14 >= v10 ) + v14 = 0; + v19 = (char)*(BYTE *)(v14 + v9); + v17 = v14 + 1; + v18 = (v15 << 8) | v19; + if ( v17 >= v10 ) + v17 = 0; + v21 = (char)*(BYTE *)(v17 + v9); + v8 = v17 + 1; + v20 = (v18 << 8) | v21; + if ( v8 >= v10 ) + v8 = 0; + *((DWORD *)PArray + v11++) ^= v20; + } while ( v11 < 18 ); + + + + datal = 0 ; + datar = 0 ; + + for (i = 0 ; i < NPASS + 2 ; i += 2) + { + Blowfish_encipher (&datal, &datar) ; + PArray [i] = datal ; + PArray [i + 1] = datar ; + } + + for (i = 0 ; i < 4 ; ++i) + { + for (j = 0 ; j < 256 ; j += 2) + { + Blowfish_encipher (&datal, &datar) ; + SBoxes [i][j] = datal ; + SBoxes [i][j + 1] = datar ; + } + } +} + + // get output length, which must be even MOD 8 +DWORD BlowFish::GetOutputLength (DWORD lInputLong) +{ + DWORD lVal ; + + lVal = lInputLong % 8 ; // find out if uneven number of bytes at the end + if (lVal != 0) + return lInputLong + 8 - lVal ; + else + return lInputLong ; +} + + // Encode pIntput into pOutput. Input length in lSize. Returned value + // is length of output which will be even MOD 8 bytes. Input buffer and + // output buffer can be the same, but be sure buffer length is even MOD 8. +DWORD BlowFish::Encode (BYTE * pInput, BYTE * pOutput, DWORD lSize) +{ + DWORD lCount, lOutSize, lGoodBytes ; + BYTE *pi, *po ; + int i, j ; + int SameDest = (pInput == pOutput ? 1 : 0) ; + + lOutSize = GetOutputLength (lSize) ; + for (lCount = 0 ; lCount < lOutSize ; lCount += 8) + { + if (SameDest) // if encoded data is being written into input buffer + { + if (lCount < lSize - 7) // if not dealing with uneven bytes at end + { + Blowfish_encipher ((DWORD *) pInput, + (DWORD *) (pInput + 4)) ; + } + else // pad end of data with null bytes to complete encryption + { + po = pInput + lSize ; // point at byte past the end of actual data + j = (int) (lOutSize - lSize) ; // number of bytes to set to null + for (i = 0 ; i < j ; i++) + *po++ = 0 ; + Blowfish_encipher ((DWORD *) pInput, + (DWORD *) (pInput + 4)) ; + } + pInput += 8 ; + } + else // output buffer not equal to input buffer, so must copy + { // input to output buffer prior to encrypting + if (lCount < lSize - 7) // if not dealing with uneven bytes at end + { + pi = pInput ; + po = pOutput ; + for (i = 0 ; i < 8 ; i++) +// copy bytes to output + *po++ = *pi++ ; + Blowfish_encipher ((DWORD *) pOutput, // now encrypt them + (DWORD *) (pOutput + 4)) ; + } + else // pad end of data with null bytes to complete encryption + { + lGoodBytes = lSize - lCount ; // number of remaining data bytes + po = pOutput ; + for (i = 0 ; i < (int) lGoodBytes ; i++) + *po++ = *pInput++ ; + for (j = i ; j < 8 ; j++) + *po++ = 0 ; + Blowfish_encipher ((DWORD *) pOutput, + (DWORD *) (pOutput + 4)) ; + } + pInput += 8 ; + pOutput += 8 ; + } + } + return lOutSize ; + } + + // Decode pIntput into pOutput. Input length in lSize. Input buffer and + // output buffer can be the same, but be sure buffer length is even MOD 8. +void BlowFish::Decode (BYTE * pInput, BYTE * pOutput, DWORD lSize) +{ + DWORD lCount ; + BYTE *pi, *po ; + int i ; + int SameDest = (pInput == pOutput ? 1 : 0) ; + + for (lCount = 0 ; lCount < lSize ; lCount += 8) + { + if (SameDest) // if encoded data is being written into input buffer + { + Blowfish_decipher ((DWORD *) pInput, + (DWORD *) (pInput + 4)) ; + pInput += 8 ; + } + else // output buffer not equal to input buffer + { // so copy input to output before decoding + pi = pInput ; + po = pOutput ; + for (i = 0 ; i < 8 ; i++) + *po++ = *pi++ ; + Blowfish_decipher ((DWORD *) pOutput, + (DWORD *) (pOutput + 4)) ; + pInput += 8 ; + pOutput += 8 ; + } + } +} + diff --git a/src/servers/Server_Lobby/blowfish.h b/src/servers/Server_Lobby/blowfish.h new file mode 100644 index 00000000..e05b422b --- /dev/null +++ b/src/servers/Server_Lobby/blowfish.h @@ -0,0 +1,72 @@ +// blowfish.h interface file for blowfish.cpp +// _THE BLOWFISH ENCRYPTION ALGORITHM_ +// by Bruce Schneier +// Revised code--3/20/94 +// Converted to C++ class 5/96, Jim Conger + +#define MAXKEYBYTES 56 // 448 bits max +#define NPASS 16 // SBox passes + +#define DWORD unsigned long +#define WORD unsigned short +#define BYTE unsigned char + +class BlowFish +{ +private: + DWORD * PArray ; + DWORD (* SBoxes)[256]; + void Blowfish_encipher (DWORD *xl, DWORD *xr) ; + void Blowfish_decipher (DWORD *xl, DWORD *xr) ; + +public: + BlowFish () ; + ~BlowFish () ; + void initialize (BYTE key[], int keybytes) ; + DWORD GetOutputLength (DWORD lInputLong) ; + DWORD Encode (BYTE * pInput, BYTE * pOutput, DWORD lSize) ; + void Decode (BYTE * pInput, BYTE * pOutput, DWORD lSize) ; + +} ; + +// choose a byte order for your hardware +#define ORDER_DCBA // chosing Intel in this case + +#ifdef ORDER_DCBA // DCBA - little endian - intel + union aword { + DWORD dword; + BYTE byte [4]; + struct { + unsigned int byte3:8; + unsigned int byte2:8; + unsigned int byte1:8; + unsigned int byte0:8; + } w; + }; +#endif + +#ifdef ORDER_ABCD // ABCD - big endian - motorola + union aword { + DWORD dword; + BYTE byte [4]; + struct { + unsigned int byte0:8; + unsigned int byte1:8; + unsigned int byte2:8; + unsigned int byte3:8; + } w; + }; +#endif + +#ifdef ORDER_BADC // BADC - vax + union aword { + DWORD dword; + BYTE byte [4]; + struct { + unsigned int byte1:8; + unsigned int byte0:8; + unsigned int byte3:8; + unsigned int byte2:8; + } w; +}; +#endif diff --git a/src/servers/Server_Lobby/blowfish.h2 b/src/servers/Server_Lobby/blowfish.h2 new file mode 100644 index 00000000..a6b34893 --- /dev/null +++ b/src/servers/Server_Lobby/blowfish.h2 @@ -0,0 +1,267 @@ +// blowfish.h2 header file containing random number tables + +static DWORD bf_P[NPASS + 2] = { + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b, +}; +static DWORD bf_S[4][256] = { + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6, +}; diff --git a/src/servers/Server_Lobby/client_http.hpp b/src/servers/Server_Lobby/client_http.hpp new file mode 100644 index 00000000..c7b9137b --- /dev/null +++ b/src/servers/Server_Lobby/client_http.hpp @@ -0,0 +1,418 @@ +#ifndef CLIENT_HTTP_HPP +#define CLIENT_HTTP_HPP + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +class case_insensitive_equals { +public: + bool operator()( const std::string &key1, const std::string &key2 ) const { + return boost::algorithm::iequals( key1, key2 ); + } +}; +class case_insensitive_hash { +public: + size_t operator()( const std::string &key ) const { + std::size_t seed = 0; + for( auto &c : key ) + boost::hash_combine( seed, std::tolower( c ) ); + return seed; + } +}; + +namespace SimpleWeb { + template + class Client; + + template + class ClientBase { + public: + virtual ~ClientBase() {} + + class Response { + friend class ClientBase; + friend class Client; + public: + std::string http_version, status_code; + + std::istream content; + + std::unordered_multimap header; + + private: + boost::asio::streambuf content_buffer; + + Response() : content( &content_buffer ) {} + }; + + class Config { + friend class ClientBase; + private: + Config() {} + public: + /// Set timeout on requests in seconds. Default value: 0 (no timeout). + size_t timeout = 0; + /// Set proxy server (server:port) + std::string proxy_server; + }; + + /// Set before calling request + Config config; + + std::shared_ptr request( const std::string& request_type, const std::string& path = "/", boost::string_ref content = "", + const std::map& header = std::map() ) { + auto corrected_path = path; + if( corrected_path == "" ) + corrected_path = "/"; + if( !config.proxy_server.empty() && std::is_same::value ) + corrected_path = "http://" + host + ':' + std::to_string( port ) + corrected_path; + + boost::asio::streambuf write_buffer; + std::ostream write_stream( &write_buffer ); + write_stream << request_type << " " << corrected_path << " HTTP/1.1\r\n"; + write_stream << "Host: " << host << "\r\n"; + for( auto& h : header ) { + write_stream << h.first << ": " << h.second << "\r\n"; + } + if( content.size()>0 ) + write_stream << "Content-Length: " << content.size() << "\r\n"; + write_stream << "\r\n"; + + connect(); + + auto timer = get_timeout_timer(); + boost::asio::async_write( *socket, write_buffer, + [this, &content, timer]( const boost::system::error_code &ec, size_t /*bytes_transferred*/ ) { + if( timer ) + timer->cancel(); + if( !ec ) { + if( !content.empty() ) { + auto timer = get_timeout_timer(); + boost::asio::async_write( *socket, boost::asio::buffer( content.data(), content.size() ), + [this, timer]( const boost::system::error_code &ec, size_t /*bytes_transferred*/ ) { + if( timer ) + timer->cancel(); + if( ec ) { + std::lock_guard lock( socket_mutex ); + this->socket = nullptr; + throw boost::system::system_error( ec ); + } + } ); + } + } + else { + std::lock_guard lock( socket_mutex ); + socket = nullptr; + throw boost::system::system_error( ec ); + } + } ); + io_service.reset(); + io_service.run(); + + return request_read(); + } + + std::shared_ptr request( const std::string& request_type, const std::string& path, std::iostream& content, + const std::map& header = std::map() ) { + auto corrected_path = path; + if( corrected_path == "" ) + corrected_path = "/"; + if( !config.proxy_server.empty() && std::is_same::value ) + corrected_path = "http://" + host + ':' + std::to_string( port ) + corrected_path; + + content.seekp( 0, std::ios::end ); + auto content_length = content.tellp(); + content.seekp( 0, std::ios::beg ); + + boost::asio::streambuf write_buffer; + std::ostream write_stream( &write_buffer ); + write_stream << request_type << " " << corrected_path << " HTTP/1.1\r\n"; + write_stream << "Host: " << host << "\r\n"; + for( auto& h : header ) { + write_stream << h.first << ": " << h.second << "\r\n"; + } + if( content_length>0 ) + write_stream << "Content-Length: " << content_length << "\r\n"; + write_stream << "\r\n"; + if( content_length>0 ) + write_stream << content.rdbuf(); + + connect(); + + auto timer = get_timeout_timer(); + boost::asio::async_write( *socket, write_buffer, + [this, timer]( const boost::system::error_code &ec, size_t /*bytes_transferred*/ ) { + if( timer ) + timer->cancel(); + if( ec ) { + std::lock_guard lock( socket_mutex ); + socket = nullptr; + throw boost::system::system_error( ec ); + } + } ); + io_service.reset(); + io_service.run(); + + return request_read(); + } + + void close() { + std::lock_guard lock( socket_mutex ); + if( socket ) { + boost::system::error_code ec; + socket->lowest_layer().shutdown( boost::asio::ip::tcp::socket::shutdown_both, ec ); + socket->lowest_layer().close(); + } + } + + protected: + boost::asio::io_service io_service; + boost::asio::ip::tcp::resolver resolver; + + std::unique_ptr socket; + std::mutex socket_mutex; + + std::string host; + unsigned short port; + + ClientBase( const std::string& host_port, unsigned short default_port ) : resolver( io_service ) { + auto parsed_host_port = parse_host_port( host_port, default_port ); + host = parsed_host_port.first; + port = parsed_host_port.second; + } + + std::pair parse_host_port( const std::string &host_port, unsigned short default_port ) { + std::pair parsed_host_port; + size_t host_end = host_port.find( ':' ); + if( host_end == std::string::npos ) { + parsed_host_port.first = host_port; + parsed_host_port.second = default_port; + } + else { + parsed_host_port.first = host_port.substr( 0, host_end ); + parsed_host_port.second = static_cast( stoul( host_port.substr( host_end + 1 ) ) ); + } + return parsed_host_port; + } + + virtual void connect() = 0; + + std::shared_ptr get_timeout_timer() { + if( config.timeout == 0 ) + return nullptr; + + auto timer = std::make_shared( io_service ); + timer->expires_from_now( boost::posix_time::seconds( config.timeout ) ); + timer->async_wait( [this]( const boost::system::error_code& ec ) { + if( !ec ) { + close(); + } + } ); + return timer; + } + + void parse_response_header( const std::shared_ptr &response ) const { + std::string line; + getline( response->content, line ); + size_t version_end = line.find( ' ' ); + if( version_end != std::string::npos ) { + if( 5http_version = line.substr( 5, version_end - 5 ); + if( ( version_end + 1 )status_code = line.substr( version_end + 1, line.size() - ( version_end + 1 ) - 1 ); + + getline( response->content, line ); + size_t param_end; + while( ( param_end = line.find( ':' ) ) != std::string::npos ) { + size_t value_start = param_end + 1; + if( ( value_start )header.insert( std::make_pair( line.substr( 0, param_end ), line.substr( value_start, line.size() - value_start - 1 ) ) ); + } + + getline( response->content, line ); + } + } + } + + std::shared_ptr request_read() { + std::shared_ptr response( new Response() ); + + boost::asio::streambuf chunked_streambuf; + + auto timer = get_timeout_timer(); + boost::asio::async_read_until( *socket, response->content_buffer, "\r\n\r\n", + [this, &response, &chunked_streambuf, timer]( const boost::system::error_code& ec, size_t bytes_transferred ) { + if( timer ) + timer->cancel(); + if( !ec ) { + size_t num_additional_bytes = response->content_buffer.size() - bytes_transferred; + + parse_response_header( response ); + + auto header_it = response->header.find( "Content-Length" ); + if( header_it != response->header.end() ) { + auto content_length = stoull( header_it->second ); + if( content_length>num_additional_bytes ) { + auto timer = get_timeout_timer(); + boost::asio::async_read( *socket, response->content_buffer, + boost::asio::transfer_exactly( content_length - num_additional_bytes ), + [this, timer]( const boost::system::error_code& ec, size_t /*bytes_transferred*/ ) { + if( timer ) + timer->cancel(); + if( ec ) { + std::lock_guard lock( socket_mutex ); + this->socket = nullptr; + throw boost::system::system_error( ec ); + } + } ); + } + } + else if( ( header_it = response->header.find( "Transfer-Encoding" ) ) != response->header.end() && header_it->second == "chunked" ) { + request_read_chunked( response, chunked_streambuf ); + } + } + else { + std::lock_guard lock( socket_mutex ); + socket = nullptr; + throw boost::system::system_error( ec ); + } + } ); + io_service.reset(); + io_service.run(); + + return response; + } + + void request_read_chunked( const std::shared_ptr &response, boost::asio::streambuf &streambuf ) { + auto timer = get_timeout_timer(); + boost::asio::async_read_until( *socket, response->content_buffer, "\r\n", + [this, &response, &streambuf, timer]( const boost::system::error_code& ec, size_t bytes_transferred ) { + if( timer ) + timer->cancel(); + if( !ec ) { + std::string line; + getline( response->content, line ); + bytes_transferred -= line.size() + 1; + line.pop_back(); + std::streamsize length = stol( line, 0, 16 ); + + auto num_additional_bytes = static_cast( response->content_buffer.size() - bytes_transferred ); + + auto post_process = [this, &response, &streambuf, length] { + std::ostream stream( &streambuf ); + if( length>0 ) { + std::vector buffer( static_cast( length ) ); + response->content.read( &buffer[0], length ); + stream.write( &buffer[0], length ); + } + + //Remove "\r\n" + response->content.get(); + response->content.get(); + + if( length>0 ) + request_read_chunked( response, streambuf ); + else { + std::ostream response_stream( &response->content_buffer ); + response_stream << stream.rdbuf(); + } + }; + + if( ( 2 + length )>num_additional_bytes ) { + auto timer = get_timeout_timer(); + boost::asio::async_read( *socket, response->content_buffer, + boost::asio::transfer_exactly( 2 + length - num_additional_bytes ), + [this, post_process, timer]( const boost::system::error_code& ec, size_t /*bytes_transferred*/ ) { + if( timer ) + timer->cancel(); + if( !ec ) { + post_process(); + } + else { + std::lock_guard lock( socket_mutex ); + this->socket = nullptr; + throw boost::system::system_error( ec ); + } + } ); + } + else + post_process(); + } + else { + std::lock_guard lock( socket_mutex ); + socket = nullptr; + throw boost::system::system_error( ec ); + } + } ); + } + }; + + template + class Client : public ClientBase {}; + + typedef boost::asio::ip::tcp::socket HTTP; + + template<> + class Client : public ClientBase { + public: + Client( const std::string& server_port_path ) : ClientBase::ClientBase( server_port_path, 80 ) {} + + protected: + void connect() { + if( !socket || !socket->is_open() ) { + std::unique_ptr query; + if( config.proxy_server.empty() ) + query = std::unique_ptr( new boost::asio::ip::tcp::resolver::query( host, std::to_string( port ) ) ); + else { + auto proxy_host_port = parse_host_port( config.proxy_server, 8080 ); + query = std::unique_ptr( new boost::asio::ip::tcp::resolver::query( proxy_host_port.first, std::to_string( proxy_host_port.second ) ) ); + } + resolver.async_resolve( *query, [this]( const boost::system::error_code &ec, + boost::asio::ip::tcp::resolver::iterator it ) { + if( !ec ) { + { + std::lock_guard lock( socket_mutex ); + socket = std::unique_ptr( new HTTP( io_service ) ); + } + + auto timer = get_timeout_timer(); + boost::asio::async_connect( *socket, it, [this, timer] + ( const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator /*it*/ ) { + if( timer ) + timer->cancel(); + if( !ec ) { + boost::asio::ip::tcp::no_delay option( true ); + this->socket->set_option( option ); + } + else { + std::lock_guard lock( socket_mutex ); + this->socket = nullptr; + throw boost::system::system_error( ec ); + } + } ); + } + else { + std::lock_guard lock( socket_mutex ); + socket = nullptr; + throw boost::system::system_error( ec ); + } + } ); + io_service.reset(); + io_service.run(); + } + } + }; +} + +#endif /* CLIENT_HTTP_HPP */ diff --git a/src/servers/Server_Lobby/mainLobbyServer.cpp b/src/servers/Server_Lobby/mainLobbyServer.cpp new file mode 100644 index 00000000..5627449d --- /dev/null +++ b/src/servers/Server_Lobby/mainLobbyServer.cpp @@ -0,0 +1,12 @@ +#include "ServerLobby.h" + +Core::ServerLobby g_serverLobby( "config/settings_lobby.xml" ); + +int main( int argc, char* argv[] ) +{ + + g_serverLobby.run( argc, argv ); + + return 0; +} + diff --git a/src/servers/Server_REST/CMakeLists.txt b/src/servers/Server_REST/CMakeLists.txt new file mode 100644 index 00000000..80e8d840 --- /dev/null +++ b/src/servers/Server_REST/CMakeLists.txt @@ -0,0 +1,86 @@ +cmake_minimum_required(VERSION 2.6) +cmake_policy(SET CMP0015 NEW) +project(Sapphire) + +include_directories("../../libraries/external/ChaiScript-6.0.0/include/") +include_directories("../../libraries/sapphire/datReader/") +include_directories("../") + +file(GLOB SERVER_PUBLIC_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*") +file(GLOB SERVER_SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}*.c*") + +set(SERVER_COMMON_DIR ../Server_Common) +set(Boost_USE_STATIC_LIBS ON) + +if(UNIX) + include_directories("/usr/include/mysql/") + message(STATUS "Setting GCC flags") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -m32") + + find_package(Boost ${SAPPHIRE_BOOST_VER} COMPONENTS log log_setup thread date_time filesystem system) + if(Boost_FOUND) + set(BOOST_LIBRARY_DIR ${Boost_LIBRARY_DIR}) + else() + if (EXISTS /opt/build_libs/${SAPPHIRE_BOOST_FOLDER_NAME}) + set(Boost_INCLUDE_DIR /opt/build_libs/${SAPPHIRE_BOOST_FOLDER_NAME}) + set(BOOST_LIBRARYDIR /opt/build_libs/${SAPPHIRE_BOOST_FOLDER_NAME}/stage/lib) + find_package(Boost ${SAPPHIRE_BOOST_VER} COMPONENTS log log_setup thread date_time filesystem system) + else() + message(FATAL_ERROR "Unable to find boost ${SAPPHIRE_BOOST_VER} package!") + endif() + endif() +else() + add_definitions(-D_WIN32_WINNT=0x601) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) + include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/MySQL/") + message(STATUS "Setting MSVC flags") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHc") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") + + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/${SAPPHIRE_BOOST_FOLDER_NAME}) + message(STATUS "Using boost in /src/lib") + set(Boost_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/${SAPPHIRE_BOOST_FOLDER_NAME}) + set(BOOST_LIBRARYDIR ${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/${SAPPHIRE_BOOST_FOLDER_NAME}/lib32-msvc-14.0) + else() + find_package(Boost ${SAPPHIRE_BOOST_VER} COMPONENTS log log_setup thread date_time filesystem system) + if(Boost_FOUND) + set(BOOST_LIBRARY_DIR ${Boost_LIBRARY_DIR}) + elseif ((EXISTS $ENV{BOOST_ROOT_DIR}) AND (EXISTS $ENV{BOOST_LIB_DIR})) + set(Boost_INCLUDE_DIR $ENV{BOOST_ROOT_DIR}) + set(BOOST_LIBRARYDIR $ENV{BOOST_LIB_DIR}) + else() + message(FATAL_ERROR "SapphireError: Unable to find boost ${SAPPHIRE_BOOST_VER} package and environment variables BOOST_ROOT_DIR and BOOST_LIB_DIR not set!") + endif() + endif() +endif() + + +include_directories(${Boost_INCLUDE_DIR}) + +link_directories(${BOOST_LIBRARYDIR}) +link_directories(${SERVER_COMMON_DIR}) +link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/sapphire/datReader) +link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/MySQL) +link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/zlib) + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/") +add_executable(server_rest ${SERVER_PUBLIC_INCLUDE_FILES} ${SERVER_SOURCE_FILES}) +add_dependencies(server_rest Common xivdat) + +set_target_properties(server_rest PROPERTIES + CXX_STANDARD 14 + CXX_STANDARD_REQUIRED ON + CXX_EXTENSIONS ON + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" + RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" + RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" +) + +if (UNIX) + target_link_libraries (server_rest Common xivdat pthread mysqlclient dl z) +else() + target_link_libraries (server_rest Common xivdat libmysql zlib1) +endif() + +target_link_libraries( server_rest ${Boost_LIBRARIES} ${Boost_LIBRARIES} ) diff --git a/src/servers/Server_REST/Forwards.h b/src/servers/Server_REST/Forwards.h new file mode 100644 index 00000000..56d3b92d --- /dev/null +++ b/src/servers/Server_REST/Forwards.h @@ -0,0 +1,102 @@ +#ifndef _FORWARDS_H +#define _FORWARDS_H + +#include + +namespace Core +{ + + class Cell; + class Zone; + class Item; + class ItemContainer; + class Inventory; + class Session; + class XMLConfig; + class ZonePosition; + + typedef boost::shared_ptr ZonePtr; + typedef boost::shared_ptr ItemPtr; + typedef boost::shared_ptr ItemContainerPtr; + typedef boost::shared_ptr InventoryPtr; + typedef boost::shared_ptr SessionPtr; + typedef boost::shared_ptr XMLConfigPtr; + typedef boost::shared_ptr ZonePositionPtr; + + namespace StatusEffect + { + class StatusEffect; + class StatusEffectContainer; + + typedef boost::shared_ptr StatusEffectPtr; + typedef boost::shared_ptr StatusEffectContainerPtr; + } + + namespace Entity + { + class Actor; + class Player; + class BattleNpc; + + typedef boost::shared_ptr ActorPtr; + typedef boost::shared_ptr PlayerPtr; + typedef boost::shared_ptr BattleNpcPtr; + } + + namespace Event + { + class Event; + + typedef boost::shared_ptr EventPtr; + } + + namespace Action + { + class Action; + class ActionTeleport; + class EventAction; + + typedef boost::shared_ptr ActionPtr; + typedef boost::shared_ptr ActionTeleportPtr; + typedef boost::shared_ptr EventActionPtr; + } + + + namespace Network + { + class Hive; + class Acceptor; + class Connection; + class WorldConnection; + class SessionConnection; + class ZoneConnection; + + typedef boost::shared_ptr HivePtr; + typedef boost::shared_ptr AcceptorPtr; + typedef boost::shared_ptr ConnectionPtr; + typedef boost::shared_ptr WorldConnectionPtr; + typedef boost::shared_ptr ZoneConnectionPtr; + typedef boost::shared_ptr SessionConnectionPtr; + + namespace Packets + { + class GamePacket; + + + typedef boost::shared_ptr GamePacketPtr; + + + } + } + + namespace Scripting + { + typedef std::function< void( Entity::Player&, uint32_t, uint16_t, uint16_t, uint16_t, uint16_t ) > EventReturnCallback; + } + + typedef std::function< void( Entity::Player&, uint32_t, uint64_t ) > ActionCallback; + +} + + +#endif diff --git a/src/servers/Server_REST/LoginSession.cpp b/src/servers/Server_REST/LoginSession.cpp new file mode 100644 index 00000000..d403ed37 --- /dev/null +++ b/src/servers/Server_REST/LoginSession.cpp @@ -0,0 +1,12 @@ +#include "LoginSession.h" +namespace Core { + LoginSession::LoginSession(void) { + //setSocket(NULL); + + } + + LoginSession::~LoginSession(void) { + + } +} + diff --git a/src/servers/Server_REST/LoginSession.h b/src/servers/Server_REST/LoginSession.h new file mode 100644 index 00000000..b74fd8fe --- /dev/null +++ b/src/servers/Server_REST/LoginSession.h @@ -0,0 +1,59 @@ +#pragma once + +#ifndef _CLoginSession_H_ +#define _CLoginSession_H_ + +#include +#include +#include + +namespace Core { + + class LoginSession { + + private: + uint32_t m_IP; + uint32_t m_accountID; + + uint8_t m_sessionId[56]; + + public: + + std::string newCharName; + + LoginSession(void); + ~LoginSession(void); + + uint32_t getIP() { + return m_IP; + } + + void setSessionId(uint8_t * sessionId) { + memcpy(m_sessionId, sessionId, 56); + } + + void setIP(uint32_t iP) { + m_IP = iP; + } + + uint32_t getAccountID() { + return m_accountID; + } + + void setAccountID(uint32_t iD) { + m_accountID = iD; + } + + /*INLINE CLobbySocket* getSocket() { + return m_pGS; + } + + INLINE void setSocket(CLobbySocket * pS) { + m_pGS = pS; + }*/ + + }; + +} + +#endif diff --git a/src/servers/Server_REST/PlayerMinimal.cpp b/src/servers/Server_REST/PlayerMinimal.cpp new file mode 100644 index 00000000..356057a4 --- /dev/null +++ b/src/servers/Server_REST/PlayerMinimal.cpp @@ -0,0 +1,423 @@ +#include "PlayerMinimal.h" + +//#include "Core/Server_Game/CServerGame.h" +#include +#include +#include +#include + + +extern Core::Db::Database g_database; +extern Core::Data::ExdData g_exdData; + +namespace Core { + + using namespace Common; + + // player constructor + PlayerMinimal::PlayerMinimal( void ) : m_iD( 0 ) + { + + + } + + // deconstructor + PlayerMinimal::~PlayerMinimal( void ) + { + + } + + // load player from the db + // TODO change void CPlayer::load to bool, we want to know if something went wrong + void PlayerMinimal::load( uint32_t charId ) + { + + boost::shared_ptr pQR = g_database.query( "SELECT c.Name, " + " c.Customize, " + " cpc.BirthDay, " + " cpc.BirthMonth, " + " cpc.GuardianDeity, " + " cpc.Class, " + " c.ModelEquip, " + " c.ContentId, " + " c.PrimaryTerritoryId " + " FROM charabase AS c " + " INNER JOIN charadetail AS cpc " + " ON cpc.CharacterId = c.CharacterId " + " WHERE c.CharacterId = " + std::to_string( charId ) + ";" ); + if( !pQR ) + { + return; + } + + m_iD = charId; + + Db::Field *field = pQR->fetch(); + + memset( m_name, 0, 32 ); + + strcpy( m_name, field[0].getString() ); + + field[1].getBinary( (char*)m_look, 26 ); + + field[6].getBinary( (char*)m_modelEquip, 40 ); + + for( int i = 0; i < 26; i++ ) + { + m_lookMap[i] = m_look[i]; + } + + setBirthDay( field[2].getInt8(), field[3].getInt8() ); + m_guardianDeity = field[4].getInt8(); + m_class = field[5].getInt8(); + m_contentId = field[7].getUInt64(); + m_zoneId = field[8].getUInt16(); + + auto pQR2 = g_database.query( "SELECT * FROM characlass WHERE CharacterId = " + std::to_string( charId ) + ";" ); + + Db::Field* field2 = pQR2->fetch(); + + for( uint8_t i = 0; i < 25; i++ ) + { + uint8_t index = i * 2; + m_classMap[i] = field2[index].getUInt8(); + //m_expArray[i] = + } + } + + + std::string PlayerMinimal::getLookString() + { + + auto it = m_lookMap.begin(); + + std::string lookString; + + for( ; it != m_lookMap.end(); ++it ) + { + + std::string s = std::to_string( it->second ); + + lookString += "\"" + s + "\""; + if( it != m_lookMap.end() ) + { + lookString += ","; + } + } + + return lookString.substr( 0, lookString.size() - 1 ); + } + + std::string PlayerMinimal::getModelString() + { + std::string modelString = "\"" + + std::to_string( m_modelEquip[2] ) + "\",\"" + + std::to_string( m_modelEquip[3] ) + "\",\"" + + std::to_string( m_modelEquip[4] ) + "\",\"" + + std::to_string( m_modelEquip[6] ) + "\",\"" + + std::to_string( m_modelEquip[7] ) + "\",\"5\",\"6\",\"7\",\"8\",\"9\""; + return modelString; + } + + std::string PlayerMinimal::getInfoJson() + { + std::string charDetails = "{\"content\":[\"" + std::string( getName() ) + "\"," + + "[" + getClassString() + "]," + + "\"0\",\"0\",\"0\",\"" + std::to_string( getBirthMonth() ) + "\",\"" + std::to_string( getBirthDay() ) + "\",\"" + std::to_string( getGuardianDeity() ) + "\",\"" + std::to_string( m_class ) + "\",\"0\",\"" + std::to_string( getZoneId() ) + "\"," + + "[" + getLookString() + "]," + + "\"0\",\"0\"," + + "[" + getModelString() + "]," + + "\"1\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"]," + + "\"classname\":\"ClientSelectData\",\"classid\":116}"; + return charDetails; + } + + std::string PlayerMinimal::getClassString() + { + + std::map::iterator it; + + it = m_classMap.begin(); + + std::string classString; + + for( ; it != m_classMap.end(); ++it ) + { + + std::string s = std::to_string( it->second ); + + classString += "\"" + s + "\""; + if( it != m_classMap.end() ) + { + classString += ","; + } + } + + return classString.substr( 0, classString.size() - 1 ); + } + + void PlayerMinimal::saveAsNew() + { + + char customize[32]; + char howTo[32]; + memset( howTo, 0, 32 ); + + char aetherytes[12]; + memset( aetherytes, 0, 12 ); + + char discovery[411]; + memset( discovery, 0, 411 ); + + char questComplete[200]; + memset( questComplete, 0, 200 ); + + char unlocks[64]; + memset( unlocks, 0, 64 ); + + int16_t questTracking[5] = { -1, -1, -1, -1, -1 }; + + uint16_t size = static_cast< uint16_t >( m_lookMap.size() ); + + for( int i = 0; i < m_lookMap.size(); i++ ) + { + customize[i] = m_lookMap[i]; + } + + uint32_t equipModel[10]; + memset( equipModel, 0, 40 ); + + uint32_t startZone; + float x, y, z, o; + int startTown = 0; + + switch( m_class ) + { + case Core::Common::ClassJob::CLASS_CONJURER: + case Core::Common::ClassJob::CLASS_LANCER: + case Core::Common::ClassJob::CLASS_ARCHER: + x = 127.0f; + y = -13.0f; + z = 147.0f; + o = -2.1f; + startZone = 183; + startTown = 2; + break; + + case Core::Common::ClassJob::CLASS_MARAUDER: + case Core::Common::ClassJob::CLASS_ARCANIST: + x = -53.0f; + y = 18.0f; + z = 0.0f; + o = 1.5f; + startTown = 1; + startZone = 181; + break; + + case Core::Common::ClassJob::CLASS_THAUMATURGE: + case Core::Common::ClassJob::CLASS_PUGILIST: + case Core::Common::ClassJob::CLASS_GLADIATOR: + x = 42.0f; + y = 4.0f; + z = -157.6f; + o = -0.3f; + startTown = 3; + startZone = 182; + break; + } + + g_database.execute( "INSERT INTO charabase " + "(Hp, " + " Mp, " + " CharacterId, " + " ContentId, " + " Customize, " + " Name, " + " Voice, " + " FirstLogin, " + " IsNewGame, " + " PrimaryTerritoryId, " + " Pos_0_0, " + " Pos_0_1, " + " Pos_0_2, " + " Pos_0_3, " + " AccountId, " + " ModelEquip, " + " IsNewAdventurer, " + " UPDATE_DATE ) " + " VALUES (100, 100, " + std::to_string( m_iD ) + ", " + std::to_string( m_contentId ) + ", " + + " UNHEX('" + std::string( Util::binaryToHexString( (uint8_t*)customize, size ) ) + "'), " + + "'" + std::string( m_name ) + "', " + std::to_string( m_voice ) + ", 1, 1, " + + std::to_string( startZone ) + ", " + std::to_string( x ) + ", " + + std::to_string( y ) + ", " + std::to_string( z ) + ", " + std::to_string( o ) + ", " + + std::to_string( m_accountId ) + ", UNHEX('" + std::string( Util::binaryToHexString( (uint8_t*)equipModel, 40 ) ) + "'), 1, NOW());" ); + + g_database.execute( "INSERT INTO charadetail " + "(CharacterId, " + " GuardianDeity, " + " Birthday, " + " BirthMonth, " + " Class, " + " CreateUnixTime, " + " IsActive, " + " Status, " + " FirstClass, " + " HomePoint, " + " StartTown, " + " Discovery, " + " HowTo, " + " QuestCompleteFlags, " + " unlocks, " + " QuestTracking, " + " Aetheryte, " + " UPDATE_DATE ) " + " VALUES (" + std::to_string( m_iD ) + ", " + + std::to_string( m_guardianDeity ) + ", " + + std::to_string( m_birthDay ) + ", " + + std::to_string( m_birthMonth ) + ", " + + std::to_string( m_class ) + ", UNIX_TIMESTAMP(NOW()), 1, 1, " + + std::to_string( m_class ) + ", 2, " + + std::to_string( startTown ) + ", " + + "UNHEX('" + std::string( Util::binaryToHexString( (uint8_t*)discovery, 411 ) ) + "'), " + + "UNHEX('" + std::string( Util::binaryToHexString( (uint8_t*)howTo, 32 ) ) + "'), " + + "UNHEX('" + std::string( Util::binaryToHexString( (uint8_t*)questComplete, 200 ) ) + "'), " + + "UNHEX('" + std::string( Util::binaryToHexString( (uint8_t*)unlocks, 64 ) ) + "'), " + + "UNHEX('" + std::string( Util::binaryToHexString( (uint8_t*)questTracking, 10 ) ) + "'), " + + "UNHEX('" + std::string( Util::binaryToHexString( (uint8_t*)aetherytes, 12 ) ) + "'), NOW());" ); + + + g_database.execute( "INSERT INTO characlass (CharacterId, Lv_" + std::to_string( g_exdData.m_classJobInfoMap[m_class].exp_idx ) + ", UPDATE_DATE ) " + " VALUES (" + std::to_string( m_iD ) + ", 1, NOW());" ); + + g_database.execute( "INSERT INTO charaquest (CharacterId, UPDATE_DATE ) " + " VALUES (" + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charainfosearch (CharacterId, UPDATE_DATE ) " + " VALUES (" + std::to_string( m_iD ) + ", NOW());" ); + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // SET UP INVENTORIES + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::Bag0 ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::Bag1 ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::Bag2 ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::Bag3 ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::ArmoryOff ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::ArmoryHead ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::ArmoryBody ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::ArmoryHand ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::ArmoryWaist ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::ArmoryLegs ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::ArmoryFeet ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::ArmotyNeck ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::ArmoryEar ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE )" + "VALUES ( " + std::to_string( InventoryType::ArmoryWrist ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::ArmoryRing ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::ArmoryMain ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::Currency ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + g_database.execute( "INSERT INTO charaiteminventory (storageId, CharacterId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::Crystal ) + ", " + std::to_string( m_iD ) + ", NOW());" ); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // SETUP EQUIPMENT / STARTING GEAR + auto classJobInfo = g_exdData.m_classJobInfoMap[m_class]; + uint32_t weaponId = classJobInfo.start_weapon_id; + uint64_t uniqueId = g_database.getNextUId(); + + uint8_t race = customize[CharaLook::Race]; + uint8_t gender = customize[CharaLook::Gender]; + + auto raceInfo = g_exdData.getRaceInfo( race ); + + int32_t body; + int32_t hands; + int32_t legs; + int32_t feet; + uint64_t bodyUid = g_database.getNextUId(); + uint64_t handsUid = g_database.getNextUId(); + uint64_t legsUid = g_database.getNextUId(); + uint64_t feetUid = g_database.getNextUId(); + + if( gender == 0 ) + { + body = raceInfo->male_body; + hands = raceInfo->male_hands; + legs = raceInfo->male_legs; + feet = raceInfo->male_feet; + } + else + { + body = raceInfo->female_body; + hands = raceInfo->female_hands; + legs = raceInfo->female_legs; + feet = raceInfo->female_feet; + } + + g_database.execute( "INSERT INTO charaglobalitem (CharacterId, ItemId, catalogId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( m_iD ) + ", " + std::to_string( uniqueId ) + ", " + + std::to_string( weaponId ) + ", NOW());" ); + g_database.execute( "INSERT INTO charaglobalitem (CharacterId, ItemId, catalogId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( m_iD ) + ", " + std::to_string( bodyUid ) + ", " + + std::to_string( body ) + ", NOW());" ); + g_database.execute( "INSERT INTO charaglobalitem (CharacterId, ItemId, catalogId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( m_iD ) + ", " + std::to_string( handsUid ) + ", " + + std::to_string( hands ) + ", NOW());" ); + g_database.execute( "INSERT INTO charaglobalitem (CharacterId, ItemId, catalogId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( m_iD ) + ", " + std::to_string( legsUid ) + ", " + + std::to_string( legs ) + ", NOW());" ); + g_database.execute( "INSERT INTO charaglobalitem (CharacterId, ItemId, catalogId, UPDATE_DATE ) " + "VALUES ( " + std::to_string( m_iD ) + ", " + std::to_string( feetUid ) + ", " + + std::to_string( feet ) + ", NOW());" ); + g_database.execute( "INSERT INTO charaitemgearset (storageId, CharacterId, " + "container_" + std::to_string( EquipSlot::MainHand ) + ", " + "container_" + std::to_string( EquipSlot::Body ) + ", " + "container_" + std::to_string( EquipSlot::Hands ) + ", " + "container_" + std::to_string( EquipSlot::Legs ) + ", " + "container_" + std::to_string( EquipSlot::Feet ) + ", " + "UPDATE_DATE ) " + "VALUES ( " + std::to_string( InventoryType::GearSet0 ) + ", " + std::to_string( m_iD ) + ", " + + std::to_string( uniqueId ) + ", " + + std::to_string( bodyUid ) + ", " + + std::to_string( handsUid ) + ", " + + std::to_string( legsUid ) + ", " + + std::to_string( feetUid ) + ", " + + "NOW());" ); + + + + } +} diff --git a/src/servers/Server_REST/PlayerMinimal.h b/src/servers/Server_REST/PlayerMinimal.h new file mode 100644 index 00000000..af195966 --- /dev/null +++ b/src/servers/Server_REST/PlayerMinimal.h @@ -0,0 +1,171 @@ +#ifndef _PLAYERMINIMAL_H +#define _PLAYERMINIMAL_H + +#include +#include +#include +namespace Core { + + + class PlayerMinimal + { + public: + PlayerMinimal( void ); + ~PlayerMinimal( void ); + + // write player to the database + void write(); + + // load player from db, by id + void load( uint32_t charId ); + + void saveAsNew(); + + std::string getLookString(); + + std::string getInfoJson(); + + std::string getModelString(); + + std::string getClassString(); + + // return the id of the actor + uint32_t getId() + { + return m_iD; + } + + void setId( uint32_t id ) + { + m_iD = id; + } + + void setContentId( uint64_t id ) + { + m_contentId = id; + } + + uint64_t getContentId() + { + return m_contentId; + } + + + uint32_t getAccountId() + { + return m_accountId; + } + + void setAccountId( uint32_t accountId ) + { + m_accountId = accountId; + } + + // return the actors name + char * getName() + { + return m_name; + } + + void setLook( uint8_t index, uint32_t value ) + { + m_lookMap[index] = value; + } + + + // return the actors name + void setName( const char* name ) + { + strcpy( m_name, name ); + } + + void setClass( uint8_t classId ) + { + m_class = classId; + } + + uint8_t getClass() + { + return m_class; + } + + uint8_t getGuardianDeity() + { + return m_guardianDeity; + } + + void setGuardianDeity( uint8_t guardianId ) + { + m_guardianDeity = guardianId; + } + + void setBirthDay( uint8_t day, uint8_t month ) + { + m_birthDay = day; + m_birthMonth = month; + } + + uint8_t getBirthDay() + { + return m_birthDay; + } + + uint8_t getBirthMonth() + { + return m_birthMonth; + } + + uint8_t getVoice() + { + return m_birthMonth; + } + + void setVoice( uint8_t voice ) + { + m_voice = voice; + } + + uint32_t getZoneId() + { + return m_zoneId; + } + + uint32_t getTribe() + { + return m_tribe; + } + + void setTribe( uint8_t tribe ) + { + m_tribe = tribe; + } + + uint32_t m_modelEquip[10]; + + private: + uint32_t m_accountId; + uint32_t m_iD; + uint64_t m_contentId; + + uint8_t m_guardianDeity; + uint8_t m_birthMonth; + uint8_t m_birthDay; + uint8_t m_class; + + uint8_t m_voice; + + uint8_t m_tribe; + + uint16_t m_zoneId; + + std::map m_lookMap; + std::map m_classMap; + uint8_t m_look[26]; + + char m_name[34]; + + + }; + +} +#endif diff --git a/src/servers/Server_REST/SapphireAPI.cpp b/src/servers/Server_REST/SapphireAPI.cpp new file mode 100644 index 00000000..764ef7b1 --- /dev/null +++ b/src/servers/Server_REST/SapphireAPI.cpp @@ -0,0 +1,294 @@ +#include "SapphireAPI.h" +#include +#include "Session.h" +#include "PlayerMinimal.h" +#include +#include + +#define BOOST_SPIRIT_THREADSAFE +#include +#include +#include +#include +#include +#include + +extern Core::Db::Database g_database; + +Core::Network::SapphireAPI::SapphireAPI() +{ + +} + +Core::Network::SapphireAPI::~SapphireAPI() +{ + +} + +bool Core::Network::SapphireAPI::login( const std::string& username, const std::string& pass, std::string& sId ) +{ + std::string query = "SELECT account_id FROM accounts WHERE account_name = '" + username + "' AND account_pass = '" + pass + "';"; + + // check if a user with that name / password exists + auto pQR = g_database.query( query ); + // found? + if( !pQR ) + return false; + + // user found, proceed + int accountId = pQR->fetch()[0].getUInt32(); + + // session id string generation + srand( ( unsigned int )time( NULL ) + 42 ); + uint8_t sid[58]; + + for( int i = 0; i < 56; i += 4 ) + { + short number = 0x1111 + rand() % 0xFFFF; + sprintf( ( char* )sid + i, "%04hx", number ); + } + + // create session for the new sessionid and store to sessionlist + auto pSession = boost::make_shared< Session >(); + pSession->setAccountId( accountId ); + pSession->setSessionId( sid ); + + //auto ip2 = boost::asio::ip::address::from_string( request->remote_endpoint_address ); + + //pSession->setIP( ip2.to_v4().to_ulong() ); + + std::stringstream ss; + + for( size_t i = 0; i < 56; i++ ) + { + ss << std::hex << sid[i]; + } + m_sessionMap[ ss.str() ] = pSession; + sId = ss.str(); + + return true; + +} + +bool Core::Network::SapphireAPI::createAccount( const std::string& username, const std::string& pass, std::string& sId ) +{ + // get account from login name + auto pQR = g_database.query( "SELECT account_id FROM accounts WHERE account_name = '" + username + "';" ); + + // if account was found + if( pQR ) + return false; + + // we are clear and can create a new account + // get the next free account id + pQR = g_database.query( "SELECT MAX(account_id) FROM accounts;" ); + int accountId = pQR->fetch()[0].getUInt32() + 1; + + // store the account to the db + g_database.execute( "INSERT INTO accounts (account_Id, account_name, account_pass, account_created) VALUE(%i, '%s', '%s', %i);", + accountId, + username.c_str(), + pass.c_str(), + time( NULL ) ); + + + if( !login( username, pass, sId ) ) + return false; + + return true; + +} + +int Core::Network::SapphireAPI::createCharacter( const int& accountId, const std::string& name, const std::string& infoJson ) +{ + Core::PlayerMinimal newPlayer; + + newPlayer.setAccountId( accountId ); + newPlayer.setId( getNextCharId() ); + newPlayer.setContentId( getNextContentId() ); + newPlayer.setName( name.c_str() ); + + boost::property_tree::ptree pt; + + std::stringstream ss; + ss << infoJson; + + boost::property_tree::read_json( ss, pt ); + + const char *ptr = infoJson.c_str() + 50; + + std::string lookPart( ptr ); + int pos = lookPart.find_first_of( "]" ); + if( pos != std::string::npos ) + { + lookPart = lookPart.substr( 0, pos + 1 ); + } + + std::vector tmpVector; + std::vector tmpVector2; + + BOOST_FOREACH( boost::property_tree::ptree::value_type &v, pt.get_child( "content" ) ) + { + boost::property_tree::ptree subtree1 = v.second; + BOOST_FOREACH( boost::property_tree::ptree::value_type &vs, subtree1 ) + { + boost::property_tree::ptree subtree2 = vs.second; + //std::cout << vs.second.data(); + tmpVector.push_back( std::stoi( vs.second.data() ) ); + } + if( !v.second.data().empty() ) + tmpVector2.push_back( std::stoi( v.second.data() ) ); + } + std::vector::iterator it = tmpVector.begin(); + for( int i = 0; it != tmpVector.end(); ++it, i++ ) + { + newPlayer.setLook( i, *it ); + } + + std::string rest = infoJson.substr( pos + 53 ); + + newPlayer.setVoice( tmpVector2.at( 0 ) ); + newPlayer.setGuardianDeity( tmpVector2.at( 1 ) ); + newPlayer.setBirthDay( tmpVector2.at( 3 ), tmpVector2.at( 2 ) ); + newPlayer.setClass( tmpVector2.at( 4 ) ); + newPlayer.setTribe( tmpVector2.at( 5 ) ); + + newPlayer.saveAsNew(); + + return newPlayer.getAccountId(); +} + +void Core::Network::SapphireAPI::deleteCharacter( std::string name, uint32_t accountId ) +{ + PlayerMinimal deletePlayer; + auto charList = getCharList( accountId ); + for( uint32_t i = 0; i < charList.size(); i++ ) + { + PlayerMinimal tmpPlayer = charList.at( i ); + + if( tmpPlayer.getName() == name ) + { + deletePlayer = tmpPlayer; + break; + } + } + + int id = deletePlayer.getId(); + + g_database.execute( "DELETE FROM charabase WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); + g_database.execute( "DELETE FROM characlass WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); + g_database.execute( "DELETE FROM charadetail WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); + g_database.execute( "DELETE FROM charaglobalitem WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); + g_database.execute( "DELETE FROM charainfoblacklist WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); + g_database.execute( "DELETE FROM charainfofriendlist WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); + g_database.execute( "DELETE FROM charainfolinkshell WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); + g_database.execute( "DELETE FROM charainfosearch WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); + g_database.execute( "DELETE FROM charaitemcrystal WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); + g_database.execute( "DELETE FROM charaiteminventory WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); + g_database.execute( "DELETE FROM charaitemgearset WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); + g_database.execute( "DELETE FROM charaquest WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); +} + +std::vector Core::Network::SapphireAPI::getCharList( uint32_t accountId ) +{ + + std::vector charList; + + boost::shared_ptr pQR = g_database.query( "SELECT CharacterId, ContentId FROM charabase WHERE AccountId = " + std::to_string( accountId ) + ";" ); + + if( !pQR ) + { + // no chars found for the account + return charList; + } + + do + { + Core::PlayerMinimal player; + + Core::Db::Field *field = pQR->fetch(); + + uint32_t charId = field[0].getInt32(); + + player.load( charId ); + + charList.push_back( player ); + + } while( pQR->nextRow() ); + + return charList; +} + +bool Core::Network::SapphireAPI::checkNameTaken( std::string name ) +{ + std::string query = "SELECT * FROM charabase WHERE Name = '" + name + "';"; + + auto pQR = g_database.query( query ); + + if( !pQR ) + return false; + else + return true; +} + +uint32_t Core::Network::SapphireAPI::getNextCharId() +{ + int charId = 0; + + boost::shared_ptr pQR = g_database.query( "SELECT MAX(CharacterId) FROM charabase" ); + + if( !pQR ) + { + return 0x00200001; + } + + charId = pQR->fetch()[0].getUInt32() + 1; + if( charId < 0x00200001 ) + { + return 0x00200001; + } + + return charId; +} + +uint64_t Core::Network::SapphireAPI::getNextContentId() +{ + uint64_t contentId = 0; + + boost::shared_ptr pQR = g_database.query( "SELECT MAX(ContentId) FROM charabase" ); + + if( !pQR ) + { + return 0x0040000001000001; + } + + contentId = pQR->fetch()[0].getUInt64() + 1; + if( contentId < 0x0040000001000001 ) + { + return 0x0040000001000001; + } + + + return contentId; +} + +int Core::Network::SapphireAPI::checkSession( const std::string& sId ) +{ + auto it = m_sessionMap.find( sId ); + + if( it == m_sessionMap.end() ) + return -1; + + return it->second->getAccountId(); +} + + +bool Core::Network::SapphireAPI::removeSession( const std::string& sId ) +{ + auto it = m_sessionMap.find( sId ); + + if( it != m_sessionMap.end() ) + m_sessionMap.erase( sId ); + + return true; +} \ No newline at end of file diff --git a/src/servers/Server_REST/SapphireAPI.h b/src/servers/Server_REST/SapphireAPI.h new file mode 100644 index 00000000..abb48f72 --- /dev/null +++ b/src/servers/Server_REST/SapphireAPI.h @@ -0,0 +1,52 @@ +#ifndef _SAPPHIREAPI_H_ +#define _SAPPHIREAPI_H_ + +#include +#include +#include +#include + +#include "PlayerMinimal.h" + +namespace Core +{ + class Session; + + namespace Network + { + + class SapphireAPI + { + public: + SapphireAPI(); + ~SapphireAPI(); + + typedef std::map< std::string, boost::shared_ptr< Session > > SessionMap; + + bool login( const std::string& username, const std::string& pass, std::string& sId ); + + bool createAccount( const std::string& username, const std::string& pass, std::string& sId ); + + int createCharacter( const int& accountId, const std::string& name, const std::string& infoJson ); + + void deleteCharacter( std::string name, uint32_t accountId ); + + std::vector getCharList( uint32_t accountId ); + + bool checkNameTaken( std::string name ); + + uint32_t getNextCharId(); + + uint64_t getNextContentId(); + + int checkSession( const std::string& sId ); + + bool removeSession( const std::string& sId ); + + SessionMap m_sessionMap; + + }; + } +} + +#endif \ No newline at end of file diff --git a/src/servers/Server_REST/Session.cpp b/src/servers/Server_REST/Session.cpp new file mode 100644 index 00000000..6cd54ff3 --- /dev/null +++ b/src/servers/Server_REST/Session.cpp @@ -0,0 +1,37 @@ +#include "Session.h" +namespace Core { + Session::Session( void ) + { + + } + + Session::~Session( void ) + { + + } + + uint32_t Session::getIp() const + { + return m_ip; + } + + void Session::setSessionId( uint8_t * sessionId ) + { + memcpy( m_sessionId, sessionId, 56 ); + } + + void Session::setIp( uint32_t ip ) + { + m_ip = ip; + } + + uint32_t Session::getAccountId() const + { + return m_accountId; + } + + void Session::setAccountId( uint32_t id ) + { + m_accountId = id; + } +} diff --git a/src/servers/Server_REST/Session.h b/src/servers/Server_REST/Session.h new file mode 100644 index 00000000..a2b98116 --- /dev/null +++ b/src/servers/Server_REST/Session.h @@ -0,0 +1,40 @@ +#ifndef _SESSION_H_ +#define _SESSION_H_ + +#include +#include +#include + +namespace Core { + + class Session + { + + private: + uint32_t m_ip; + uint32_t m_accountId; + + uint8_t m_sessionId[56]; + + public: + + std::string newCharName; + + Session( void ); + ~Session( void ); + + uint32_t getIp() const; + + void setSessionId( uint8_t * sessionId ); + + void setIp( uint32_t ip ); + + uint32_t getAccountId() const; + + void setAccountId( uint32_t id ); + + }; + +} + +#endif \ No newline at end of file diff --git a/src/servers/Server_REST/client_http.hpp b/src/servers/Server_REST/client_http.hpp new file mode 100644 index 00000000..077cb0fe --- /dev/null +++ b/src/servers/Server_REST/client_http.hpp @@ -0,0 +1,403 @@ +#ifndef CLIENT_HTTP_HPP +#define CLIENT_HTTP_HPP + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + + +namespace SimpleWeb { + template + class Client; + + template + class ClientBase { + public: + virtual ~ClientBase() {} + + class Response { + friend class ClientBase; + friend class Client; + public: + std::string http_version, status_code; + + std::istream content; + + std::unordered_multimap header; + + private: + boost::asio::streambuf content_buffer; + + Response(): content(&content_buffer) {} + }; + + class Config { + friend class ClientBase; + private: + Config() {} + public: + /// Set timeout on requests in seconds. Default value: 0 (no timeout). + size_t timeout=0; + /// Set proxy server (server:port) + std::string proxy_server; + }; + + /// Set before calling request + Config config; + + std::shared_ptr request(const std::string& request_type, const std::string& path="/", boost::string_ref content="", + const std::map& header=std::map()) { + auto corrected_path=path; + if(corrected_path=="") + corrected_path="/"; + if(!config.proxy_server.empty() && std::is_same::value) + corrected_path="http://"+host+':'+std::to_string(port)+corrected_path; + + boost::asio::streambuf write_buffer; + std::ostream write_stream(&write_buffer); + write_stream << request_type << " " << corrected_path << " HTTP/1.1\r\n"; + write_stream << "Host: " << host << "\r\n"; + for(auto& h: header) { + write_stream << h.first << ": " << h.second << "\r\n"; + } + if(content.size()>0) + write_stream << "Content-Length: " << content.size() << "\r\n"; + write_stream << "\r\n"; + + connect(); + + auto timer=get_timeout_timer(); + boost::asio::async_write(*socket, write_buffer, + [this, &content, timer](const boost::system::error_code &ec, size_t /*bytes_transferred*/) { + if(timer) + timer->cancel(); + if(!ec) { + if(!content.empty()) { + auto timer=get_timeout_timer(); + boost::asio::async_write(*socket, boost::asio::buffer(content.data(), content.size()), + [this, timer](const boost::system::error_code &ec, size_t /*bytes_transferred*/) { + if(timer) + timer->cancel(); + if(ec) { + std::lock_guard lock(socket_mutex); + this->socket=nullptr; + throw boost::system::system_error(ec); + } + }); + } + } + else { + std::lock_guard lock(socket_mutex); + socket=nullptr; + throw boost::system::system_error(ec); + } + }); + io_service.reset(); + io_service.run(); + + return request_read(); + } + + std::shared_ptr request(const std::string& request_type, const std::string& path, std::iostream& content, + const std::map& header=std::map()) { + auto corrected_path=path; + if(corrected_path=="") + corrected_path="/"; + if(!config.proxy_server.empty() && std::is_same::value) + corrected_path="http://"+host+':'+std::to_string(port)+corrected_path; + + content.seekp(0, std::ios::end); + auto content_length=content.tellp(); + content.seekp(0, std::ios::beg); + + boost::asio::streambuf write_buffer; + std::ostream write_stream(&write_buffer); + write_stream << request_type << " " << corrected_path << " HTTP/1.1\r\n"; + write_stream << "Host: " << host << "\r\n"; + for(auto& h: header) { + write_stream << h.first << ": " << h.second << "\r\n"; + } + if(content_length>0) + write_stream << "Content-Length: " << content_length << "\r\n"; + write_stream << "\r\n"; + if(content_length>0) + write_stream << content.rdbuf(); + + connect(); + + auto timer=get_timeout_timer(); + boost::asio::async_write(*socket, write_buffer, + [this, timer](const boost::system::error_code &ec, size_t /*bytes_transferred*/) { + if(timer) + timer->cancel(); + if(ec) { + std::lock_guard lock(socket_mutex); + socket=nullptr; + throw boost::system::system_error(ec); + } + }); + io_service.reset(); + io_service.run(); + + return request_read(); + } + + void close() { + std::lock_guard lock(socket_mutex); + if(socket) { + boost::system::error_code ec; + socket->lowest_layer().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec); + socket->lowest_layer().close(); + } + } + + protected: + boost::asio::io_service io_service; + boost::asio::ip::tcp::resolver resolver; + + std::unique_ptr socket; + std::mutex socket_mutex; + + std::string host; + unsigned short port; + + ClientBase(const std::string& host_port, unsigned short default_port) : resolver(io_service) { + auto parsed_host_port=parse_host_port(host_port, default_port); + host=parsed_host_port.first; + port=parsed_host_port.second; + } + + std::pair parse_host_port(const std::string &host_port, unsigned short default_port) { + std::pair parsed_host_port; + size_t host_end=host_port.find(':'); + if(host_end==std::string::npos) { + parsed_host_port.first=host_port; + parsed_host_port.second=default_port; + } + else { + parsed_host_port.first=host_port.substr(0, host_end); + parsed_host_port.second=static_cast(stoul(host_port.substr(host_end+1))); + } + return parsed_host_port; + } + + virtual void connect()=0; + + std::shared_ptr get_timeout_timer() { + if(config.timeout==0) + return nullptr; + + auto timer=std::make_shared(io_service); + timer->expires_from_now(boost::posix_time::seconds(config.timeout)); + timer->async_wait([this](const boost::system::error_code& ec) { + if(!ec) { + close(); + } + }); + return timer; + } + + void parse_response_header(const std::shared_ptr &response) const { + std::string line; + getline(response->content, line); + size_t version_end=line.find(' '); + if(version_end!=std::string::npos) { + if(5http_version=line.substr(5, version_end-5); + if((version_end+1)status_code=line.substr(version_end+1, line.size()-(version_end+1)-1); + + getline(response->content, line); + size_t param_end; + while((param_end=line.find(':'))!=std::string::npos) { + size_t value_start=param_end+1; + if((value_start)header.insert(std::make_pair(line.substr(0, param_end), line.substr(value_start, line.size()-value_start-1))); + } + + getline(response->content, line); + } + } + } + + std::shared_ptr request_read() { + std::shared_ptr response(new Response()); + + boost::asio::streambuf chunked_streambuf; + + auto timer=get_timeout_timer(); + boost::asio::async_read_until(*socket, response->content_buffer, "\r\n\r\n", + [this, &response, &chunked_streambuf, timer](const boost::system::error_code& ec, size_t bytes_transferred) { + if(timer) + timer->cancel(); + if(!ec) { + size_t num_additional_bytes=response->content_buffer.size()-bytes_transferred; + + parse_response_header(response); + + auto header_it=response->header.find("Content-Length"); + if(header_it!=response->header.end()) { + auto content_length=stoull(header_it->second); + if(content_length>num_additional_bytes) { + auto timer=get_timeout_timer(); + boost::asio::async_read(*socket, response->content_buffer, + boost::asio::transfer_exactly(content_length-num_additional_bytes), + [this, timer](const boost::system::error_code& ec, size_t /*bytes_transferred*/) { + if(timer) + timer->cancel(); + if(ec) { + std::lock_guard lock(socket_mutex); + this->socket=nullptr; + throw boost::system::system_error(ec); + } + }); + } + } + else if((header_it=response->header.find("Transfer-Encoding"))!=response->header.end() && header_it->second=="chunked") { + request_read_chunked(response, chunked_streambuf); + } + } + else { + std::lock_guard lock(socket_mutex); + socket=nullptr; + throw boost::system::system_error(ec); + } + }); + io_service.reset(); + io_service.run(); + + return response; + } + + void request_read_chunked(const std::shared_ptr &response, boost::asio::streambuf &streambuf) { + auto timer=get_timeout_timer(); + boost::asio::async_read_until(*socket, response->content_buffer, "\r\n", + [this, &response, &streambuf, timer](const boost::system::error_code& ec, size_t bytes_transferred) { + if(timer) + timer->cancel(); + if(!ec) { + std::string line; + getline(response->content, line); + bytes_transferred-=line.size()+1; + line.pop_back(); + std::streamsize length=stol(line, 0, 16); + + auto num_additional_bytes=static_cast(response->content_buffer.size()-bytes_transferred); + + auto post_process=[this, &response, &streambuf, length] { + std::ostream stream(&streambuf); + if(length>0) { + std::vector buffer(static_cast(length)); + response->content.read(&buffer[0], length); + stream.write(&buffer[0], length); + } + + //Remove "\r\n" + response->content.get(); + response->content.get(); + + if(length>0) + request_read_chunked(response, streambuf); + else { + std::ostream response_stream(&response->content_buffer); + response_stream << stream.rdbuf(); + } + }; + + if((2+length)>num_additional_bytes) { + auto timer=get_timeout_timer(); + boost::asio::async_read(*socket, response->content_buffer, + boost::asio::transfer_exactly(2+length-num_additional_bytes), + [this, post_process, timer](const boost::system::error_code& ec, size_t /*bytes_transferred*/) { + if(timer) + timer->cancel(); + if(!ec) { + post_process(); + } + else { + std::lock_guard lock(socket_mutex); + this->socket=nullptr; + throw boost::system::system_error(ec); + } + }); + } + else + post_process(); + } + else { + std::lock_guard lock(socket_mutex); + socket=nullptr; + throw boost::system::system_error(ec); + } + }); + } + }; + + template + class Client : public ClientBase {}; + + typedef boost::asio::ip::tcp::socket HTTP; + + template<> + class Client : public ClientBase { + public: + Client(const std::string& server_port_path) : ClientBase::ClientBase(server_port_path, 80) {} + + protected: + void connect() { + if(!socket || !socket->is_open()) { + std::unique_ptr query; + if(config.proxy_server.empty()) + query=std::unique_ptr(new boost::asio::ip::tcp::resolver::query(host, std::to_string(port))); + else { + auto proxy_host_port=parse_host_port(config.proxy_server, 8080); + query=std::unique_ptr(new boost::asio::ip::tcp::resolver::query(proxy_host_port.first, std::to_string(proxy_host_port.second))); + } + resolver.async_resolve(*query, [this](const boost::system::error_code &ec, + boost::asio::ip::tcp::resolver::iterator it){ + if(!ec) { + { + std::lock_guard lock(socket_mutex); + socket=std::unique_ptr(new HTTP(io_service)); + } + + auto timer=get_timeout_timer(); + boost::asio::async_connect(*socket, it, [this, timer] + (const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator /*it*/){ + if(timer) + timer->cancel(); + if(!ec) { + boost::asio::ip::tcp::no_delay option(true); + this->socket->set_option(option); + } + else { + std::lock_guard lock(socket_mutex); + this->socket=nullptr; + throw boost::system::system_error(ec); + } + }); + } + else { + std::lock_guard lock(socket_mutex); + socket=nullptr; + throw boost::system::system_error(ec); + } + }); + io_service.reset(); + io_service.run(); + } + } + }; +} + +#endif /* CLIENT_HTTP_HPP */ diff --git a/src/servers/Server_REST/main.cpp b/src/servers/Server_REST/main.cpp new file mode 100644 index 00000000..fcbb036e --- /dev/null +++ b/src/servers/Server_REST/main.cpp @@ -0,0 +1,603 @@ +#include "server_http.hpp" +#include "client_http.hpp" + +#define BOOST_SPIRIT_THREADSAFE +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include + +//Added for the default_resource example +#include +#include +#include +#include +#include + +#include "Forwards.h" +#include "SapphireAPI.h" + + +Core::Logger g_log; +Core::Db::Database g_database; +Core::Data::ExdData g_exdData; +Core::Network::SapphireAPI g_sapphireAPI; + +using namespace std; +using namespace boost::property_tree; + +typedef SimpleWeb::Server HttpServer; +typedef SimpleWeb::Client HttpClient; + +//Added for the default_resource example +void default_resource_send( const HttpServer &server, const shared_ptr &response, + const shared_ptr &ifs ); + +void print_request_info( shared_ptr request ) { + g_log.info( "Request from " + request->remote_endpoint_address + " (" + request->path + ")" ); +} + +int main() +{ + g_log.setLogPath( "SapphireAPI" ); + g_log.init(); + + g_log.info( "===========================================================" ); + g_log.info( "Sapphire API Server " ); + g_log.info( "Version: 0.0.1" ); + g_log.info( "Compiled: " __DATE__ " " __TIME__ ); + g_log.info( "===========================================================" ); + + auto m_pConfig = new Core::XMLConfig(); + + g_log.info( "Loading config settings_rest.xml" ); + + if( !m_pConfig->loadConfig( "config/settings_rest.xml" ) ) + { + g_log.fatal( "Error loading config settings_rest.xml" ); + return 1; + } + + if( !g_exdData.init( m_pConfig->getValue< std::string >( "Settings.General.DataPath" ) ) ) + { + g_log.fatal( "Error setting up EXD data " ); + return 1; + } + + Core::Db::DatabaseParams params; + params.bufferSize = 16384; + params.connectionCount = 3; + params.databaseName = m_pConfig->getValue< std::string >( "Settings.General.Mysql.Database", "sapphire" ); + params.hostname = m_pConfig->getValue< std::string >( "Settings.General.Mysql.Host", "127.0.0.1" ); + params.password = m_pConfig->getValue< std::string >( "Settings.General.Mysql.Pass", "" ); + params.port = m_pConfig->getValue< uint16_t >( "Settings.General.Mysql.Port", 3306 ); + params.username = m_pConfig->getValue< std::string >( "Settings.General.Mysql.Username", "root" ); + + if( !g_database.initialize( params ) ) + { + std::this_thread::sleep_for( std::chrono::milliseconds( 5000 ) ); + return -1; + } + + g_log.info( "Database: Connected to " + params.hostname + ":" + std::to_string( params.port ) ); + g_exdData.loadZoneInfo(); + + HttpServer server; + server.config.port = stoi( m_pConfig->getValue< std::string >( "Settings.General.HttpPort", "80" ) ); + g_log.info( "Starting REST server at port " + m_pConfig->getValue< std::string >( "Settings.General.HttpPort", "80" ) + "..." ); + + server.resource["^/ZoneName/([0-9]+)$"]["GET"] = [&server]( shared_ptr response, shared_ptr request ) { + string number = request->path_match[1]; + auto it = g_exdData.m_zoneInfoMap.find( atoi( number.c_str() ) ); + std::string responseStr = "Not found!"; + if( it != g_exdData.m_zoneInfoMap.end() ) + { + responseStr = it->second.zone_name + ", " + it->second.zone_str; + } + *response << "HTTP/1.1 200 OK\r\nContent-Length: " << responseStr.length() << "\r\n\r\n" << responseStr; + }; + + + /* Create account */ + server.resource["^/sapphire-api/lobby/createAccount"]["POST"] = [&server]( shared_ptr response, shared_ptr request ) { + print_request_info( request ); + + std::string responseStr = "HTTP/1.1 400\r\n\r\n"; + try + { + + using namespace boost::property_tree; + ptree pt; + read_json( request->content, pt ); + + std::string pass = pt.get( "pass" ); + std::string user = pt.get( "username" ); + + std::string sId; + if( g_sapphireAPI.createAccount( user, pass, sId ) ) + { + auto m_pConfig = new Core::XMLConfig(); + + g_log.info( "Loading config settings_rest.xml" ); + + if( !m_pConfig->loadConfig( "config/settings_rest.xml" ) ) + { + g_log.fatal( "Error loading config settings_rest.xml" ); + return 1; + } + + std::string json_string = "{\"sId\":\"" + sId + "\", \"lobbyHost\":\"" + m_pConfig->getValue< std::string >( "Settings.General.LobbyHost" ) + "\", \"frontierHost\":\"" + m_pConfig->getValue< std::string >( "Settings.General.FrontierHost" ) + "\"}"; + *response << "HTTP/1.1 200 OK\r\n " + << "Content-Type: application/json\r\n" + << "Content-Length: " << json_string.length() << "\r\n\r\n" + << json_string; + } + else + *response << "HTTP/1.1 400\r\n\r\n"; + } + catch( exception& e ) + { + *response << "HTTP/1.1 500\r\n\r\n"; + g_log.error( e.what() ); + } + *response << "HTTP/1.1 200 OK\r\nContent-Length: " << responseStr.length() << "\r\nContent-Type: text/xml\r\n\r\n" << responseStr; + }; + + + server.resource["^/sapphire-api/lobby/login"]["POST"] = [&server]( shared_ptr response, shared_ptr request ) { + print_request_info( request ); + + try + { + using namespace boost::property_tree; + ptree pt; + read_json( request->content, pt ); + + std::string pass = pt.get( "pass" ); + std::string user = pt.get( "username" ); + + std::string sId; + + if( g_sapphireAPI.login( user, pass, sId ) ) + { + auto m_pConfig = new Core::XMLConfig(); + + if( !m_pConfig->loadConfig( "config/settings_rest.xml" ) ) + { + g_log.fatal( "Error loading config settings_rest.xml" ); + return 1; + } + + std::string json_string = "{\"sId\":\"" + sId + "\", \"lobbyHost\":\"" + m_pConfig->getValue< std::string >("Settings.General.LobbyHost") + "\", \"frontierHost\":\"" + m_pConfig->getValue< std::string >( "Settings.General.FrontierHost" ) + "\"}"; + *response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string; + } + else + *response << "HTTP/1.1 400\r\n\r\n"; + + } + catch( exception& e ) + { + *response << "HTTP/1.1 500\r\n\r\n"; + g_log.error( e.what() ); + } + + }; + + server.resource["^/sapphire-api/lobby/deleteCharacter"]["POST"] = [&server]( shared_ptr response, shared_ptr request ) { + print_request_info( request ); + + try + { + using namespace boost::property_tree; + ptree pt; + read_json( request->content, pt ); + + std::string sId = pt.get( "sId" ); + std::string secret = pt.get( "secret" ); + std::string name = pt.get( "name" ); + + int accountId = g_sapphireAPI.checkSession( sId ); + + auto m_pConfig = new Core::XMLConfig(); + + if( !m_pConfig->loadConfig( "config/settings_rest.xml" ) ) + { + g_log.fatal( "Error loading config settings_rest.xml" ); + return 1; + } + + if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret ) { + std::string json_string = "{\"result\":\"invalid_secret\"}"; + *response << "HTTP/1.1 403\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string; + } + else + { + g_sapphireAPI.deleteCharacter( name, accountId ); + std::string json_string = "{\"result\":\"success\"}"; + *response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string; + } + } + catch( exception& e ) + { + *response << "HTTP/1.1 500\r\n\r\n"; + g_log.error( e.what() ); + } + + }; + + server.resource["^/sapphire-api/lobby/createCharacter"]["POST"] = [&server]( shared_ptr response, shared_ptr request ) { + print_request_info( request ); + + try + { + using namespace boost::property_tree; + ptree pt; + read_json( request->content, pt ); + + std::string sId = pt.get( "sId" ); + std::string secret = pt.get( "secret" ); + std::string name = pt.get( "name" ); + std::string infoJson = pt.get( "infoJson" ); + + std::string finalJson = Core::Util::base64_decode( infoJson ); + + int result = g_sapphireAPI.checkSession( sId ); + + if( result != -1 ) + { + auto m_pConfig = new Core::XMLConfig(); + + if( !m_pConfig->loadConfig( "config/settings_rest.xml" ) ) + { + g_log.fatal( "Error loading config settings_rest.xml" ); + return 1; + } + + if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret ) { + std::string json_string = "{\"result\":\"invalid_secret\"}"; + *response << "HTTP/1.1 403\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string; + } + else + { + int charId = g_sapphireAPI.createCharacter( result, name, finalJson ); + + std::string json_string = "{\"result\":\"" + std::to_string( charId ) + "\"}"; + *response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string; + } + } + else + { + std::string json_string = "{\"result\":\"invalid\"}"; + *response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string; + } + } + catch( exception& e ) + { + *response << "HTTP/1.1 500\r\n\r\n"; + g_log.error( e.what() ); + } + + }; + + server.resource["^/sapphire-api/lobby/checkNameTaken"]["POST"] = [&server]( shared_ptr response, shared_ptr request ) { + print_request_info( request ); + + try + { + using namespace boost::property_tree; + ptree pt; + read_json( request->content, pt ); + + std::string name = pt.get( "name" ); + std::string secret = pt.get( "secret" ); + + auto m_pConfig = new Core::XMLConfig(); + + if( !m_pConfig->loadConfig( "config/settings_rest.xml" ) ) + { + g_log.fatal( "Error loading config settings_rest.xml" ); + return 1; + } + + if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret ) { + std::string json_string = "{\"result\":\"invalid_secret\"}"; + *response << "HTTP/1.1 403\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string; + } + else + { + std::string json_string; + if( !g_sapphireAPI.checkNameTaken( name ) ) + json_string = "{\"result\":\"false\"}"; + else + json_string = "{\"result\":\"true\"}"; + + *response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string; + } + } + catch( exception& e ) + { + *response << "HTTP/1.1 500\r\n\r\n"; + g_log.error( e.what() ); + } + + }; + + server.resource["^/sapphire-api/lobby/checkSession"]["POST"] = [&server]( shared_ptr response, shared_ptr request ) { + print_request_info( request ); + + try + { + using namespace boost::property_tree; + ptree pt; + read_json( request->content, pt ); + + std::string sId = pt.get( "sId" ); + std::string secret = pt.get( "secret" ); + + int result = g_sapphireAPI.checkSession( sId ); + + if( result != -1 ) + { + auto m_pConfig = new Core::XMLConfig(); + + if( !m_pConfig->loadConfig( "config/settings_rest.xml" ) ) + { + g_log.fatal( "Error loading config settings_rest.xml" ); + return 1; + } + + if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret ) { + std::string json_string = "{\"result\":\"invalid_secret\"}"; + *response << "HTTP/1.1 403\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string; + } + else + { + std::string json_string = "{\"result\":\"" + std::to_string( result ) + "\"}"; + *response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string; + } + } + else + { + std::string json_string = "{\"result\":\"invalid\"}"; + *response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string; + } + } + catch( exception& e ) + { + *response << "HTTP/1.1 500\r\n\r\n"; + g_log.error( e.what() ); + } + + }; + + server.resource["^/sapphire-api/lobby/getNextCharId"]["POST"] = [&server]( shared_ptr response, shared_ptr request ) { + print_request_info( request ); + + try + { + using namespace boost::property_tree; + ptree pt; + read_json( request->content, pt ); + + std::string secret = pt.get( "secret" ); + + auto m_pConfig = new Core::XMLConfig(); + + if( !m_pConfig->loadConfig( "config/settings_rest.xml" ) ) + { + g_log.fatal( "Error loading config settings_rest.xml" ); + return 1; + } + + if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret ) { + std::string json_string = "{\"result\":\"invalid_secret\"}"; + *response << "HTTP/1.1 403\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string; + } + else + { + std::string json_string = "{\"result\":\"" + std::to_string( g_sapphireAPI.getNextCharId() ) + "\"}"; + *response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string; + } + } + catch( exception& e ) + { + *response << "HTTP/1.1 500\r\n\r\n"; + g_log.error( e.what() ); + } + + }; + + server.resource["^/sapphire-api/lobby/getNextContentId"]["POST"] = [&server]( shared_ptr response, shared_ptr request ) { + print_request_info( request ); + + try + { + using namespace boost::property_tree; + ptree pt; + read_json( request->content, pt ); + + std::string secret = pt.get( "secret" ); + + auto m_pConfig = new Core::XMLConfig(); + + if( !m_pConfig->loadConfig( "config/settings_rest.xml" ) ) + { + g_log.fatal( "Error loading config settings_rest.xml" ); + return 1; + } + + if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret ) { + std::string json_string = "{\"result\":\"invalid_secret\"}"; + *response << "HTTP/1.1 403\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string; + } + else + { + std::string json_string = "{\"result\":\"" + std::to_string( g_sapphireAPI.getNextContentId() ) + "\"}"; + *response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string; + } + } + catch( exception& e ) + { + *response << "HTTP/1.1 500\r\n\r\n"; + g_log.error( e.what() ); + } + + }; + + server.resource["^/sapphire-api/lobby/getCharacterList"]["POST"] = [&server]( shared_ptr response, shared_ptr request ) { + print_request_info( request ); + + try + { + using namespace boost::property_tree; + ptree pt; + read_json( request->content, pt ); + + std::string sId = pt.get( "sId" ); + std::string secret = pt.get( "secret" ); + + int result = g_sapphireAPI.checkSession( sId ); + + if( result != -1 ) + { + auto m_pConfig = new Core::XMLConfig(); + + if( !m_pConfig->loadConfig( "config/settings_rest.xml" ) ) + { + g_log.fatal( "Error loading config settings_rest.xml" ); + return 1; + } + + if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret ) { + std::string json_string = "{\"result\":\"invalid_secret\"}"; + *response << "HTTP/1.1 403\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string; + } + else + { + auto charList = g_sapphireAPI.getCharList( result ); + using boost::property_tree::ptree; + ptree pt; + ptree char_tree; + + for( auto entry : charList ) + { + ptree tree_entry; + tree_entry.put( "name", std::string( entry.getName() ) ); + tree_entry.put( "charId", std::to_string( entry.getId() ) ); + tree_entry.put( "contentId", std::to_string( entry.getContentId() ) ); + tree_entry.put( "infoJson", std::string( entry.getInfoJson() ) ); + char_tree.push_back( std::make_pair( "", tree_entry ) ); + } + + pt.add_child( "charArray", char_tree ); + pt.put( "result", "success" ); + std::ostringstream oss; + write_json( oss, pt ); + std::string responseStr = oss.str(); + *response << "HTTP/1.1 200\r\nContent-Length: " << responseStr.length() << "\r\n\r\n" << responseStr; + } + } + else + { + std::string json_string = "{\"result\":\"invalid\"}"; + *response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string; + } + } + catch( exception& e ) + { + *response << "HTTP/1.1 500\r\n\r\n"; + g_log.error( e.what() ); + } + + }; + + //Default GET-example. If no other matches, this anonymous function will be called. + //Will respond with content in the web/-directory, and its subdirectories. + //Default file: index.html + //Can for instance be used to retrieve an HTML 5 client that uses REST-resources on this server + server.default_resource["GET"] = [&server]( shared_ptr response, shared_ptr request ) { + print_request_info( request ); + + try + { + auto web_root_path = boost::filesystem::canonical( "web" ); + auto path = boost::filesystem::canonical( web_root_path / request->path ); + //Check if path is within web_root_path + if( distance( web_root_path.begin(), web_root_path.end() ) > distance( path.begin(), path.end() ) || + !equal( web_root_path.begin(), web_root_path.end(), path.begin() ) ) + throw invalid_argument( "path must be within root path" ); + if( boost::filesystem::is_directory( path ) ) + path /= "index.html"; + if( !( boost::filesystem::exists( path ) && boost::filesystem::is_regular_file( path ) ) ) + throw invalid_argument( "file does not exist" ); + + std::string cache_control, etag; + + // Uncomment the following line to enable Cache-Control + // cache_control="Cache-Control: max-age=86400\r\n"; + + auto ifs = make_shared(); + ifs->open( path.string(), ifstream::in | ios::binary | ios::ate ); + + if( *ifs ) + { + auto length = ifs->tellg(); + ifs->seekg( 0, ios::beg ); + + *response << "HTTP/1.1 200 OK\r\n" << cache_control << etag << "Content-Length: " << length << "\r\n\r\n"; + default_resource_send( server, response, ifs ); + } + else + throw invalid_argument( "could not read file" ); + } + catch( const exception &e ) + { + string content = "Path not found: " + request->path; + *response << "HTTP/1.1 400 Bad Request\r\nContent-Length: " << content.length() << "\r\n\r\n" << content; + } + }; + + thread server_thread( [&server]() { + //Start server + server.start(); + } ); + + //Wait for server to start so that the client can connect + this_thread::sleep_for( chrono::seconds( 1 ) ); + + server_thread.join(); + g_log.info( "Started REST server at port " + std::to_string( server.config.port ) ); + + return 0; +} + +void default_resource_send( const HttpServer &server, const shared_ptr &response, + const shared_ptr &ifs ) +{ + //read and send 128 KB at a time + static vector buffer( 131072 ); // Safe when server is running on one thread + streamsize read_length; + if( ( read_length = ifs->read( &buffer[0], buffer.size() ).gcount() ) > 0 ) + { + response->write( &buffer[0], read_length ); + if( read_length == static_cast< streamsize >( buffer.size() ) ) + { + server.send( response, [&server, response, ifs]( const boost::system::error_code &ec ) { + if( !ec ) + default_resource_send( server, response, ifs ); + else + cerr << "Connection interrupted" << endl; + } ); + } + } +} diff --git a/src/servers/Server_REST/server_http.hpp b/src/servers/Server_REST/server_http.hpp new file mode 100644 index 00000000..2651eaba --- /dev/null +++ b/src/servers/Server_REST/server_http.hpp @@ -0,0 +1,462 @@ +#ifndef SERVER_HTTP_HPP +#define SERVER_HTTP_HPP + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifndef CASE_INSENSITIVE_EQUALS_AND_HASH +#define CASE_INSENSITIVE_EQUALS_AND_HASH +//Based on http://www.boost.org/doc/libs/1_60_0/doc/html/unordered/hash_equality.html +class case_insensitive_equals { +public: + bool operator()(const std::string &key1, const std::string &key2) const { + return boost::algorithm::iequals(key1, key2); + } +}; +class case_insensitive_hash { +public: + size_t operator()(const std::string &key) const { + std::size_t seed=0; + for(auto &c: key) + boost::hash_combine(seed, std::tolower(c)); + return seed; + } +}; +#endif + +// Late 2017 TODO: remove the following checks and always use std::regex +#ifdef USE_BOOST_REGEX +#include +#define REGEX_NS boost +#else +#include +#define REGEX_NS std +#endif + +// TODO when switching to c++14, use [[deprecated]] instead +#ifndef DEPRECATED +#ifdef __GNUC__ +#define DEPRECATED __attribute__((deprecated)) +#elif defined(_MSC_VER) +#define DEPRECATED __declspec(deprecated) +#else +#define DEPRECATED +#endif +#endif + +namespace SimpleWeb { + template + class Server; + + template + class ServerBase { + public: + virtual ~ServerBase() {} + + class Response : public std::ostream { + friend class ServerBase; + + boost::asio::streambuf streambuf; + + std::shared_ptr socket; + + Response(const std::shared_ptr &socket): std::ostream(&streambuf), socket(socket) {} + + public: + size_t size() { + return streambuf.size(); + } + }; + + class Content : public std::istream { + friend class ServerBase; + public: + size_t size() { + return streambuf.size(); + } + std::string string() { + std::stringstream ss; + ss << rdbuf(); + return ss.str(); + } + private: + boost::asio::streambuf &streambuf; + Content(boost::asio::streambuf &streambuf): std::istream(&streambuf), streambuf(streambuf) {} + }; + + class Request { + friend class ServerBase; + friend class Server; + public: + std::string method, path, http_version; + + Content content; + + std::unordered_multimap header; + + REGEX_NS::smatch path_match; + + std::string remote_endpoint_address; + unsigned short remote_endpoint_port; + + private: + Request(const socket_type &socket): content(streambuf) { + try { + remote_endpoint_address=socket.lowest_layer().remote_endpoint().address().to_string(); + remote_endpoint_port=socket.lowest_layer().remote_endpoint().port(); + } + catch(...) {} + } + + boost::asio::streambuf streambuf; + }; + + class Config { + friend class ServerBase; + + Config(unsigned short port): port(port) {} + public: + /// Port number to use. Defaults to 80 for HTTP and 443 for HTTPS. + unsigned short port; + /// Number of threads that the server will use when start() is called. Defaults to 1 thread. + size_t thread_pool_size=1; + /// Timeout on request handling. Defaults to 5 seconds. + size_t timeout_request=5; + /// Timeout on content handling. Defaults to 300 seconds. + size_t timeout_content=300; + /// IPv4 address in dotted decimal form or IPv6 address in hexadecimal notation. + /// If empty, the address will be any address. + std::string address; + /// Set to false to avoid binding the socket to an address that is already in use. Defaults to true. + bool reuse_address=true; + }; + ///Set before calling start(). + Config config; + + private: + class regex_orderable : public REGEX_NS::regex { + std::string str; + public: + regex_orderable(const char *regex_cstr) : REGEX_NS::regex(regex_cstr), str(regex_cstr) {} + regex_orderable(const std::string ®ex_str) : REGEX_NS::regex(regex_str), str(regex_str) {} + bool operator<(const regex_orderable &rhs) const { + return str::Response>, std::shared_ptr::Request>)> > > resource; + + std::map::Response>, std::shared_ptr::Request>)> > default_resource; + + std::function::Request>, const boost::system::error_code&)> on_error; + + std::function socket, std::shared_ptr::Request>)> on_upgrade; + + virtual void start() { + if(!io_service) + io_service=std::make_shared(); + + if(io_service->stopped()) + io_service->reset(); + + boost::asio::ip::tcp::endpoint endpoint; + if(config.address.size()>0) + endpoint=boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string(config.address), config.port); + else + endpoint=boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), config.port); + + if(!acceptor) + acceptor=std::unique_ptr(new boost::asio::ip::tcp::acceptor(*io_service)); + acceptor->open(endpoint.protocol()); + acceptor->set_option(boost::asio::socket_base::reuse_address(config.reuse_address)); + acceptor->bind(endpoint); + acceptor->listen(); + + accept(); + + //If thread_pool_size>1, start m_io_service.run() in (thread_pool_size-1) threads for thread-pooling + threads.clear(); + for(size_t c=1;crun(); + }); + } + + //Main thread + if(config.thread_pool_size>0) + io_service->run(); + + //Wait for the rest of the threads, if any, to finish as well + for(auto& t: threads) { + t.join(); + } + } + + void stop() { + acceptor->close(); + if(config.thread_pool_size>0) + io_service->stop(); + } + + ///Use this function if you need to recursively send parts of a longer message + void send(const std::shared_ptr &response, const std::function& callback=nullptr) const { + boost::asio::async_write(*response->socket, response->streambuf, [this, response, callback](const boost::system::error_code& ec, size_t /*bytes_transferred*/) { + if(callback) + callback(ec); + }); + } + + /// If you have your own boost::asio::io_service, store its pointer here before running start(). + /// You might also want to set config.thread_pool_size to 0. + std::shared_ptr io_service; + protected: + std::unique_ptr acceptor; + std::vector threads; + + ServerBase(unsigned short port) : config(port) {} + + virtual void accept()=0; + + std::shared_ptr get_timeout_timer(const std::shared_ptr &socket, long seconds) { + if(seconds==0) + return nullptr; + + auto timer=std::make_shared(*io_service); + timer->expires_from_now(boost::posix_time::seconds(seconds)); + timer->async_wait([socket](const boost::system::error_code& ec){ + if(!ec) { + boost::system::error_code ec; + socket->lowest_layer().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec); + socket->lowest_layer().close(); + } + }); + return timer; + } + + void read_request_and_content(const std::shared_ptr &socket) { + //Create new streambuf (Request::streambuf) for async_read_until() + //shared_ptr is used to pass temporary objects to the asynchronous functions + std::shared_ptr request(new Request(*socket)); + + //Set timeout on the following boost::asio::async-read or write function + auto timer=this->get_timeout_timer(socket, config.timeout_request); + + boost::asio::async_read_until(*socket, request->streambuf, "\r\n\r\n", + [this, socket, request, timer](const boost::system::error_code& ec, size_t bytes_transferred) { + if(timer) + timer->cancel(); + if(!ec) { + //request->streambuf.size() is not necessarily the same as bytes_transferred, from Boost-docs: + //"After a successful async_read_until operation, the streambuf may contain additional data beyond the delimiter" + //The chosen solution is to extract lines from the stream directly when parsing the header. What is left of the + //streambuf (maybe some bytes of the content) is appended to in the async_read-function below (for retrieving content). + size_t num_additional_bytes=request->streambuf.size()-bytes_transferred; + + if(!this->parse_request(request)) + return; + + //If content, read that as well + auto it=request->header.find("Content-Length"); + if(it!=request->header.end()) { + unsigned long long content_length; + try { + content_length=stoull(it->second); + } + catch(const std::exception &e) { + if(on_error) + on_error(request, boost::system::error_code(boost::system::errc::protocol_error, boost::system::generic_category())); + return; + } + if(content_length>num_additional_bytes) { + //Set timeout on the following boost::asio::async-read or write function + auto timer=this->get_timeout_timer(socket, config.timeout_content); + boost::asio::async_read(*socket, request->streambuf, + boost::asio::transfer_exactly(content_length-num_additional_bytes), + [this, socket, request, timer] + (const boost::system::error_code& ec, size_t /*bytes_transferred*/) { + if(timer) + timer->cancel(); + if(!ec) + this->find_resource(socket, request); + else if(on_error) + on_error(request, ec); + }); + } + else + this->find_resource(socket, request); + } + else + this->find_resource(socket, request); + } + else if(on_error) + on_error(request, ec); + }); + } + + bool parse_request(const std::shared_ptr &request) const { + std::string line; + getline(request->content, line); + size_t method_end; + if((method_end=line.find(' '))!=std::string::npos) { + size_t path_end; + if((path_end=line.find(' ', method_end+1))!=std::string::npos) { + request->method=line.substr(0, method_end); + request->path=line.substr(method_end+1, path_end-method_end-1); + + size_t protocol_end; + if((protocol_end=line.find('/', path_end+1))!=std::string::npos) { + if(line.compare(path_end+1, protocol_end-path_end-1, "HTTP")!=0) + return false; + request->http_version=line.substr(protocol_end+1, line.size()-protocol_end-2); + } + else + return false; + + getline(request->content, line); + size_t param_end; + while((param_end=line.find(':'))!=std::string::npos) { + size_t value_start=param_end+1; + if((value_start)header.emplace(line.substr(0, param_end), line.substr(value_start, line.size()-value_start-1)); + } + + getline(request->content, line); + } + } + else + return false; + } + else + return false; + return true; + } + + void find_resource(const std::shared_ptr &socket, const std::shared_ptr &request) { + //Upgrade connection + if(on_upgrade) { + auto it=request->header.find("Upgrade"); + if(it!=request->header.end()) { + on_upgrade(socket, request); + return; + } + } + //Find path- and method-match, and call write_response + for(auto ®ex_method: resource) { + auto it=regex_method.second.find(request->method); + if(it!=regex_method.second.end()) { + REGEX_NS::smatch sm_res; + if(REGEX_NS::regex_match(request->path, sm_res, regex_method.first)) { + request->path_match=std::move(sm_res); + write_response(socket, request, it->second); + return; + } + } + } + auto it=default_resource.find(request->method); + if(it!=default_resource.end()) { + write_response(socket, request, it->second); + } + } + + void write_response(const std::shared_ptr &socket, const std::shared_ptr &request, + std::function::Response>, + std::shared_ptr::Request>)>& resource_function) { + //Set timeout on the following boost::asio::async-read or write function + auto timer=this->get_timeout_timer(socket, config.timeout_content); + + auto response=std::shared_ptr(new Response(socket), [this, request, timer](Response *response_ptr) { + auto response=std::shared_ptr(response_ptr); + this->send(response, [this, response, request, timer](const boost::system::error_code& ec) { + if(timer) + timer->cancel(); + if(!ec) { + float http_version; + try { + http_version=stof(request->http_version); + } + catch(const std::exception &e){ + if(on_error) + on_error(request, boost::system::error_code(boost::system::errc::protocol_error, boost::system::generic_category())); + return; + } + + auto range=request->header.equal_range("Connection"); + for(auto it=range.first;it!=range.second;it++) { + if(boost::iequals(it->second, "close")) + return; + } + if(http_version>1.05) + this->read_request_and_content(response->socket); + } + else if(on_error) + on_error(request, ec); + }); + }); + + try { + resource_function(response, request); + } + catch(const std::exception &e) { + if(on_error) + on_error(request, boost::system::error_code(boost::system::errc::operation_canceled, boost::system::generic_category())); + return; + } + } + }; + + template + class Server : public ServerBase {}; + + typedef boost::asio::ip::tcp::socket HTTP; + + template<> + class Server : public ServerBase { + public: + DEPRECATED Server(unsigned short port, size_t thread_pool_size=1, long timeout_request=5, long timeout_content=300) : + Server() { + config.port=port; + config.thread_pool_size=thread_pool_size; + config.timeout_request=timeout_request; + config.timeout_content=timeout_content; + } + + Server() : ServerBase::ServerBase(80) {} + + protected: + void accept() { + //Create new socket for this connection + //Shared_ptr is used to pass temporary objects to the asynchronous functions + auto socket=std::make_shared(*io_service); + + acceptor->async_accept(*socket, [this, socket](const boost::system::error_code& ec){ + //Immediately start accepting a new connection (if io_service hasn't been stopped) + if (ec != boost::asio::error::operation_aborted) + accept(); + + if(!ec) { + boost::asio::ip::tcp::no_delay option(true); + socket->set_option(option); + + this->read_request_and_content(socket); + } + else if(on_error) + on_error(std::shared_ptr(new Request(*socket)), ec); + }); + } + }; +} +#endif /* SERVER_HTTP_HPP */ diff --git a/src/servers/Server_Zone/Action.cpp b/src/servers/Server_Zone/Action.cpp new file mode 100644 index 00000000..2cdf945b --- /dev/null +++ b/src/servers/Server_Zone/Action.cpp @@ -0,0 +1,85 @@ +#include "Action.h" + +#include + + +Core::Action::Action::Action() +{ +} + +Core::Action::Action::~Action() +{ + +} + +uint32_t Core::Action::Action::getId() const +{ + return m_id; +} + +Core::Common::ActionType Core::Action::Action::getActionType() const +{ + return m_actionType; +} + +Core::Entity::ActorPtr Core::Action::Action::getTargetActor() const +{ + return m_pTarget; +} + +bool Core::Action::Action::isInterrupted() const +{ + return m_bInterrupt; +} + +void Core::Action::Action::setInterrupted() +{ + m_bInterrupt = true; +} + +uint64_t Core::Action::Action::getStartTime() const +{ + return m_startTime; +} + +void Core::Action::Action::setStartTime( uint64_t startTime ) +{ + m_startTime = startTime; +} + +uint32_t Core::Action::Action::getCastTime() const +{ + return m_castTime; +} + +void Core::Action::Action::setCastTime( uint32_t castTime ) +{ + m_castTime = castTime; +} + +Core::Entity::ActorPtr Core::Action::Action::getActionSource() const +{ + return m_pSource; +} + +bool Core::Action::Action::update() +{ + // action has not been started yet + if( m_startTime == 0 ) + return false; + + if( m_bInterrupt ) + { + onInterrupt(); + return true; + } + + uint64_t currTime = Util::getTimeMs(); + + if( ( currTime - m_startTime ) > m_castTime ) + { + onFinish(); + return true; + } + return false; +} diff --git a/src/servers/Server_Zone/Action.h b/src/servers/Server_Zone/Action.h new file mode 100644 index 00000000..8a004bf4 --- /dev/null +++ b/src/servers/Server_Zone/Action.h @@ -0,0 +1,60 @@ +#ifndef _ACTION_H_ +#define _ACTION_H_ + +#include +#include "Forwards.h" + +namespace Core { namespace Action { + + class Action + { + + public: + Action(); + virtual ~Action(); + + uint32_t getId() const; + + Common::ActionType getActionType() const; + + Entity::ActorPtr getTargetActor() const; + + bool isInterrupted() const; + + void setInterrupted(); + + uint64_t getStartTime() const; + + void setStartTime( uint64_t startTime ); + + uint32_t getCastTime() const; + + void setCastTime( uint32_t castTime ); + + Entity::ActorPtr getActionSource() const; + + virtual void onStart() {}; + virtual void onFinish() {}; + virtual void onInterrupt() {}; + + // update action, if returns true, action is done and has to be removed from the actor + virtual bool update(); + + protected: + uint32_t m_id; + Common::ActionType m_actionType; + + uint64_t m_startTime; + uint32_t m_castTime; + + Entity::ActorPtr m_pSource; + Entity::ActorPtr m_pTarget; + + bool m_bInterrupt; + + }; + +} +} + +#endif \ No newline at end of file diff --git a/src/servers/Server_Zone/ActionCast.cpp b/src/servers/Server_Zone/ActionCast.cpp new file mode 100644 index 00000000..0e1a37e1 --- /dev/null +++ b/src/servers/Server_Zone/ActionCast.cpp @@ -0,0 +1,107 @@ +#include "ActionCast.h" + +#include +#include +#include +#include +#include + +#include "ActorControlPacket142.h" +#include "ActorControlPacket143.h" +#include "Player.h" + +using namespace Core::Common; +using namespace Core::Network; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +extern Core::Data::ExdData g_exdData; +extern Core::Logger g_log; + +Core::Action::ActionCast::ActionCast() +{ + m_actionType = Common::ActionType::Event; +} + +Core::Action::ActionCast::ActionCast( Entity::ActorPtr pActor, Entity::ActorPtr pTarget, uint32_t actionId ) +{ + m_startTime = 0; + m_id = actionId; + m_actionType = ActionType::Spell; + m_castTime = g_exdData.m_actionInfoMap[actionId].cast_time; // TODO: Add security checks. + m_pSource = pActor; + m_pTarget = pTarget; + m_bInterrupt = false; +} + +Core::Action::ActionCast::~ActionCast() +{ + +} + +void Core::Action::ActionCast::onStart() +{ + if( !m_pSource ) + return; + + m_pSource->getAsPlayer()->sendDebug( "onStart()" ); + m_startTime = Util::getTimeMs(); + + GamePacketNew< FFXIVIpcActorCast > castPacket( getId() ); + + castPacket.data().action_id = m_id; + castPacket.data().unknown = 1; + castPacket.data().cast_time = m_castTime; + castPacket.data().target_id = m_pTarget->getId(); + + m_pSource->sendToInRangeSet( castPacket, true ); + m_pSource->getAsPlayer()->setStateFlag( PlayerStateFlag::Casting ); + m_pSource->getAsPlayer()->sendStateFlags(); + +} + +void Core::Action::ActionCast::onFinish() +{ + if( !m_pSource ) + return; + + auto pPlayer = m_pSource->getAsPlayer(); + pPlayer->sendDebug( "onFinish()" ); + + m_pTarget->onActionHostile( pPlayer->shared_from_this() ); + + pPlayer->unsetStateFlag( PlayerStateFlag::Casting ); + pPlayer->sendStateFlags(); + + GamePacketNew< FFXIVIpcEffect > effectPacket( pPlayer->getId() ); + effectPacket.data().targetId = m_pTarget->getId(); + effectPacket.data().actionAnimationId = m_id; + effectPacket.data().unknown_2 = 0; +// effectPacket.data().unknown_3 = 1; + effectPacket.data().actionTextId = m_id; + effectPacket.data().numEffects = 1; + effectPacket.data().rotation = Math::Util::floatToUInt16Rot( pPlayer->getRotation() ); + effectPacket.data().effectTarget = m_pTarget->getId(); + effectPacket.data().effects[0].param1 = 30; + effectPacket.data().effects[0].unknown_1 = 3; + effectPacket.data().effects[0].unknown_2 = 1; + effectPacket.data().effects[0].unknown_3 = 7; + + pPlayer->sendToInRangeSet( effectPacket, true ); + m_pTarget->takeDamage( 30 ); +} + +void Core::Action::ActionCast::onInterrupt() +{ + if( !m_pSource ) + return; + + m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Occupied1 ); + m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Casting ); + m_pSource->getAsPlayer()->sendStateFlags(); + + auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, + 0x219, 0x04, m_id, 1 ); + m_pSource->sendToInRangeSet( control, true ); + +} diff --git a/src/servers/Server_Zone/ActionCast.h b/src/servers/Server_Zone/ActionCast.h new file mode 100644 index 00000000..ce69da18 --- /dev/null +++ b/src/servers/Server_Zone/ActionCast.h @@ -0,0 +1,28 @@ +#ifndef _ACTIONCAST_H_ +#define _ACTIONCAST_H_ + +#include "Forwards.h" +#include "Action.h" + +namespace Core { namespace Action { + + class ActionCast : public Action + { + private: + + public: + ActionCast(); + ~ActionCast(); + + ActionCast( Entity::ActorPtr pActor, Entity::ActorPtr pTarget, uint32_t actionId ); + + void onStart() override; + void onFinish() override; + void onInterrupt() override; + + }; + +} +} + +#endif \ No newline at end of file diff --git a/src/servers/Server_Zone/ActionTeleport.cpp b/src/servers/Server_Zone/ActionTeleport.cpp new file mode 100644 index 00000000..1d5b0d8e --- /dev/null +++ b/src/servers/Server_Zone/ActionTeleport.cpp @@ -0,0 +1,114 @@ +#include "ActionTeleport.h" + +#include +#include +#include + +#include "ActorControlPacket142.h" +#include "ActorControlPacket143.h" +#include "Player.h" + +using namespace Core::Common; +using namespace Core::Network; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +extern Core::Data::ExdData g_exdData; +extern Core::Logger g_log; + +Core::Action::ActionTeleport::ActionTeleport() +{ + m_actionType = Common::ActionType::Event; +} + +Core::Action::ActionTeleport::ActionTeleport( Entity::ActorPtr pActor, uint16_t targetZone, uint16_t cost ) +{ + m_startTime = 0; + m_id = 5; + m_actionType = ActionType::Teleport; + m_castTime = g_exdData.m_actionInfoMap[5].cast_time; // TODO: Add security checks. + m_pSource = pActor; + m_bInterrupt = false; + m_targetAetheryte = targetZone; + m_cost = cost; +} + +Core::Action::ActionTeleport::~ActionTeleport() +{ + +} + +void Core::Action::ActionTeleport::onStart() +{ + if( !m_pSource ) + return; + + m_startTime = Util::getTimeMs(); + + GamePacketNew< FFXIVIpcActorCast > castPacket( getId() ); + + castPacket.data().action_id = 5; + castPacket.data().unknown = 1; + castPacket.data().cast_time = 5.0f; + castPacket.data().target_id = m_pSource->getId(); + + m_pSource->sendToInRangeSet( castPacket, true ); + m_pSource->getAsPlayer()->setStateFlag( PlayerStateFlag::Casting ); + m_pSource->getAsPlayer()->sendStateFlags(); + +} + +void Core::Action::ActionTeleport::onFinish() +{ + if( !m_pSource ) + return; + + auto pPlayer = m_pSource->getAsPlayer(); + + // check we can finish teleporting + if( pPlayer->getCurrency( Inventory::CurrencyType::Gil ) < m_cost ) + { + onInterrupt(); + return; + } + + pPlayer->removeCurrency( Inventory::CurrencyType::Gil, m_cost ); + + pPlayer->unsetStateFlag( PlayerStateFlag::Casting ); + pPlayer->sendStateFlags(); + + // TODO: not sure if this ever gets sent + //auto control = Network::Packets::Server::ActorControlPacket142( m_pSource->getId(), Common::ActorControlType::TeleportDone ); + //m_pSource->sendToInRangeSet( control, false ); + + pPlayer->setZoningType( Common::ZoneingType::Teleport ); + + GamePacketNew< FFXIVIpcEffect > effectPacket( pPlayer->getId() ); + effectPacket.data().targetId = pPlayer->getId(); + effectPacket.data().actionAnimationId = 5; + //effectPacket.data().unknown_3 = 1; + effectPacket.data().actionTextId = 5; + effectPacket.data().unknown_5 = 1; + effectPacket.data().numEffects = 1; + effectPacket.data().rotation = static_cast< uint16_t >( 0x8000 * ((pPlayer->getRotation() + 3.1415926)) / 3.1415926 ); + effectPacket.data().effectTarget = pPlayer->getId(); + pPlayer->sendToInRangeSet( effectPacket, true ); + + pPlayer->teleport( m_targetAetheryte ); + + +} + +void Core::Action::ActionTeleport::onInterrupt() +{ + if( !m_pSource ) + return; + + m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Occupied1 ); + m_pSource->getAsPlayer()->sendStateFlags(); + + auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, + 0x219, 0x04, m_id, 1 ); + m_pSource->sendToInRangeSet( control, true ); + +} diff --git a/src/servers/Server_Zone/ActionTeleport.h b/src/servers/Server_Zone/ActionTeleport.h new file mode 100644 index 00000000..e8d16b68 --- /dev/null +++ b/src/servers/Server_Zone/ActionTeleport.h @@ -0,0 +1,30 @@ +#ifndef _ACTIONTELEPORT_H_ +#define _ACTIONTELEPORT_H_ + +#include "Forwards.h" +#include "Action.h" + +namespace Core { namespace Action { + + class ActionTeleport : public Action + { + private: + uint16_t m_targetAetheryte; + uint16_t m_cost; + + public: + ActionTeleport(); + ~ActionTeleport(); + + ActionTeleport( Entity::ActorPtr pActor, uint16_t action, uint16_t cost ); + + void onStart() override; + void onFinish() override; + void onInterrupt() override; + + }; + +} +} + +#endif \ No newline at end of file diff --git a/src/servers/Server_Zone/Actor.cpp b/src/servers/Server_Zone/Actor.cpp new file mode 100644 index 00000000..82b0cb7a --- /dev/null +++ b/src/servers/Server_Zone/Actor.cpp @@ -0,0 +1,600 @@ +#include +#include +#include + +#include "Forwards.h" +#include "Action.h" +#include "Actor.h" +#include "Zone.h" +#include +#include "GameConnection.h" +#include "ActorControlPacket142.h" +#include "ActorControlPacket143.h" +#include "ActorControlPacket144.h" +#include "UpdateHpMpTpPacket.h" + +#include "StatusEffectContainer.h" +#include "ServerZone.h" +#include "Session.h" +#include "Player.h" + +extern Core::ServerZone g_serverZone; + +using namespace Core::Common; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +Core::Entity::Actor::Actor() +{ +} + +Core::Entity::Actor::~Actor() +{ +} + +/*! \return the id of the actor */ +uint32_t Core::Entity::Actor::getId() const +{ + return m_id; +} + +/*! \return the actors position object */ +Core::Common::FFXIVARR_POSITION3& Core::Entity::Actor::getPos() +{ + return m_pos; +} +/*! \return the actors name */ +std::string Core::Entity::Actor::getName() const +{ + return std::string( m_name ); +} + +/*! \return true if the actor is of type player */ +bool Core::Entity::Actor::isPlayer() const +{ + return ( m_type == ActorType::Player ? true : false ); +} + +/*! \return true if the actor is of type mob */ +bool Core::Entity::Actor::isMob() const +{ + return ( m_type == ActorType::BattleNpc ? true : false ); +} + +/*! \return list of actors currently in range */ +std::set< Core::Entity::ActorPtr > Core::Entity::Actor::getInRangeActors() const +{ + return m_inRangeActors; +} + +/*! \return current stance of the actors */ +Core::Entity::Actor::Stance Core::Entity::Actor::getStance() const +{ + return m_currentStance; +} + +/*! \return current HP */ +uint32_t Core::Entity::Actor::getHp() const +{ + return m_hp; +} + +/*! \return current MP */ +uint32_t Core::Entity::Actor::getMp() const +{ + return m_mp; +} + +/*! \return current TP */ +uint16_t Core::Entity::Actor::getTp() const +{ + return m_tp; +} + +/*! \return current GP */ +uint16_t Core::Entity::Actor::getGp() const +{ + return m_gp; +} + +/*! \return current class or job */ +Core::Common::ClassJob Core::Entity::Actor::getClass() const +{ + return m_class; +} + +/*! \return current class or job as int ( this feels pointless ) */ +uint8_t Core::Entity::Actor::getClassAsInt() const +{ + return static_cast< uint8_t >( m_class ); +} + +/*! \param ClassJob to set */ +void Core::Entity::Actor::setClass( Common::ClassJob classJob ) +{ + m_class = classJob; +} + +/*! \param Id of the target to set */ +void Core::Entity::Actor::setTargetId( uint64_t targetId ) +{ + m_targetId = targetId; +} + +/*! \return Id of the current target */ +uint64_t Core::Entity::Actor::getTargetId() const +{ + return m_targetId; +} + +/*! \return True if the actor is alive */ +bool Core::Entity::Actor::isAlive() const +{ + return ( m_hp > 0 ); +} + +/*! \return max hp for the actor */ +uint32_t Core::Entity::Actor::getMaxHp() const +{ + return m_baseStats.max_hp; +} + +/*! \return max mp for the actor */ +uint32_t Core::Entity::Actor::getMaxMp() const +{ + return m_baseStats.max_mp; +} + +/*! \return reset hp to current max hp */ +void Core::Entity::Actor::resetHp() +{ + m_hp = getMaxHp(); +} + +/*! \return reset mp to current max mp */ +void Core::Entity::Actor::resetMp() +{ + m_mp = getMaxMp(); +} + +/*! \param hp amount to set ( caps to maxHp ) */ +void Core::Entity::Actor::setHp( uint32_t hp ) +{ + m_hp = hp < getMaxHp() ? hp : getMaxHp(); +} + +/*! \param mp amount to set ( caps to maxMp ) */ +void Core::Entity::Actor::setMp( uint32_t mp ) +{ + m_mp = mp < getMaxMp() ? mp : getMaxMp(); +} + +/*! \param mp amount to set ( caps to maxMp ) */ +void Core::Entity::Actor::setGp( uint32_t gp ) +{ + m_gp = gp; +} + +/*! \return current status of the actor */ +Core::Entity::Actor::ActorStatus Core::Entity::Actor::getStatus() const +{ + return m_status; +} + +/*! \param status to set */ +void Core::Entity::Actor::setStatus( ActorStatus status ) +{ + m_status = status; +} + +/*! +Performs necessary steps to mark an actor dead. +Sets hp/mp/tp, sets status, plays animation and fires onDeath event +*/ +void Core::Entity::Actor::die() +{ + m_status = ActorStatus::Dead; + m_hp = 0; + m_mp = 0; + m_tp = 0; + + // fire onDeath event + onDeath(); + + bool selfNeedsUpdate = false; + + // if the actor is a player, the update needs to be send to himself too + if( isPlayer() ) + selfNeedsUpdate = true; + + sendToInRangeSet( ActorControlPacket142( m_id, SetStatus, static_cast< uint8_t>( ActorStatus::Dead ) ), selfNeedsUpdate ); + + // TODO: not all actor show the death animation when they die, some quest npcs might just despawn + // although that might be handled by setting the HP to 1 and doing some script magic + sendToInRangeSet( ActorControlPacket142( m_id, DeathAnimation, 0, 0, 0, 0x20 ), selfNeedsUpdate ); + +} + +/*! +Calculates and sets the rotation to look towards a specified +position + +\param Position to look towards +*/ +bool Core::Entity::Actor::face( const Common::FFXIVARR_POSITION3& p ) +{ + float oldRot = getRotation(); + float rot = Math::Util::calcAngFrom( getPos().x, getPos().z, p.x, p.z ); + float newRot = PI - rot + ( PI / 2 ); + + m_pCell = nullptr; + + setRotation( newRot ); + + if( oldRot != newRot ) + return true; + + return false; +} + +/*! +Sets the actors position and notifies the zone to propagate the change + +\param Position to set +*/ +void Core::Entity::Actor::setPosition( const Common::FFXIVARR_POSITION3& pos ) +{ + m_pos = pos; + m_pCurrentZone->changeActorPosition( shared_from_this() ); +} + +void Core::Entity::Actor::setPosition( float x, float y, float z ) +{ + m_pos.x = x; + m_pos.y = y; + m_pos.z = z; + m_pCurrentZone->changeActorPosition( shared_from_this() ); +} + +/*! +Set and propagate the actor stance to in range players +( not the actor himself ) + +\param stance to set +*/ +void Core::Entity::Actor::setStance( Stance stance ) +{ + m_currentStance = stance; + + sendToInRangeSet( ActorControlPacket142( m_id, ToggleAggro, stance, 1 ) ); +} + +/*! +Check if an action is queued for execution, if so update it +and if fully performed, clean up again. + +\return true if a queued action has been updated +*/ +bool Core::Entity::Actor::checkAction() +{ + + if( m_pCurrentAction == nullptr ) + return false; + + if( m_pCurrentAction->update() ) + m_pCurrentAction.reset(); + + return true; + +} + +/*! +Change the current target and propagate to in range players + +\param target actor id +*/ +void Core::Entity::Actor::changeTarget( uint64_t targetId ) +{ + setTargetId( targetId ); + + sendToInRangeSet( ActorControlPacket144( m_id, SetTarget, + 0, 0, 0, 0, targetId ) ); +} + +/*! +Dummy function \return 0 +*/ +uint8_t Core::Entity::Actor::getLevel() const +{ + return 0; +} + +/*! +Let an actor take damage and perform necessary steps +according to resulting hp, propagates new hp value to players +in range +TODO: eventually this needs to distinguish between physical and +magical dmg and take status effects into account + +\param amount of damage to be taken +*/ +void Core::Entity::Actor::takeDamage( uint32_t damage ) +{ + if( damage >= m_hp ) + { + m_hp = 0; + die(); + } + else + m_hp -= damage; + + sendStatusUpdate( false ); +} + +/*! +Send an HpMpTp update to players in range ( and potentially to self ) +TODO: poor naming, should be changed. Status is not HP. Also should be virtual +so players can have their own version and we can abolish the param. + +\param true if the update should also be sent to the actor ( player ) himself +*/ +void Core::Entity::Actor::sendStatusUpdate( bool toSelf ) +{ + UpdateHpMpTpPacket updateHpPacket( shared_from_this() ); + sendToInRangeSet( updateHpPacket ); +} + +/*! \return pointer to this instance as PlayerPtr */ +Core::Entity::PlayerPtr Core::Entity::Actor::getAsPlayer() +{ + return boost::dynamic_pointer_cast< Entity::Player, Entity::Actor >( shared_from_this() ); +} + +/*! \return pointer to this instance as BattleNpcPtr */ +Core::Entity::BattleNpcPtr Core::Entity::Actor::getAsBattleNpc() +{ + return boost::reinterpret_pointer_cast< Entity::BattleNpc, Entity::Actor >( shared_from_this() ); +} + +/*! \return ActionPtr of the currently registered action, or nullptr */ +Core::Action::ActionPtr Core::Entity::Actor::getCurrentAction() const +{ + return m_pCurrentAction; +} + +/*! \param ActionPtr of the action to be registered */ +void Core::Entity::Actor::setCurrentAction( Core::Action::ActionPtr pAction ) +{ + m_pCurrentAction = pAction; +} + +/*! +check if a given actor is in the actors in range set + +\param ActorPtr to be checked for +\return true if the actor was found +*/ +bool Core::Entity::Actor::isInRangeSet( ActorPtr pActor ) const +{ + return !( m_inRangeActors.find( pActor ) == m_inRangeActors.end() ); +} + +/*! \return ActorPtr of the closest actor in range, if none, nullptr */ +Core::Entity::ActorPtr Core::Entity::Actor::getClosestActor() +{ + if( m_inRangeActors.empty() ) + // no actors in range, don't bother + return nullptr; + + ActorPtr tmpActor = nullptr; + + // arbitrary high number + float minDistance = 10000; + + for( auto pCurAct : m_inRangeActors ) + { + float distance = Math::Util::distance( getPos().x, + getPos().y, + getPos().z, + pCurAct->getPos().x, + pCurAct->getPos().y, + pCurAct->getPos().z ); + + if( distance < minDistance ) + { + minDistance = distance; + tmpActor = pCurAct; + } + } + + return tmpActor; +} + +/*! +Send a packet to all players in range, potentially to self if set and is player + +\param GamePacketPtr to send +\param bool should be send to self? +*/ +void Core::Entity::Actor::sendToInRangeSet( Network::Packets::GamePacketPtr pPacket, bool bToSelf ) +{ + + if( bToSelf && isPlayer() ) + { + auto pPlayer = getAsPlayer(); + + auto pSession = g_serverZone.getSession( pPlayer->getId() ); + + // it might be that the player DC'd in which case the session would be invalid + if( pSession ) + pSession->getZoneConnection()->queueOutPacket( pPacket ); + } + + if( m_inRangePlayers.empty() ) + return; + + for( auto pCurAct : m_inRangePlayers ) + { + assert( pCurAct ); + pPacket->setValAt( 0x04, m_id ); + pPacket->setValAt( 0x08, pCurAct->m_id ); + // it might be that the player DC'd in which case the session would be invalid + pCurAct->queuePacket( pPacket ); + } +} + +/*! +Add a given actor to the fitting in range set according to type +but also to the global actor map + +\param ActorPtr to add +*/ +void Core::Entity::Actor::addInRangeActor( ActorPtr pActor ) +{ + + // if this is null, something went wrong + assert( pActor ); + + // add actor to in range set + m_inRangeActors.insert( pActor ); + + if( pActor->isPlayer() ) + { + auto pPlayer = pActor->getAsPlayer(); + + // if actor is a player, add it to the in range player set + m_inRangePlayers.insert( pPlayer ); + } + + m_inRangeActorMap[pActor->getId()] = pActor; +} + +/*! +Remove a given actor from the fitting in range set according to type +but also to the global actor map + +\param ActorPtr to remove +*/ +void Core::Entity::Actor::removeInRangeActor( ActorPtr pActor ) +{ + // if this is null, something went wrong + assert( pActor ); + + // call virtual event + onRemoveInRangeActor( pActor ); + + // remove actor from in range actor set + m_inRangeActors.erase( pActor ); + + // if actor is a player, despawn ourself for him + // TODO: move to virtual onRemove? + if( isPlayer() ) + pActor->despawn( shared_from_this() ); + + if( pActor->isPlayer() ) + { + auto pPlayer = pActor->getAsPlayer(); + m_inRangePlayers.erase( pPlayer ); + } + + m_inRangeActorMap.erase( pActor->getId() ); +} + +/*! \return true if there is at least one actor in the in range set */ +bool Core::Entity::Actor::hasInRangeActor() const +{ + return ( m_inRangeActors.size() > 0 ); +} + +/*! Clear the whole in range set, this does no cleanup */ +void Core::Entity::Actor::clearInRangeSet() +{ + m_inRangeActors.clear(); + m_inRangePlayers.clear(); + m_inRangeActorMap.clear(); +} + +/*! \return ZonePtr to the current zone, nullptr if not set */ +Core::ZonePtr Core::Entity::Actor::getCurrentZone() const +{ + return m_pCurrentZone; +} + +/*! \param ZonePtr to the zone to be set as current */ +void Core::Entity::Actor::setCurrentZone( ZonePtr currZone ) +{ + m_pCurrentZone = currZone; +} + +/*! +Get the current cell of a region the actor is in + +\return Cell* +*/ +Core::Cell * Core::Entity::Actor::getCell() const +{ + return m_pCell; +} + +/*! +Set the current cell the actor is in + +\param Cell* for the cell to be set +*/ +void Core::Entity::Actor::setCell( Cell * pCell ) +{ + m_pCell = pCell; +} + +/*! +Autoattack prototype implementation +TODO: move the check if the autoAttack can be performed to the callee +also rename autoAttack to autoAttack as that is more elaborate +On top of that, this only solves attacks from melee classes. +Will have to be extended for ranged attacks. + +\param ActorPtr the autoAttack is performed on +*/ +void Core::Entity::Actor::autoAttack( ActorPtr pTarget ) +{ + + uint64_t tick = Util::getTimeMs(); + + if( ( tick - m_lastAttack ) > 2500 ) + { + pTarget->onActionHostile( shared_from_this() ); + m_lastAttack = tick; + srand( static_cast< uint32_t >( tick ) ); + + uint32_t damage = 10 + rand() % 12; + uint32_t variation = 0 + rand() % 3; + + GamePacketNew< FFXIVIpcEffect > effectPacket( getId() ); + effectPacket.data().targetId = pTarget->getId(); + effectPacket.data().actionAnimationId = 0x366; + effectPacket.data().unknown_2 = variation; +// effectPacket.data().unknown_3 = 1; + effectPacket.data().actionTextId = 0x366; + effectPacket.data().numEffects = 1; + effectPacket.data().rotation = Math::Util::floatToUInt16Rot( getRotation() ); + effectPacket.data().effectTarget = pTarget->getId(); + effectPacket.data().effects[0].param1 = damage; + effectPacket.data().effects[0].unknown_1 = 3; + effectPacket.data().effects[0].unknown_2 = 1; + effectPacket.data().effects[0].unknown_3 = 7; + + sendToInRangeSet( effectPacket ); + + if( this->isPlayer() ) + this->getAsPlayer()->queuePacket( effectPacket ); + + pTarget->takeDamage( damage ); + } +} + +/*! \param StatusEffectPtr to be applied to the actor */ +void Core::Entity::Actor::addStatusEffect( StatusEffect::StatusEffectPtr pEffect ) +{ + m_pStatusEffectContainer->addStatusEffect( pEffect ); +} + diff --git a/src/servers/Server_Zone/Actor.h b/src/servers/Server_Zone/Actor.h new file mode 100644 index 00000000..aa6dc39b --- /dev/null +++ b/src/servers/Server_Zone/Actor.h @@ -0,0 +1,303 @@ +#ifndef _ACTOR_H_ +#define _ACTOR_H_ + +#include +#include + +#include "Forwards.h" +#include +#include + +namespace Core { +namespace Entity { + +/*! +\class Actor +\brief Base class for all actors + +\author Mordred +*/ +class Actor : public boost::enable_shared_from_this< Actor > +{ +public: + enum ActorType : uint8_t + { + None = 0x00, + Player = 0x01, + BattleNpc = 0x02, + EventNpc = 0x03, + unk1 = 0x04, + AetheryteNpc = 0x05, + ResourceNode = 0x06, + EventObj = 0x07, + Mount = 0x08, + Minion = 0x09, + Retainer = 0x0A, + unk2 = 0x0B, + Furniture = 0x0C, + }; + + enum Stance : uint8_t + { + Passive = 0, + Active = 1, + }; + + enum struct ActorStatus : uint8_t + { + Idle = 0x01, + Dead = 0x02, + Sitting = 0x03, + Mounted = 0x04, + Crafting = 0x05, + Gathering = 0x06, + Melding = 0x07, + SMachine = 0x08 + }; + +protected: + // TODO: The position class should probably be abolished and + // the FFXIV_POS struct used instead ( the functions in there + // could be moved to a FFXIV_POS_Helper namespace and rotation to + // its own member ) + /*! Position of the actor */ + Common::FFXIVARR_POSITION3 m_pos; + float m_rot; + /*! Name of the actor */ + char m_name[34]; + /*! Id of the zone the actor currently is in */ + uint32_t m_zoneId; + /*! Id of the actor */ + uint32_t m_id; + /*! Type of the actor */ + ActorType m_type; + /*! Ptr to the ZoneObj the actor belongs to */ + ZonePtr m_pCurrentZone; + /*! Last tick time for the actor ( in ms ) */ + uint64_t m_lastTickTime; + /*! Last time the actor performed an autoAttack ( in ms ) */ + uint64_t m_lastAttack; + /*! Last time the actor was updated ( in ms ) */ + uint64_t m_lastUpdate; + /*! Current stance of the actor */ + Stance m_currentStance; + /*! Current staus of the actor */ + ActorStatus m_status; + /*! Max HP of the actor ( based on job / class ) */ + uint32_t m_maxHp; + /*! Max MP of the actor ( based on job / class ) */ + uint32_t m_maxMp; + /*! Current HP of the actor */ + uint32_t m_hp; + /*! Current MP of the actor */ + uint32_t m_mp; + /*! Current TP of the actor */ + uint16_t m_tp; + /*! Current GP of the actor */ + uint16_t m_gp; + /*! Additional look info of the actor */ + uint8_t m_customize[26]; + /*! Current class of the actor */ + Common::ClassJob m_class; + /*! Id of the currently selected target actor */ + uint64_t m_targetId; + /*! Ptr to a queued action */ + Action::ActionPtr m_pCurrentAction; + /*! Container for status effects */ + StatusEffect::StatusEffectContainerPtr m_pStatusEffectContainer; + + struct + { + uint32_t max_mp = 0; + uint32_t max_hp = 0; + + uint32_t str = 0; + uint32_t dex = 0; + uint32_t vit = 0; + uint32_t inte = 0; + uint32_t mnd = 0; + uint32_t pie = 0; + + uint32_t parry = 0; + uint32_t attack = 0; + uint32_t defense = 0; + uint32_t accuracy = 0; + uint32_t spellSpeed = 0; + uint32_t magicDefense = 0; + uint32_t critHitRate = 0; + uint32_t resistSlash = 0; + uint32_t resistPierce = 0; + uint32_t resistBlunt = 0; + uint32_t attackPotMagic = 0; + uint32_t healingPotMagic = 0; + uint32_t determination = 0; + uint32_t skillSpeed = 0; + + uint32_t resistSlow = 0; + uint32_t resistSilence = 0; + uint32_t resistBlind = 0; + uint32_t resistPoison = 0; + uint32_t resistStun = 0; + uint32_t resistSleep = 0; + uint32_t resistBind = 0; + uint32_t resistHeavy = 0; + + uint32_t resistFire = 0; + uint32_t resistIce = 0; + uint32_t resistWind = 0; + uint32_t resistEarth = 0; + uint32_t resistLightning = 0; + uint32_t resistWater = 0; + + } m_baseStats; + +public: + Actor(); + + virtual ~Actor(); + + virtual void calculateStats() {}; + + uint32_t getId() const; + + void setPosition( const Common::FFXIVARR_POSITION3& pos ); + void setPosition( float x, float y, float z ); + + void setRotation( float rot ) + { + m_rot = rot; + } + + float getRotation() const + { + return m_rot; + } + + Common::FFXIVARR_POSITION3& getPos(); + + std::string getName() const; + + bool isPlayer() const; + + bool isMob() const; + + std::set< ActorPtr > getInRangeActors() const; + + bool face( const Common::FFXIVARR_POSITION3& p ); + + Stance getStance() const; + + void setStance( Stance stance ); + + uint32_t getHp() const; + + uint32_t getMp() const; + + uint16_t getTp() const; + + uint16_t getGp() const; + + Common::ClassJob getClass() const; + + uint8_t getClassAsInt() const; + + void setClass( Common::ClassJob classJob ); + + void setTargetId( uint64_t targetId ); + + uint64_t getTargetId() const; + + bool isAlive() const; + + virtual uint32_t getMaxHp() const; + + virtual uint32_t getMaxMp() const; + + void resetHp(); + + void resetMp(); + + void setHp( uint32_t hp ); + + void setMp( uint32_t mp ); + + void setGp( uint32_t gp ); + + void die(); + + ActorStatus getStatus() const; + + void setStatus( ActorStatus status ); + + virtual void autoAttack( ActorPtr pTarget ); + + virtual void spawn( PlayerPtr pTarget ) {} + virtual void despawn( ActorPtr pTarget ) {} + + virtual void onRemoveInRangeActor( ActorPtr pActor ) {} + virtual void onDeath() {}; + virtual void onDamageTaken( Actor& pSource ) {}; + virtual void onActionHostile( Core::Entity::ActorPtr pSource ) {}; + virtual void onActionFriendly( Actor& pSource ) {}; + virtual void onTick() {}; + + virtual void changeTarget( uint64_t targetId ); + virtual uint8_t getLevel() const; + virtual void sendStatusUpdate( bool toSelf = true ); + virtual void takeDamage( uint32_t damage ); + virtual bool checkAction(); + virtual void update( int64_t currTime ) {}; + + PlayerPtr getAsPlayer(); + BattleNpcPtr getAsBattleNpc(); + + Action::ActionPtr getCurrentAction() const; + + void setCurrentAction( Action::ActionPtr pAction ); + + ///// IN RANGE LOGIC ///// + + // check if another actor is in the actors in range set + bool isInRangeSet( ActorPtr pActor ) const; + + ActorPtr getClosestActor(); + + void sendToInRangeSet( Network::Packets::GamePacketPtr pPacket, bool bToSelf = false ); + + // add an actor to in range set + virtual void addInRangeActor( ActorPtr pActor ); + + // remove an actor from the in range set + void removeInRangeActor( ActorPtr pActor ); + + // return true if there is at least one actor in the in range set + bool hasInRangeActor() const; + + // clear the whole in range set, this does no cleanup + virtual void clearInRangeSet(); + + ZonePtr getCurrentZone() const; + + void setCurrentZone( ZonePtr currZone ); + + // get the current cell of a region the actor is in + Cell* getCell() const; + + // set the current cell + void setCell( Cell* pCell ); + + // add a status effect + void addStatusEffect( StatusEffect::StatusEffectPtr pEffect ); + + // TODO: Why did i even declare them publicly here?! + std::set< ActorPtr > m_inRangeActors; + std::set< PlayerPtr > m_inRangePlayers; + std::map< uint32_t, ActorPtr > m_inRangeActorMap; + + Core::Cell* m_pCell; + +}; + +} +} +#endif diff --git a/src/servers/Server_Zone/ActorControlPacket142.h b/src/servers/Server_Zone/ActorControlPacket142.h new file mode 100644 index 00000000..f39bfe8d --- /dev/null +++ b/src/servers/Server_Zone/ActorControlPacket142.h @@ -0,0 +1,49 @@ +#ifndef _ACTORCONTROL142_H +#define _ACTORCONTROL142_H + +#include +#include +#include "Forwards.h" + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +/** +* @brief The Ping response packet. +*/ +class ActorControlPacket142 : + public GamePacketNew< FFXIVIpcActorControl142 > +{ +public: + ActorControlPacket142( uint32_t actorId, + uint16_t category, + uint32_t param1 = 0, + uint32_t param2 = 0, + uint32_t param3 = 0, + uint32_t param4 = 0, + uint32_t padding1 = 0 ) : + GamePacketNew< FFXIVIpcActorControl142 >( actorId, actorId ) + { + initialize( category, param1, param2, param3, param4 ); + }; + +private: + void initialize( uint16_t category, uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4 ) + { + m_data.padding = 0; + m_data.category = category; + m_data.param1 = param1; + m_data.param2 = param2; + m_data.param3 = param3; + m_data.param4 = param4; + }; +}; + +} +} +} +} + +#endif /*_ACTORCONTROL142_H*/ \ No newline at end of file diff --git a/src/servers/Server_Zone/ActorControlPacket143.h b/src/servers/Server_Zone/ActorControlPacket143.h new file mode 100644 index 00000000..adf49610 --- /dev/null +++ b/src/servers/Server_Zone/ActorControlPacket143.h @@ -0,0 +1,52 @@ +#ifndef _ACTORCONTROL143_H +#define _ACTORCONTROL143_H + +#include +#include +#include "Forwards.h" + + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +/** +* @brief The Ping response packet. +*/ +class ActorControlPacket143 : + public GamePacketNew< FFXIVIpcActorControl143 > +{ +public: + ActorControlPacket143( uint32_t actorId, + uint16_t category, + uint32_t param1 = 0, + uint32_t param2 = 0, + uint32_t param3 = 0, + uint32_t param4 = 0, + uint32_t param5 = 0, + uint32_t padding1 = 0 ) : + GamePacketNew< FFXIVIpcActorControl143 >( actorId, actorId ) + { + initialize( category, param1, param2, param3, param4, param5 ); + }; + +private: + void initialize( uint16_t category, uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4, uint32_t param5 ) + { + m_data.padding = 0; + m_data.category = category; + m_data.param1 = param1; + m_data.param2 = param2; + m_data.param3 = param3; + m_data.param4 = param4; + m_data.param5 = param5; + }; +}; + +} +} +} +} + +#endif /*_ACTORCONTROL143_H*/ \ No newline at end of file diff --git a/src/servers/Server_Zone/ActorControlPacket144.h b/src/servers/Server_Zone/ActorControlPacket144.h new file mode 100644 index 00000000..819003f2 --- /dev/null +++ b/src/servers/Server_Zone/ActorControlPacket144.h @@ -0,0 +1,50 @@ +#ifndef _ACTORCONTROL144_H +#define _ACTORCONTROL144_H + +#include +#include + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +/** +* @brief The Ping response packet. +*/ +class ActorControlPacket144 : + public GamePacketNew< FFXIVIpcActorControl144 > +{ +public: + ActorControlPacket144( uint32_t actorId, + uint16_t category, + uint32_t param1 = 0, + uint32_t param2 = 0, + uint32_t param3 = 0, + uint32_t param4 = 0, + uint64_t targetId = 0, + uint32_t padding1 = 0 ) : + GamePacketNew< FFXIVIpcActorControl144 >( actorId, actorId ) + { + initialize( category, param1, param2, param3, param4, targetId ); + }; + +private: + void initialize( uint16_t category, uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4, uint64_t targetId ) + { + m_data.padding = 0; + m_data.category = category; + m_data.param1 = param1; + m_data.param2 = param2; + m_data.param3 = param3; + m_data.param4 = param4; + m_data.targetId = targetId; + }; +}; + +} +} +} +} + +#endif /*_ACTORCONTROL144_H*/ \ No newline at end of file diff --git a/src/servers/Server_Zone/ActorSpawnPacket.h b/src/servers/Server_Zone/ActorSpawnPacket.h new file mode 100644 index 00000000..55bb4f17 --- /dev/null +++ b/src/servers/Server_Zone/ActorSpawnPacket.h @@ -0,0 +1,91 @@ +#ifndef _ACTORSPAWN_H +#define _ACTORSPAWN_H + +#include +#include +#include "Player.h" +#include "Forwards.h" + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +/** +* @brief The packet sent to finish an event. +*/ +class ActorSpawnPacket : + public GamePacketNew +{ +public: + ActorSpawnPacket( Entity::PlayerPtr pPlayer, Entity::PlayerPtr pTarget ) : + GamePacketNew( pPlayer->getId(), pTarget->getId() ) + { + initialize( pPlayer, pTarget ); + }; + +private: + void initialize( Entity::PlayerPtr pPlayer, Entity::PlayerPtr pTarget ) + { + // TODO: temporary gm rank + m_data.gmRank = 0xff; + m_data.classJob = pPlayer->getClass(); + m_data.status = static_cast< uint8_t >( pPlayer->getStatus() ); + m_data.hPCurr = pPlayer->getHp(); + m_data.mPCurr = pPlayer->getMp(); + m_data.tPCurr = pPlayer->getTp(); + m_data.hPMax = pPlayer->getMaxHp(); + m_data.mPMax = pPlayer->getMaxMp(); + m_data.tPMax = 3000; + m_data.level = pPlayer->getLevel(); + memcpy( m_data.look, pPlayer->getLookArray(), 26 ); + m_data.mainWeaponModel = pPlayer->getModelMainWeapon(); + m_data.secWeaponModel = pPlayer->getModelSubWeapon(); + m_data.models[0] = pPlayer->getModelForSlot( Inventory::EquipSlot::Head ); + m_data.models[1] = pPlayer->getModelForSlot( Inventory::EquipSlot::Body ); + m_data.models[2] = pPlayer->getModelForSlot( Inventory::EquipSlot::Hands ); + m_data.models[3] = pPlayer->getModelForSlot( Inventory::EquipSlot::Legs ); + m_data.models[4] = pPlayer->getModelForSlot( Inventory::EquipSlot::Feet ); + strcpy( m_data.name, pPlayer->getName().c_str() ); + m_data.pos.x = pPlayer->getPos().x; + m_data.pos.y = pPlayer->getPos().y; + m_data.pos.z = pPlayer->getPos().z; + m_data.voice = pPlayer->getVoiceId(); + + m_data.rotation = Math::Util::floatToUInt16Rot( pPlayer->getRotation() ); + + m_data.statusIcon = pPlayer->getOnlineStatus(); + + if( pTarget == pPlayer ) + { + m_data.spawnIndex = 0x00; + } + else + { + m_data.spawnIndex = pTarget->getSpawnIdForActorId( pPlayer->getId() ); + } + // 0x20 == spawn hidden to be displayed by the spawneffect control + m_data.displayFlags = pPlayer->getStance(); + + if( pPlayer->getZoningType() != Common::ZoneingType::None ) + { + m_data.displayFlags |= 0x20; + } + + m_data.targetId = pPlayer->getTargetId(); + m_data.type = 1; + m_data.unknown_33 = 4; + //m_data.unknown_38 = 0x70; + //m_data.unknown_60 = 3; + //m_data.unknown_61 = 7; + + + }; +}; + +} +} +} +} + +#endif /*_ACTORSPAWN_H*/ \ No newline at end of file diff --git a/src/servers/Server_Zone/BattleNpc.cpp b/src/servers/Server_Zone/BattleNpc.cpp new file mode 100644 index 00000000..93956510 --- /dev/null +++ b/src/servers/Server_Zone/BattleNpc.cpp @@ -0,0 +1,574 @@ +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "Player.h" +#include "BattleNpc.h" + +#include "MoveActorPacket.h" +#include "ActorControlPacket142.h" +#include "ActorControlPacket143.h" + +using namespace Core::Common; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +extern Core::Logger g_log; +extern Core::Db::Database g_database; +extern Core::Data::ExdData g_exdData; + +uint32_t Core::Entity::BattleNpc::m_nextID = 1149241694; + +Core::Entity::BattleNpc::BattleNpc() +{ + m_id = 0; + m_type = ActorType::BattleNpc; + m_status = ActorStatus::Idle; +} + +Core::Entity::BattleNpc::~BattleNpc() +{ + +} + +Core::Entity::BattleNpc::BattleNpc( uint32_t modelId, uint32_t nameid, const Common::FFXIVARR_POSITION3& spawnPos, + uint32_t sizeId, uint32_t type, uint32_t level, uint32_t behaviour, + uint32_t mobType ) +{ + BattleNpc::m_nextID++; + m_id = BattleNpc::m_nextID; + //strcpy( m_name, pBNpc->m_name.c_str() ); + + m_pos = spawnPos; + m_posOrigin = spawnPos; + + m_type = ActorType::BattleNpc; + + m_mode = MODE_IDLE; + + m_maxHp = 150; + m_maxMp = 100; + + m_baseStats.max_hp = m_maxHp; + m_baseStats.max_mp = m_maxMp; + + m_hp = m_maxHp; + m_mp = m_maxMp; + + m_currentStance = Stance::Passive; + + m_class = ClassJob::CLASS_GLADIATOR; + m_level = level > 0 ? level : 60; + + m_modelId = modelId; + m_nameId = nameid; + + m_behavior = behaviour; + + m_bnpcBaseId = sizeId; + + m_status = ActorStatus::Idle; + + m_pOwner = nullptr; + + m_mobType = mobType; + + //m_type = static_cast< Common::ActorType >( type ); + +} + + +// spawn this player for pTarget +void Core::Entity::BattleNpc::spawn( Core::Entity::PlayerPtr pTarget ) +{ + //GamePacketNew< FFXIVIpcActorSpawn > spawnPacket( getId(), pTarget->getId() ); + + //spawnPacket.data().unknown_0 = 0; + //spawnPacket.data().ownerId = m_pOwner == nullptr ? INVALID_GAME_OBJECT_ID : m_pOwner->getId(); + //spawnPacket.data().targetId = INVALID_GAME_OBJECT_ID & 0xFFFFFFFF; + //spawnPacket.data().hPCurr = m_hp; + //spawnPacket.data().hPMax = m_baseStats.max_hp; + //spawnPacket.data().level = m_level; + ////spawnPacket.data().tPCurr = 1000; + //spawnPacket.data().model = m_modelId; + //spawnPacket.data().bnpcBaseId = m_bnpcBaseId; + //spawnPacket.data().nameId = m_nameId; + //spawnPacket.data().spawnIndex = pTarget->getSpawnIdForActorId( getId() ); + //g_log.info(std::to_string(spawnPacket.data().spawnIndex) + " " + std::to_string(getId())); + //spawnPacket.data().status = static_cast< uint8_t >( m_status ); + //spawnPacket.data().mobAgressive = m_behavior; + //spawnPacket.data().type = static_cast< uint8_t >( m_type ); + //spawnPacket.data().mobTypeIcon = m_mobType; + //spawnPacket.data().unknown_33 = 5; + //spawnPacket.data().typeFlags = 4; + //spawnPacket.data().pos.x = m_pos.x; + //spawnPacket.data().pos.y = m_pos.y; + //spawnPacket.data().pos.z = m_pos.z; + //spawnPacket.data().rotation = Math::Util::floatToUInt16Rot( getRotation() ); + ////spawnPacket.data().unknown_B0[11] = 1; + ////spawnPacket.data().unknown_B0[12] = 4; + ////spawnPacket.data().unknown_B0[14] = 20; + + //pTarget->queuePacket( spawnPacket ); + + GamePacketNew< FFXIVIpcNpcSpawn > spawnPacket( getId(), pTarget->getId() ); + + + spawnPacket.data().pos.x = m_pos.x; + spawnPacket.data().pos.y = m_pos.y; + spawnPacket.data().pos.z = m_pos.z; + + spawnPacket.data().targetId = INVALID_GAME_OBJECT_ID & 0xFFFFFFFF; + spawnPacket.data().hPCurr = m_hp; + spawnPacket.data().hPMax = m_baseStats.max_hp; + spawnPacket.data().level = m_level; + + spawnPacket.data().subtype = 5; + spawnPacket.data().enemyType = 4; + + spawnPacket.data().modelChara = m_modelId; + spawnPacket.data().bNPCBase = m_bnpcBaseId; + spawnPacket.data().bNPCName = m_nameId; + spawnPacket.data().spawnIndex = pTarget->getSpawnIdForActorId( getId() ); + + spawnPacket.data().rotation = Math::Util::floatToUInt16Rot( getRotation() ); + + spawnPacket.data().type = static_cast< uint8_t >( m_type ); + + spawnPacket.data().state = static_cast< uint8_t >( m_status ); + + pTarget->queuePacket( spawnPacket ); +} + +// despawn +void Core::Entity::BattleNpc::despawn( Core::Entity::ActorPtr pTarget ) +{ + + auto pPlayer = pTarget->getAsPlayer(); + + pPlayer->freePlayerSpawnId( getId() ); + + ActorControlPacket143 controlPacket( m_id, DespawnZoneScreenMsg, 0x04, getId(), 0x01 ); + pPlayer->queuePacket( controlPacket ); + +} + +uint8_t Core::Entity::BattleNpc::getLevel() const +{ + return m_level; +} + +Core::Entity::StateMode Core::Entity::BattleNpc::getMode() const +{ + return m_mode; +} + +void Core::Entity::BattleNpc::setMode( Core::Entity::StateMode mode ) +{ + m_mode = mode; +} + +uint8_t Core::Entity::BattleNpc::getbehavior() const +{ + return m_behavior; +} + +void Core::Entity::BattleNpc::hateListAdd( Core::Entity::ActorPtr pActor, int32_t hateAmount ) +{ + HateListEntry* hateEntry = new HateListEntry(); + hateEntry->m_hateAmount = hateAmount; + hateEntry->m_pActor = pActor; + + m_hateList.insert( hateEntry ); +} + +Core::Entity::ActorPtr Core::Entity::BattleNpc::hateListGetHighest() +{ + + auto it = m_hateList.begin(); + uint32_t maxHate = 0; + HateListEntry* entry = nullptr; + for( ; it != m_hateList.end(); ++it ) + { + if( ( *it )->m_hateAmount > maxHate ) + { + maxHate = ( *it )->m_hateAmount; + entry = *it; + } + } + + if( entry && maxHate != 0 ) + return entry->m_pActor; + + return nullptr; +} + +void Core::Entity::BattleNpc::setOwner( Core::Entity::PlayerPtr pPlayer ) +{ + m_pOwner = pPlayer; + + if( pPlayer != nullptr ) + { + GamePacketNew< FFXIVIpcActorOwner > setOwnerPacket( getId(), pPlayer->getId() ); + setOwnerPacket.data().type = 0x01; + setOwnerPacket.data().actorId = pPlayer->getId(); + sendToInRangeSet( setOwnerPacket ); + } + else + { + GamePacketNew< FFXIVIpcActorOwner > setOwnerPacket(getId(), INVALID_GAME_OBJECT_ID); + setOwnerPacket.data().type = 0x01; + setOwnerPacket.data().actorId = INVALID_GAME_OBJECT_ID; + sendToInRangeSet( setOwnerPacket ); + } + +} + +void Core::Entity::BattleNpc::sendPositionUpdate() +{ + MoveActorPacket movePacket( shared_from_this(), 0x3A, 0x00, 0, 0x5A ); + sendToInRangeSet( movePacket ); +} + +bool Core::Entity::BattleNpc::moveTo( Common::FFXIVARR_POSITION3& pos ) +{ + + if( Math::Util::distance( getPos().x, getPos().y, getPos().z, + pos.x, pos.y, pos.z ) <= 4 ) + // reached destination + return true; + + float rot = Math::Util::calcAngFrom(getPos().x, getPos().z, pos.x, pos.z); + float newRot = PI - rot + (PI / 2); + + face( pos ); + float angle = Math::Util::calcAngFrom( getPos().x, getPos().z, pos.x, pos.z ) + PI; + + float x = static_cast< float >( cosf(angle) * 1.1f ); + float y = ( getPos().y + pos.y ) * 0.5f; // fake value while there is no collision + float z = static_cast< float >( sinf(angle) * 1.1f ); + + Common::FFXIVARR_POSITION3 newPos; + + newPos.x = getPos().x + x; + newPos.y = y; + newPos.z = getPos().z + z; + + setPosition( newPos ); + + Common::FFXIVARR_POSITION3 tmpPos; + tmpPos.x = getPos().x + x; + tmpPos.y = y; + tmpPos.z = getPos().z + z; + + + angle = angle * 2; + setPosition( tmpPos ); + setRotation(newRot); + + sendPositionUpdate(); + + return false; + +} + +void Core::Entity::BattleNpc::aggro( Core::Entity::ActorPtr pActor ) +{ + + m_lastAttack = Util::getTimeMs(); + hateListUpdate( pActor, 1 ); + + changeTarget( pActor->getId() ); + setStance( Stance::Active ); + m_mode = MODE_COMBAT; + + if( pActor->isPlayer() ) + { + PlayerPtr tmpPlayer = pActor->getAsPlayer(); + tmpPlayer->queuePacket( ActorControlPacket142( getId(), 0, 1, 1 ) ); + tmpPlayer->onMobAggro( getAsBattleNpc() ); + } +} + +void Core::Entity::BattleNpc::deaggro( Core::Entity::ActorPtr pActor ) +{ + if( !hateListHasActor( pActor ) ) + hateListRemove( pActor ); + + if( pActor->isPlayer() ) + { + PlayerPtr tmpPlayer = pActor->getAsPlayer(); + tmpPlayer->onMobDeaggro( getAsBattleNpc() ); + } +} + +void Core::Entity::BattleNpc::hateListClear() +{ + auto it = m_hateList.begin(); + for( ; it != m_hateList.end(); ++it ) + { + if( isInRangeSet( ( *it )->m_pActor ) ) + deaggro( ( *it )->m_pActor ); + HateListEntry* tmpListEntry = ( *it ); + delete tmpListEntry; + } + m_hateList.clear(); +} + + +void Core::Entity::BattleNpc::hateListRemove( Core::Entity::ActorPtr pActor ) +{ + auto it = m_hateList.begin(); + for( ; it != m_hateList.end(); ++it ) + { + if( ( *it )->m_pActor == pActor ) + { + HateListEntry* pEntry = *it; + m_hateList.erase( it ); + delete pEntry; + if( pActor->isPlayer() ) + { + PlayerPtr tmpPlayer = pActor->getAsPlayer(); + tmpPlayer->onMobDeaggro( getAsBattleNpc() ); + } + return; + } + } +} + +bool Core::Entity::BattleNpc::hateListHasActor( Core::Entity::ActorPtr pActor ) +{ + auto it = m_hateList.begin(); + for( ; it != m_hateList.end(); ++it ) + { + if( ( *it )->m_pActor == pActor ) + return true; + } + return false; +} + +void Core::Entity::BattleNpc::resetPos() +{ + m_pos = m_posOrigin; +} + +uint32_t Core::Entity::BattleNpc::getNameId() const +{ + return m_nameId; +} + +void Core::Entity::BattleNpc::hateListUpdate( Core::Entity::ActorPtr pActor, int32_t hateAmount ) +{ + + auto it = m_hateList.begin(); + for( ; it != m_hateList.end(); ++it ) + { + if( ( *it )->m_pActor == pActor ) + { + ( *it )->m_hateAmount += hateAmount; + return; + } + } + + HateListEntry* hateEntry = new HateListEntry(); + hateEntry->m_hateAmount = hateAmount; + hateEntry->m_pActor = pActor; + m_hateList.insert( hateEntry ); +} + +void Core::Entity::BattleNpc::onDeath() +{ + //LuaManager->onMobDeath( this ); + + setTimeOfDeath( static_cast< uint32_t >( time( nullptr ) ) ); + setTargetId( INVALID_GAME_OBJECT_ID ); + m_currentStance = Stance::Passive; + m_mode = MODE_IDLE; + m_hp = 0; + setOwner( nullptr ); + + // todo: fully ghetto retarded exp reward pls fix + { + uint32_t minHate = -1; + uint32_t maxHate = 0; + uint32_t totalHate = 0; + for( auto& pHateEntry : m_hateList ) + { + if( pHateEntry->m_pActor->isPlayer() ) + { + if( pHateEntry->m_hateAmount < minHate ) + minHate = pHateEntry->m_hateAmount; + else if( pHateEntry->m_hateAmount > maxHate ) + maxHate = pHateEntry->m_hateAmount; + } + totalHate += pHateEntry->m_hateAmount; + } + + //uint32_t plsBeHatedThisMuchAtLeast = totalHate / ( maxHate + 2 ) / clamp( m_hateList.size(), 1.0f, 1.5f ); + + for( auto& pHateEntry : m_hateList ) + { + // todo: this is pure retarded + // todo: check for companion + if( pHateEntry->m_pActor->isPlayer() ) // && pHateEntry->m_hateAmount >= plsBeHatedThisMuchAtLeast ) + { + auto level = pHateEntry->m_pActor->getLevel(); + auto levelDiff = (int)this->m_level - (int)level; + auto cappedLevelDiff = Math::Util::clamp( levelDiff, 1, 6 ); + + auto expNeeded = g_exdData.m_paramGrowthInfoMap[m_level + cappedLevelDiff - 1].needed_exp; + int32_t exp = 0; + + // todo: arbitrary numbers pulled out of my ass + if( m_level <= 14 ) + exp = ( expNeeded / ( 100 - levelDiff) ) + cappedLevelDiff + ( cappedLevelDiff * ( ( rand() % ( cappedLevelDiff * 9 ) ) + 1 ) ); + else if( m_level <= 24 ) + exp = ( expNeeded / ( 150 - levelDiff) ) + cappedLevelDiff + ( cappedLevelDiff * ( ( rand() % ( cappedLevelDiff * 8 ) ) + 1 ) ); + else if( m_level <= 34 ) + exp = ( expNeeded / ( 350 - levelDiff ) ) + cappedLevelDiff + ( cappedLevelDiff * ( ( rand() % ( cappedLevelDiff * 7 ) ) + 1 ) ); + else if( m_level <= 44 ) + exp = ( expNeeded / ( 550 - levelDiff ) ) + cappedLevelDiff + ( cappedLevelDiff * ( ( rand() % ( cappedLevelDiff * 6 ) ) + 1 ) ); + else if( m_level <= 50 ) + exp = ( expNeeded / ( 750 - levelDiff ) ) + cappedLevelDiff + ( cappedLevelDiff * ( ( rand() % ( cappedLevelDiff * 5 ) ) + 1 ) ); + else + exp = ( expNeeded / ( 1200 - levelDiff ) ) + cappedLevelDiff + ( cappedLevelDiff * ( ( rand() % ( cappedLevelDiff * 4 ) ) + 1 ) ); + + + // todo: this is actually retarded, we need real rand() + srand( time( NULL ) ); + + auto pPlayer = pHateEntry->m_pActor->getAsPlayer(); + pPlayer->gainExp( exp ); + pPlayer->onMobKill( m_nameId ); + } + } + } + hateListClear(); +} + +void Core::Entity::BattleNpc::onActionHostile( Core::Entity::ActorPtr pSource ) +{ + + if( hateListGetHighest() == nullptr ) + aggro( pSource ); + + if( getClaimer() == nullptr ) + setOwner( pSource->getAsPlayer() ); +} + +Core::Entity::ActorPtr Core::Entity::BattleNpc::getClaimer() const +{ + return m_pOwner; +} + + +// HACK: this is highly experimental code, will have to be changed eventually +// since there are different types of mobs... (stationary, moving...) likely to be +// handled by scripts entirely. +void Core::Entity::BattleNpc::update( int64_t currTime ) +{ + + if( !isAlive() ) + { + m_status = ActorStatus::Idle; + m_mode = MODE_IDLE; + return; + } + + //m_pStatusEffectContainer->update(); + float distance = Math::Util::distance( m_pos.x, m_pos.y, m_pos.z, + m_posOrigin.x, m_posOrigin.y, m_posOrigin.z ); + + if( ( distance > 70 ) && m_mode != MODE_RETREAT ) + { + changeTarget( INVALID_GAME_OBJECT_ID ); + m_mode = MODE_RETREAT; + hateListClear(); + setOwner( nullptr ); + } + + switch( m_mode ) + { + + case MODE_RETREAT: + { + if( moveTo( m_posOrigin ) ) + m_mode = MODE_IDLE; + } + break; + + case MODE_IDLE: + { + ActorPtr pClosestActor = getClosestActor(); + + if( ( pClosestActor != nullptr ) && pClosestActor->isAlive() ) + { + distance = Math::Util::distance( getPos().x, getPos().y, getPos().z, + pClosestActor->getPos().x, + pClosestActor->getPos().y, + pClosestActor->getPos().z ); + + //if( distance < 8 && getbehavior() == 2 ) + // aggro( pClosestActor ); + } + } + break; + + case MODE_COMBAT: + { + ActorPtr pClosestActor = hateListGetHighest(); + + if( pClosestActor != nullptr && !pClosestActor->isAlive() ) + { + hateListRemove( pClosestActor ); + pClosestActor = hateListGetHighest(); + } + + if( pClosestActor != nullptr ) + { + distance = Math::Util::distance( getPos().x, getPos().y, getPos().z, + pClosestActor->getPos().x, + pClosestActor->getPos().y, + pClosestActor->getPos().z ); + + if( distance > 4 ) + moveTo( pClosestActor->getPos() ); + else + { + if( face( pClosestActor->getPos() ) ) + sendPositionUpdate(); + // in combat range. ATTACK! + autoAttack( pClosestActor ); + } + } + else + { + changeTarget( INVALID_GAME_OBJECT_ID ); + setStance( Stance::Passive ); + setOwner( nullptr ); + m_mode = MODE_RETREAT; + } + + } + break; + } + +} + +uint32_t Core::Entity::BattleNpc::getTimeOfDeath() const +{ + return m_timeOfDeath; +} + +void Core::Entity::BattleNpc::setTimeOfDeath( uint32_t tod ) +{ + m_timeOfDeath = tod; +} + diff --git a/src/servers/Server_Zone/BattleNpc.h b/src/servers/Server_Zone/BattleNpc.h new file mode 100644 index 00000000..65224fdf --- /dev/null +++ b/src/servers/Server_Zone/BattleNpc.h @@ -0,0 +1,113 @@ +#ifndef _BATTLENPC_H +#define _BATTLENPC_H + +#include "Actor.h" + +namespace Core { + +namespace Entity { + +enum StateMode +{ + MODE_COMBAT, + MODE_RETREAT, + MODE_IDLE, +}; + +typedef struct +{ + uint32_t m_hateAmount; + ActorPtr m_pActor; +} HateListEntry; + +// class for Mobs inheriting from Actor +class BattleNpc : public Actor +{ +public: + BattleNpc(); + ~BattleNpc(); + + BattleNpc( uint32_t modelId, uint32_t nameid, const Common::FFXIVARR_POSITION3& spawnPos, uint32_t sizeId = 0, uint32_t type = 2, uint32_t level = 0, uint32_t behaviour = 1, uint32_t mobType = 0 ); + + //BattleNpc( uint32_t modelId, + // uint32_t nameId, + // uint32_t bnpcBaseId, + // uint32_t level, + // const Common::FFXIVARR_POSITION3& spawnPos, + // uint32_t type = 2, uint32_t behaviour = 1, uint32_t mobType = 0 ); + + // send spawn packets to pTarget + void spawn( PlayerPtr pTarget ) override; + + // send despawn packets to pTarget + void despawn( ActorPtr pTarget ) override; + + uint8_t getLevel() const override; + + StateMode getMode() const; + + void setMode( StateMode mode ); + + uint8_t getbehavior() const; + + void hateListAdd( ActorPtr pActor, int32_t hateAmount ); + + void hateListUpdate( ActorPtr pActor, int32_t hateAmount ); + void hateListRemove( ActorPtr pActor ); + + bool hateListHasActor( ActorPtr pActor ); + + void resetPos(); + + uint32_t getNameId() const; + + void hateListClear(); + + ActorPtr hateListGetHighest(); + + void aggro( ActorPtr pActor ); + + void deaggro( ActorPtr pActor ); + + void setOwner( PlayerPtr pPlayer ); + + void onDeath() override; + + void onActionHostile( Core::Entity::ActorPtr pSource ) override; + + ActorPtr getClaimer() const; + + void sendPositionUpdate(); + + // return true if it reached the position + bool moveTo( Common::FFXIVARR_POSITION3& pos ); + + void update( int64_t currTime ) override; + + uint32_t getTimeOfDeath() const; + + void setTimeOfDeath( uint32_t tod ); + +private: + + static uint32_t m_nextID; + StateMode m_mode; + Common::FFXIVARR_POSITION3 m_posOrigin; + uint8_t m_level; + uint16_t m_modelId; + uint16_t m_nameId; + uint16_t m_bnpcBaseId; + uint8_t m_behavior; + uint32_t m_unk1; + uint32_t m_unk2; + std::set< HateListEntry* > m_hateList; + ActorPtr m_pOwner; + int32_t m_timeOfDeath; + uint32_t m_mobType; + +}; + +} +} + +#endif \ No newline at end of file diff --git a/src/servers/Server_Zone/BattleNpcTemplate.cpp b/src/servers/Server_Zone/BattleNpcTemplate.cpp new file mode 100644 index 00000000..62c21ab1 --- /dev/null +++ b/src/servers/Server_Zone/BattleNpcTemplate.cpp @@ -0,0 +1,37 @@ +#include "BattleNpcTemplate.h" + +Core::Entity::BattleNpcTemplate::BattleNpcTemplate() +{ + +} + +Core::Entity::BattleNpcTemplate::BattleNpcTemplate( std::string templateName, uint32_t bnpcBaseId, + uint32_t bnpcNameId, uint32_t modelId, std::string aiName ) : + m_templateName( templateName ), + m_bnpcBaseId( bnpcBaseId ), + m_bnpcNameId( bnpcNameId ), + m_modelId( modelId ), + m_aiName( aiName ) +{ + +} + +Core::Entity::BattleNpcTemplate::~BattleNpcTemplate() +{ + +} + +uint32_t Core::Entity::BattleNpcTemplate::getBnpcBaseId() const +{ + return m_bnpcBaseId; +} + +uint32_t Core::Entity::BattleNpcTemplate::getBnpcNameId() const +{ + return m_bnpcNameId; +} + +uint32_t Core::Entity::BattleNpcTemplate::getModelId() const +{ + return m_modelId; +} diff --git a/src/servers/Server_Zone/BattleNpcTemplate.h b/src/servers/Server_Zone/BattleNpcTemplate.h new file mode 100644 index 00000000..07e8f5b9 --- /dev/null +++ b/src/servers/Server_Zone/BattleNpcTemplate.h @@ -0,0 +1,38 @@ +#ifndef _BATTLENPCTEMPLATE_H +#define _BATTLENPCTEMPLATE_H + +#include +#include + +namespace Core { +namespace Entity { + + /** + * \brief BattleNpcTemplate - Class which defines a template specific BNpcs can be created from + */ + class BattleNpcTemplate + { + public: + BattleNpcTemplate(); + BattleNpcTemplate( std::string templateName, uint32_t bnpcBaseId, uint32_t bnpcNameId, uint32_t modelId, std::string aiName ); + + ~BattleNpcTemplate(); + + uint32_t getBnpcBaseId() const; + uint32_t getBnpcNameId() const; + uint32_t getModelId() const; + + private: + std::string m_templateName; + std::string m_aiName; + uint32_t m_bnpcBaseId = 0; + uint32_t m_bnpcNameId = 0; + uint32_t m_modelId = 0; + + + }; + +} +} + +#endif \ No newline at end of file diff --git a/src/servers/Server_Zone/CMakeLists.txt b/src/servers/Server_Zone/CMakeLists.txt new file mode 100644 index 00000000..7d4afbce --- /dev/null +++ b/src/servers/Server_Zone/CMakeLists.txt @@ -0,0 +1,87 @@ +cmake_minimum_required(VERSION 2.6) +cmake_policy(SET CMP0015 NEW) +project(Sapphire_Zone) + +include_directories("../../libraries/external/ChaiScript-6.0.0/include/") +include_directories("../../libraries/sapphire/datReader/") +include_directories("../") + +file(GLOB SERVER_PUBLIC_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*") +file(GLOB SERVER_SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}*.c*") + +set(SERVER_COMMON_DIR ../Server_Common) +set(Boost_USE_STATIC_LIBS ON) + +if(UNIX) + include_directories("/usr/include/mysql/") + message(STATUS "Setting GCC flags") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -m32") + + find_package(Boost ${SAPPHIRE_BOOST_VER} COMPONENTS log log_setup thread date_time filesystem system) + if(Boost_FOUND) + set(BOOST_LIBRARY_DIR ${Boost_LIBRARY_DIR}) + else() + if (EXISTS /opt/build_libs/${SAPPHIRE_BOOST_FOLDER_NAME}) + set(Boost_INCLUDE_DIR /opt/build_libs/${SAPPHIRE_BOOST_FOLDER_NAME}) + set(BOOST_LIBRARYDIR /opt/build_libs/${SAPPHIRE_BOOST_FOLDER_NAME}/stage/lib) + find_package(Boost ${SAPPHIRE_BOOST_VER} COMPONENTS log log_setup thread date_time filesystem system) + else() + message(FATAL_ERROR "Unable to find boost ${SAPPHIRE_BOOST_VER} package!") + endif() + endif() +else() + add_definitions(-D_WIN32_WINNT=0x601) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) + include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/MySQL/") + message(STATUS "Setting MSVC flags") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHc") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") + + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/${SAPPHIRE_BOOST_FOLDER_NAME}) + message(STATUS "Using boost in /libraries/external") + set(Boost_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/${SAPPHIRE_BOOST_FOLDER_NAME}) + set(BOOST_LIBRARYDIR ${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/${SAPPHIRE_BOOST_FOLDER_NAME}/lib32-msvc-14.0) + else() + find_package(Boost ${SAPPHIRE_BOOST_VER} COMPONENTS log log_setup thread date_time filesystem system) + if(Boost_FOUND) + set(BOOST_LIBRARY_DIR ${Boost_LIBRARY_DIR}) + elseif ((EXISTS $ENV{BOOST_ROOT_DIR}) AND (EXISTS $ENV{BOOST_LIB_DIR})) + set(Boost_INCLUDE_DIR $ENV{BOOST_ROOT_DIR}) + set(BOOST_LIBRARYDIR $ENV{BOOST_LIB_DIR}) + else() + message(FATAL_ERROR "SapphireError: Unable to find boost ${SAPPHIRE_BOOST_VER} package and environment variables BOOST_ROOT_DIR and BOOST_LIB_DIR not set!") + endif() + endif() +endif() + + +include_directories(${Boost_INCLUDE_DIR}) + +link_directories(${BOOST_LIBRARYDIR}) +link_directories(${SERVER_COMMON_DIR}) +link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/sapphire/datReader) +link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/MySQL) +link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/zlib) + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/") + +add_executable(server_zone ${SERVER_PUBLIC_INCLUDE_FILES} ${SERVER_SOURCE_FILES}) +add_dependencies(server_zone Common xivdat) + +set_target_properties(server_zone PROPERTIES + CXX_STANDARD 14 + CXX_STANDARD_REQUIRED ON + CXX_EXTENSIONS ON + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" + RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" + RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" +) + +if (UNIX) + target_link_libraries (server_zone Common xivdat pthread mysqlclient dl z) +else() + target_link_libraries (server_zone Common xivdat libmysql zlib1) +endif() + +target_link_libraries(server_zone ${Boost_LIBRARIES} ${Boost_LIBRARIES}) diff --git a/src/servers/Server_Zone/Cell.cpp b/src/servers/Server_Zone/Cell.cpp new file mode 100644 index 00000000..2d58a389 --- /dev/null +++ b/src/servers/Server_Zone/Cell.cpp @@ -0,0 +1,171 @@ + +#include "Cell.h" + +#include "Actor.h" +#include "Forwards.h" +#include "Zone.h" +#include "BattleNpc.h" + +// TODO: the entire zone / areahandling is a bit outdated ( in parts i used this for the 1.0 iteration ) +// likely this could be greatly improved or redone +namespace Core +{ + + + Cell::Cell() + : m_bActive(false) + , m_bLoaded(false) + , m_playerCount(0) + , m_bUnloadPending(false) + { + m_bForcedActive = false; + } + + Cell::~Cell() + { + removeActors(); + } + + void Cell::init(uint32_t x, uint32_t y, ZonePtr pZone) + { + //Console->outDebOnly("[Region:%X] Initializing a new cell[%i/%i]", pRegion->getId(), x, y ); + m_pZone = pZone; + m_posX = x; + m_posY = y; + + m_actors.clear(); + } + + void Cell::loadActors(CellCache* pCC) + { + + m_bLoaded = true; + assert(pCC); + + for( auto entry : pCC->battleNpcCache ) + { + + entry->setCurrentZone( m_pZone ); + m_pZone->pushActor( entry ); + + } + } + + void Cell::addActor(Entity::ActorPtr pAct) + { + if(pAct->isPlayer()) + { + //Console->outDebOnly("[Region:%X] Adding player %i to cell[%i/%i]", m_pZone->getId(), pAct->getId(), m_posX, m_posY); + ++m_playerCount; + } + + m_actors.insert(pAct); + } + + void Cell::removeActor(Entity::ActorPtr pAct) + { + if(pAct->isPlayer()) + { + //->outDebOnly("[Region:%X] Removing player %i from cell[%i/%i]", m_pZone->getId(), pAct->getId(), m_posX, m_posY); + --m_playerCount; + } + + m_actors.erase(pAct); + } + + void Cell::setActivity(bool state) + { + if(!m_bActive && state) + { + // Move all objects to active set. + for(auto itr = m_actors.begin(); itr != m_actors.end(); ++itr) + { + + } + + if(m_bUnloadPending) + { + cancelPendingUnload(); + } + + } + else if(m_bActive && !state) + { + // Move all objects from active set. + for(auto itr = m_actors.begin(); itr != m_actors.end(); ++itr) + { + + } + + + } + + m_bActive = state; + + } + void Cell::removeActors() + { + //uint32_t ltime = getMSTime(); + + m_actors.clear(); + + //This time it's simpler! We just remove everything + Entity::ActorPtr pAct; //do this outside the loop! + for(auto itr = m_actors.begin(); itr != m_actors.end();) + { + pAct = (*itr); + itr++; + + if(!pAct) + { + continue; + } + + if(m_bUnloadPending) + { + + } + + } + + m_playerCount = 0; + m_bLoaded = false; + } + + + + void Cell::queueUnloadPending() + { + if(m_bUnloadPending) + { + return; + } + + m_bUnloadPending = true; + + } + + void Cell::cancelPendingUnload() + { + + if(!m_bUnloadPending) + { + return; + } + + } + + void Cell::unload() + { + + assert(m_bUnloadPending); + if(m_bActive) + { + return; + } + + removeActors(); + m_bUnloadPending = false; + } + +} \ No newline at end of file diff --git a/src/servers/Server_Zone/Cell.h b/src/servers/Server_Zone/Cell.h new file mode 100644 index 00000000..ede57a6f --- /dev/null +++ b/src/servers/Server_Zone/Cell.h @@ -0,0 +1,128 @@ + +#ifndef _CELL_H +#define _CELL_H + +#include + +#include "Forwards.h" +#include + +namespace Core { + + + struct CellCache + { + std::vector< Entity::BattleNpcPtr > battleNpcCache; + }; + + typedef std::set< Entity::ActorPtr > ActorSet; + + class Cell + { + friend class Zone; + + private: + bool m_bForcedActive; + uint16_t m_posX; + uint16_t m_posY; + ActorSet m_actors; + bool m_bActive; + bool m_bLoaded; + bool m_bUnloadPending; + + uint16_t m_playerCount; + ZonePtr m_pZone; + + public: + Cell(); + ~Cell(); + + void init(uint32_t x, uint32_t y, ZonePtr pZone); + + void addActor(Entity::ActorPtr pAct); + + void removeActor(Entity::ActorPtr pAct); + + void loadActors(CellCache* pCC); + + bool hasActor(Entity::ActorPtr pAct) + { + return (m_actors.find(pAct) != m_actors.end()); + } + + bool hasPlayers() const + { + return ((m_playerCount > 0) ? true : false); + } + + size_t getActorCount() const + { + return m_actors.size(); + } + + void removeActors(); + + ActorSet::iterator begin() + { + return m_actors.begin(); + } + + ActorSet::iterator end() + { + return m_actors.end(); + } + + void setActivity(bool state); + + bool isActive() const + { + return m_bActive; + } + + bool isLoaded() const + { + return m_bLoaded; + } + + uint32_t getPlayerCount() const + { + return m_playerCount; + } + + bool isUnloadPending() const + { + return m_bUnloadPending; + } + + void setUnloadPending(bool up) + { + m_bUnloadPending = up; + } + + void queueUnloadPending(); + void cancelPendingUnload(); + void unload(); + + void setPermanentActivity(bool val) + { + m_bForcedActive = val; + } + + bool isForcedActive() const + { + return m_bForcedActive; + } + + uint16_t getPosX() const + { + return m_posX; + } + + uint16_t getPosY() const + { + return m_posY; + } + }; + +} +#endif diff --git a/src/servers/Server_Zone/CellHandler.h b/src/servers/Server_Zone/CellHandler.h new file mode 100644 index 00000000..253f4823 --- /dev/null +++ b/src/servers/Server_Zone/CellHandler.h @@ -0,0 +1,178 @@ +#ifndef _CELLHANDLER_H +#define _CELLHANDLER_H + +#define TilesCount 32 +#define TileSize 250.0f +#define _minY (-TilesCount*TileSize/2) +#define _minX (-TilesCount*TileSize/2) + +#define _maxY (TilesCount*TileSize/2) +#define _maxX (TilesCount*TileSize/2) + +#define CellsPerTile 4 +#define _cellSize (TileSize/CellsPerTile) +#define _sizeX (TilesCount*CellsPerTile) +#define _sizeY (TilesCount*CellsPerTile) + +#define GetRelatCoord(Coord,CellCoord) ((_maxX-Coord)-CellCoord*_cellSize) +namespace Core { + +class Zone; + +template +class CellHandler +{ +public: + CellHandler(); + ~CellHandler(); + + T* getCell( uint32_t x, uint32_t y ); + T* getCellByCoords( float x, float y ); + T* create( uint32_t x, uint32_t y ); + T* createByCoords( float x, float y ); + void remove( uint32_t x, uint32_t y ); + + bool allocated( uint32_t x, uint32_t y ) + { + return m_pCells[x][y] != nullptr; + } + + static uint32_t getPosX( float x ); + static uint32_t getPosY( float y ); + +protected: + void _init(); + + + T *** m_pCells; + +}; + +template +CellHandler::CellHandler() +{ + + _init(); +} + + +template +void CellHandler::_init() +{ + m_pCells = new T**[_sizeX]; + + assert( m_pCells ); + for( uint32_t i = 0; i < _sizeX; i++ ) + { + m_pCells[i] = nullptr; + } + +} + +template +CellHandler::~CellHandler() +{ + if( m_pCells ) + { + for( uint32_t i = 0; i < _sizeX; i++ ) + { + if( !m_pCells[i] ) + { + continue; + } + + for( uint32_t j = 0; j < _sizeY; j++ ) + { + if( m_pCells[i][j] ) + { + delete m_pCells[i][j]; + } + } + delete[] m_pCells[i]; + } + delete[] m_pCells; + } +} + +template +T* CellHandler::create( uint32_t x, uint32_t y ) +{ + if( x >= _sizeX || y >= _sizeY ) + { + return nullptr; + } + + if( !m_pCells[x] ) + { + m_pCells[x] = new T*[_sizeY]; + memset( m_pCells[x], 0, sizeof( T* )*_sizeY ); + } + + assert( m_pCells[x][y] == nullptr ); + + T *cls = new T; + m_pCells[x][y] = cls; + + return cls; +} + +template +T* CellHandler::createByCoords( float x, float y ) +{ + return create( getPosX( x ), getPosY( y ) ); +} + +template +void CellHandler::remove( uint32_t x, uint32_t y ) +{ + if( x >= _sizeX || y >= _sizeY ) + { + return; + } + + if( !m_pCells[x] ) + { + return; + } + + assert( m_pCells[x][y] != nullptr ); + + T *cls = m_pCells[x][y]; + m_pCells[x][y] = nullptr; + + delete cls; +} + +template +T* CellHandler::getCell( uint32_t x, uint32_t y ) +{ + if( !m_pCells[x] ) + { + return nullptr; + } + + return m_pCells[x][y]; +} + +template +T* CellHandler::getCellByCoords( float x, float y ) +{ + return getCell( getPosX( x ), getPosY( y ) ); +} + +template +uint32_t CellHandler::getPosX( float x ) +{ + assert( ( x >= _minX ) && ( x <= _maxX ) ); + return ( uint32_t ) ( ( _maxX - x ) / _cellSize ); +} + +template +uint32_t CellHandler::getPosY( float y ) +{ + assert( ( y >= _minY ) && ( y <= _maxY ) ); + return ( uint32_t ) ( ( _maxY - y ) / _cellSize ); +} + +} +#endif diff --git a/src/servers/Server_Zone/CharaPc.cpp b/src/servers/Server_Zone/CharaPc.cpp new file mode 100644 index 00000000..f93462ad --- /dev/null +++ b/src/servers/Server_Zone/CharaPc.cpp @@ -0,0 +1,561 @@ +#include "CharaPc.h" + +uint8_t Core::Entity::CharaDetail::getClass() const +{ + return m_class; +} + +void Core::Entity::CharaDetail::setClass( uint8_t class_ ) +{ + m_class = class_; +} + +bool Core::Entity::CharaDetail::getBIsNewGame() const +{ + return m_bIsNewGame; +} + +void Core::Entity::CharaDetail::setBIsNewGame( bool isNewGame ) +{ + m_bIsNewGame = isNewGame; +} + +uint8_t Core::Entity::CharaDetail::getMakeValid() const +{ + return m_makeValid; +} + +void Core::Entity::CharaDetail::setMakeValid( uint8_t makeValid ) +{ + m_makeValid = makeValid; +} + +uint8_t Core::Entity::CharaDetail::getLegacyEmployEnable() const +{ + return m_legacyEmployEnable; +} + +void Core::Entity::CharaDetail::setLegacyEmployEnable( uint8_t legacyEmployEnable ) +{ + m_legacyEmployEnable = legacyEmployEnable; +} + +uint8_t Core::Entity::CharaDetail::getLegacyCompleteFlag() const +{ + return m_legacyCompleteFlag; +} + +void Core::Entity::CharaDetail::setLegacyCompleteFlag( uint8_t legacyCompleteFlag ) +{ + m_legacyCompleteFlag = legacyCompleteFlag; +} + +uint32_t Core::Entity::CharaDetail::getRemakeFlag() const +{ + return m_remakeFlag; +} + +void Core::Entity::CharaDetail::setRemakeFlag( uint32_t remakeFlag ) +{ + m_remakeFlag = remakeFlag; +} + +uint32_t Core::Entity::CharaDetail::getTotalPlayTime() const +{ + return m_totalPlayTime; +} + +void Core::Entity::CharaDetail::setTotalPlayTime( uint32_t totalPlayTime ) +{ + m_totalPlayTime = totalPlayTime; +} + +float Core::Entity::CharaDetail::getTotalPlayTimeSecond() const +{ + return m_totalPlayTimeSecond; +} + +void Core::Entity::CharaDetail::setTotalPlayTimeSecond( float totalPlayTimeSecond ) +{ + m_totalPlayTimeSecond = totalPlayTimeSecond; +} + +uint8_t Core::Entity::CharaDetail::getInvisible() const +{ + return m_invisible; +} + +void Core::Entity::CharaDetail::setInvisible( uint8_t invisible ) +{ + m_invisible = invisible; +} + +uint8_t Core::Entity::CharaDetail::getFirstClass() const +{ + return m_firstClass; +} + +void Core::Entity::CharaDetail::setFirstClass( uint8_t firstClass ) +{ + m_firstClass = firstClass; +} + +uint8_t Core::Entity::CharaDetail::getHomePoint() const +{ + return m_homePoint; +} + +void Core::Entity::CharaDetail::setHomePoint( uint8_t homePoint ) +{ + m_homePoint = homePoint; +} + +uint32_t Core::Entity::CharaDetail::getRestPoint() const +{ + return m_restPoint; +} + +void Core::Entity::CharaDetail::setRestPoint( uint32_t restPoint ) +{ + m_restPoint = restPoint; +} + +float Core::Entity::CharaDetail::getRentalTimer() const +{ + return m_rentalTimer; +} + +void Core::Entity::CharaDetail::setRentalTimer( float rentalTimer ) +{ + m_rentalTimer = rentalTimer; +} + +float Core::Entity::CharaDetail::getBuddyUpdateTimer() const +{ + return m_buddyUpdateTimer; +} + +void Core::Entity::CharaDetail::setBuddyUpdateTimer( float buddyUpdateTimer ) +{ + m_buddyUpdateTimer = buddyUpdateTimer; +} + +float Core::Entity::CharaDetail::getBuddyTimer() const +{ + return m_buddyTimer; +} + +void Core::Entity::CharaDetail::setBuddyTimer( float buddyTimer ) +{ + m_buddyTimer = buddyTimer; +} + +uint8_t Core::Entity::CharaDetail::getBuddyRank() const +{ + return m_buddyRank; +} + +void Core::Entity::CharaDetail::setBuddyRank( uint8_t buddyRank ) +{ + m_buddyRank = buddyRank; +} + +uint8_t Core::Entity::CharaDetail::getBuddyAdditionSkillPoint() const +{ + return m_buddyAdditionSkillPoint; +} + +void Core::Entity::CharaDetail::setBuddyAdditionSkillPoint( uint8_t buddyAdditionSkillPoint ) +{ + m_buddyAdditionSkillPoint = buddyAdditionSkillPoint; +} + +uint32_t Core::Entity::CharaDetail::getBuddyExp() const +{ + return m_buddyExp; +} + +void Core::Entity::CharaDetail::setBuddyExp( uint32_t buddyExp ) +{ + m_buddyExp = buddyExp; +} + +uint32_t Core::Entity::CharaDetail::getBuddyCommand() const +{ + return m_buddyCommand; +} + +void Core::Entity::CharaDetail::setBuddyCommand( uint32_t buddyCommand ) +{ + m_buddyCommand = buddyCommand; +} + +uint32_t Core::Entity::CharaDetail::getBuddyHp() const +{ + return m_buddyHp; +} + +void Core::Entity::CharaDetail::setBuddyHp( uint32_t buddyHp ) +{ + m_buddyHp = buddyHp; +} + +uint8_t Core::Entity::CharaDetail::getGuardianDeity() const +{ + return m_guardianDeity; +} + +void Core::Entity::CharaDetail::setGuardianDeity( uint8_t guardianDeity ) +{ + m_guardianDeity = guardianDeity; +} + +uint8_t Core::Entity::CharaDetail::getBirthMonth() const +{ + return m_birthMonth; +} + +void Core::Entity::CharaDetail::setBirthMonth( uint8_t birthMonth ) +{ + m_birthMonth = birthMonth; +} + +uint8_t Core::Entity::CharaDetail::getBirthday() const +{ + return m_birthday; +} + +void Core::Entity::CharaDetail::setBirthday( uint8_t birthday ) +{ + m_birthday = birthday; +} + +uint8_t Core::Entity::CharaDetail::getStartTown() const +{ + return m_startTown; +} + +void Core::Entity::CharaDetail::setStartTown( uint8_t startTown ) +{ + m_startTown = startTown; +} + +uint16_t Core::Entity::CharaDetail::getActiveTitle() const +{ + return m_activeTitle; +} + +void Core::Entity::CharaDetail::setActiveTitle( uint16_t activeTitle ) +{ + m_activeTitle = activeTitle; +} + +uint16_t Core::Entity::CharaDetail::getEquippedMannequin() const +{ + return m_equippedMannequin; +} + +void Core::Entity::CharaDetail::setEquippedMannequin( uint16_t equippedMannequin ) +{ + m_equippedMannequin = equippedMannequin; +} + +uint32_t Core::Entity::CharaDetail::getTomeStoneCounter() const +{ + return m_tomeStoneCounter; +} + +void Core::Entity::CharaDetail::setTomeStoneCounter( uint32_t tomeStoneCounter ) +{ + m_tomeStoneCounter = tomeStoneCounter; +} + +float Core::Entity::CharaDetail::getTomeStomeTimer() const +{ + return m_tomeStomeTimer; +} + +void Core::Entity::CharaDetail::setTomeStomeTimer( float tomeStomeTimer ) +{ + m_tomeStomeTimer = tomeStomeTimer; +} + +uint16_t Core::Entity::CharaDetail::getConfigFlags() const +{ + return m_configFlags; +} + +void Core::Entity::CharaDetail::setConfigFlags( uint16_t configFlags ) +{ + m_configFlags = configFlags; +} + +uint8_t Core::Entity::CharaDetail::getGmIcon() const +{ + return m_gmIcon; +} + +void Core::Entity::CharaDetail::setGmIcon( uint8_t gmIcon ) +{ + m_gmIcon = gmIcon; +} + +uint8_t Core::Entity::CharaDetail::getGmBind() const +{ + return m_gmBind; +} + +void Core::Entity::CharaDetail::setGmBind( uint8_t gmBind ) +{ + m_gmBind = gmBind; +} + +uint32_t Core::Entity::CharaDetail::getCatchCount() const +{ + return m_catchCount; +} + +void Core::Entity::CharaDetail::setCatchCount( uint32_t catchCount ) +{ + m_catchCount = catchCount; +} + +uint32_t Core::Entity::CharaDetail::getUseBaitCatalogId() const +{ + return m_useBaitCatalogId; +} + +void Core::Entity::CharaDetail::setUseBaitCatalogId( uint32_t useBaitCatalogId ) +{ + m_useBaitCatalogId = useBaitCatalogId; +} + +uint8_t Core::Entity::CharaDetail::getOpeningSequence() const +{ + return m_openingSequence; +} + +void Core::Entity::CharaDetail::setOpeningSequence( uint8_t openingSequence ) +{ + m_openingSequence = openingSequence; +} + +uint8_t Core::Entity::CharaDetail::getLeveTicketNum() const +{ + return m_leveTicketNum; +} + +void Core::Entity::CharaDetail::setLeveTicketNum( uint8_t leveTicketNum ) +{ + m_leveTicketNum = leveTicketNum; +} + +uint32_t Core::Entity::CharaDetail::getLeveTicketLastGetTime() const +{ + return m_leveTicketLastGetTime; +} + +void Core::Entity::CharaDetail::setLeveTicketLastGetTime( uint32_t leveTicketLastGetTime ) +{ + m_leveTicketLastGetTime = leveTicketLastGetTime; +} + +uint16_t Core::Entity::CharaDetail::getLeveAssignmentSeed() const +{ + return m_leveAssignmentSeed; +} + +void Core::Entity::CharaDetail::setLeveAssignmentSeed( uint16_t leveAssignmentSeed ) +{ + m_leveAssignmentSeed = leveAssignmentSeed; +} + +uint8_t Core::Entity::CharaDetail::getLeveAssignmentCount() const +{ + return m_leveAssignmentCount; +} + +void Core::Entity::CharaDetail::setLeveAssignmentCount( uint8_t leveAssignmentCount ) +{ + m_leveAssignmentCount = leveAssignmentCount; +} + +uint16_t Core::Entity::CharaDetail::getGuildleveFactionCreditBr() const +{ + return m_guildleveFactionCreditBr; +} + +void Core::Entity::CharaDetail::setGuildleveFactionCreditBr( uint16_t guildleveFactionCreditBr ) +{ + m_guildleveFactionCreditBr = guildleveFactionCreditBr; +} + +uint16_t Core::Entity::CharaDetail::getGuildleveFactionCreditAz() const +{ + return m_guildleveFactionCreditAz; +} + +void Core::Entity::CharaDetail::setGuildleveFactionCreditAz( uint16_t guildleveFactionCreditAz ) +{ + m_guildleveFactionCreditAz = guildleveFactionCreditAz; +} + +uint16_t Core::Entity::CharaDetail::getGuildleveFactionCreditHo() const +{ + return m_guildleveFactionCreditHo; +} + +void Core::Entity::CharaDetail::setGuildleveFactionCreditHo( uint16_t guildleveFactionCreditHo ) +{ + m_guildleveFactionCreditHo = guildleveFactionCreditHo; +} + +uint8_t Core::Entity::CharaDetail::getGrandCompany() const +{ + return m_grandCompany; +} + +void Core::Entity::CharaDetail::setGrandCompany( uint8_t grandCompany ) +{ + m_grandCompany = grandCompany; +} + +uint8_t Core::Entity::CharaDetail::getGearsetMaxNum() const +{ + return m_gearsetMaxNum; +} + +void Core::Entity::CharaDetail::setGearsetMaxNum( uint8_t gearsetMaxNum ) +{ + m_gearsetMaxNum = gearsetMaxNum; +} + +uint32_t Core::Entity::CharaDetail::getContentJoinTime() const +{ + return m_contentJoinTime; +} + +void Core::Entity::CharaDetail::setContentJoinTime( uint32_t contentJoinTime ) +{ + m_contentJoinTime = contentJoinTime; +} + +uint32_t Core::Entity::CharaDetail::getPathId() const +{ + return m_pathId; +} + +void Core::Entity::CharaDetail::setPathId( uint32_t pathId ) +{ + m_pathId = pathId; +} + +uint16_t Core::Entity::CharaDetail::getStepIndex() const +{ + return m_stepIndex; +} + +void Core::Entity::CharaDetail::setStepIndex( uint16_t stepIndex ) +{ + m_stepIndex = stepIndex; +} + +uint32_t Core::Entity::CharaDetail::getPathIdBackUp() const +{ + return m_pathIdBackUp; +} + +void Core::Entity::CharaDetail::setPathIdBackUp( uint32_t pathIdBackUp ) +{ + m_pathIdBackUp = pathIdBackUp; +} + +uint16_t Core::Entity::CharaDetail::getStepIndexBackUp() const +{ + return m_stepIndexBackUp; +} + +void Core::Entity::CharaDetail::setStepIndexBackUp( uint16_t stepIndexBackUp ) +{ + m_stepIndexBackUp = stepIndexBackUp; +} + +uint8_t Core::Entity::CharaDetail::getGcSupplySeed() const +{ + return m_gcSupplySeed; +} + +void Core::Entity::CharaDetail::setGcSupplySeed( uint8_t gcSupplySeed ) +{ + m_gcSupplySeed = gcSupplySeed; +} + +uint32_t Core::Entity::CharaDetail::getGcSupplyTime() const +{ + return m_gcSupplyTime; +} + +void Core::Entity::CharaDetail::setGcSupplyTime( uint32_t gcSupplyTime ) +{ + m_gcSupplyTime = gcSupplyTime; +} + +uint32_t Core::Entity::CharaDetail::getLayerSet() const +{ + return m_layerSet; +} + +void Core::Entity::CharaDetail::setLayerSet( uint32_t layerSet ) +{ + m_layerSet = layerSet; +} + +uint16_t Core::Entity::CharaDetail::getGcChangeTime() const +{ + return m_gcChangeTime; +} + +void Core::Entity::CharaDetail::setGcChangeTime( uint16_t gcChangeTime ) +{ + m_gcChangeTime = gcChangeTime; +} + +uint8_t Core::Entity::CharaDetail::getFateFlag() const +{ + return m_fateFlag; +} + +void Core::Entity::CharaDetail::setFateFlag( uint8_t fateFlag ) +{ + m_fateFlag = fateFlag; +} + +uint8_t Core::Entity::CharaDetail::getContentRaidCounter() const +{ + return m_contentRaidCounter; +} + +void Core::Entity::CharaDetail::setContentRaidCounter( uint8_t contentRaidCounter ) +{ + m_contentRaidCounter = contentRaidCounter; +} + +uint16_t Core::Entity::CharaDetail::getContentRaidTimer() const +{ + return m_contentRaidTimer; +} + +void Core::Entity::CharaDetail::setContentRaidTimer( uint16_t contentRaidTimer ) +{ + m_contentRaidTimer = contentRaidTimer; +} + +uint64_t Core::Entity::CharaDetail::getId() const +{ + return m_id; +} + +void Core::Entity::CharaDetail::setId( uint64_t id ) +{ + m_id = id; +} diff --git a/src/servers/Server_Zone/CharaPc.h b/src/servers/Server_Zone/CharaPc.h new file mode 100644 index 00000000..cbf013f1 --- /dev/null +++ b/src/servers/Server_Zone/CharaPc.h @@ -0,0 +1,299 @@ +#ifndef _CHARA_H_ +#define _CHARA_H_ + +#include +#include + +#include "Forwards.h" +#include +#include + +namespace Core +{ + namespace Entity + { + + class CharaDetail + { + + private: + + // CHARAPC data ------------------------------------------------------------------------------------ + uint8_t m_class; + bool m_bIsNewGame; + uint8_t m_makeValid; + + struct RetainerInfo + { + uint32_t retainerId; + char retainerName[32]; + uint32_t createUnixTime; + bool isActive; + bool isRename; + uint8_t status; + } m_retainerInfo[8]; + + uint8_t m_legacyEmployEnable; + char m_platform[32]; + uint8_t m_legacyCompleteFlag; + uint32_t m_remakeFlag; + uint32_t m_totalPlayTime; + float m_totalPlayTimeSecond; + + uint8_t m_invisible; + uint8_t m_firstClass; + uint8_t m_homePoint; + uint8_t m_favoritePoint[3]; + + uint32_t m_restPoint; + float m_rentalTimer; + float m_buddyUpdateTimer; + float m_buddyTimer; + char m_buddyName[21]; + uint8_t m_possession[8]; + uint8_t m_buddyEquip[3]; + uint8_t m_buddyRank; + uint8_t m_buddyAdditionSkillPoint; + uint8_t m_buddySkillLine[3]; + uint32_t m_buddyExp; + uint32_t m_buddyCommand; + uint32_t m_buddyHp; + + uint8_t m_guardianDeity; + uint8_t m_birthMonth; + uint8_t m_birthday; + uint8_t m_startTown; + uint8_t m_mountList[11]; + uint16_t m_activeTitle; + uint8_t m_titleList[32]; + uint8_t m_reward[16]; + + struct HuntingLogInfo + { + uint8_t killCount[40]; + uint64_t completeFlags; + uint8_t currentRank; + uint32_t isNewFlags; + } m_huntingLogInfo[10]; + + uint8_t m_aetheryteList[12]; + + uint8_t m_howTo[32]; + uint8_t m_minions[32]; + uint8_t m_cutScene[64]; + uint16_t m_equippedMannequin; + uint32_t m_tomeStoneCounter; + float m_tomeStomeTimer; + + uint16_t m_configFlags; + uint8_t m_gmIcon; + uint8_t m_gmBind; + + uint32_t m_catchCount; + uint8_t m_isFishCaught[50]; + uint8_t m_isSpotVisited[25]; + uint8_t m_lastFishSize[36]; + uint8_t m_lastFishId[36]; + uint32_t m_useBaitCatalogId; + + uint8_t m_gatheringHistoryPointId[8]; + uint8_t m_gatheringDivisionOpenFlags[40]; + uint8_t m_gatheringItemGetFlags[60]; + + uint8_t m_recipeDevisionOpenFlags[80]; + uint8_t m_recipeCreateFlags[250]; + + uint8_t m_questCompleteFlags[200]; + uint8_t m_legacyQuestCompleteFlags[40]; + uint8_t m_legacyCompleteFlags[200]; + + struct LeveInfo + { + uint8_t leves[28]; + } m_leveInfo[16]; + + uint8_t m_openingSequence; + + // I really do not know what this is for + //`Type` TINYINT( 3 ) UNSIGNED, + //`Index` TINYINT( 3 ) UNSIGNED, + //Type_0 TINYINT( 3 ) UNSIGNED, + //Index_0 TINYINT( 3 ) UNSIGNED, + //Type_1 TINYINT( 3 ) UNSIGNED, + //Index_1 TINYINT( 3 ) UNSIGNED, + //Type_2 TINYINT( 3 ) UNSIGNED, + //Index_2 TINYINT( 3 ) UNSIGNED, + //Type_3 TINYINT( 3 ) UNSIGNED, + //Index_3 TINYINT( 3 ) UNSIGNED, + + uint8_t m_leveTicketNum; + uint32_t m_leveTicketLastGetTime; + uint16_t m_leveAssignmentSeed; + uint8_t m_leveAssignmentCount; + + uint16_t m_guildleveFactionCreditBr; + uint16_t m_guildleveFactionCreditAz; + uint16_t m_guildleveFactionCreditHo; + + uint8_t m_grandCompany; + uint8_t m_grandCompanyRank[3]; + uint8_t m_gearsetMaxNum; + + uint8_t m_discoveryWork[414]; + + uint32_t m_contentJoinTime; + uint8_t m_contentRaidClearFlags[28]; + uint8_t m_contentDungeonClearFlags[18]; + uint8_t m_contentGuildOrderClearFlags[10]; + uint8_t m_contentBossBattleClearFlags[6]; + uint8_t m_contentColosseumClearFlags[2]; + uint8_t m_contentRaidAttainFlags[28]; + uint8_t m_contentDungeonAttainFlag[18]; + uint8_t m_contentGuildOrderAttainFlags[10]; + uint8_t m_contentBossBattleAttainFlags[6]; + uint8_t m_contentColosseumAttainFlags[2]; + + // related to currently active choco taxi?? + uint32_t m_pathId; + uint16_t m_stepIndex; + uint32_t m_pathIdBackUp; + + uint16_t m_stepIndexBackUp; + + uint8_t m_chocoboTaxiStandFlags[8]; + uint8_t m_companion[16]; + + uint8_t m_cabinet[32]; + uint8_t m_contentFinderPenalties[2]; + uint8_t m_gcSupplyItemFlags[4]; + uint8_t m_gcSupplySeed; + uint32_t m_gcSupplyTime; + uint8_t m_gcSupplyClassLevel[11]; + + uint32_t m_layerSet; + uint8_t m_trophyAcquisitionFlags[8]; + uint16_t m_gcChangeTime; + uint8_t m_fateFlag; + uint8_t m_contentRaidCounter; + uint16_t m_contentRaidTimer; + + uint64_t m_id; + public: + uint8_t getClass() const; + void setClass( uint8_t class_ ); + bool getBIsNewGame() const; + void setBIsNewGame( bool isNewGame ); + uint8_t getMakeValid() const; + void setMakeValid( uint8_t makeValid ); + uint8_t getLegacyEmployEnable() const; + void setLegacyEmployEnable( uint8_t legacyEmployEnable ); + uint8_t getLegacyCompleteFlag() const; + void setLegacyCompleteFlag( uint8_t legacyCompleteFlag ); + uint32_t getRemakeFlag() const; + void setRemakeFlag( uint32_t remakeFlag ); + uint32_t getTotalPlayTime() const; + void setTotalPlayTime( uint32_t totalPlayTime ); + float getTotalPlayTimeSecond() const; + void setTotalPlayTimeSecond( float totalPlayTimeSecond ); + uint8_t getInvisible() const; + void setInvisible( uint8_t invisible ); + uint8_t getFirstClass() const; + void setFirstClass( uint8_t firstClass ); + uint8_t getHomePoint() const; + void setHomePoint( uint8_t homePoint ); + uint32_t getRestPoint() const; + void setRestPoint( uint32_t restPoint ); + float getRentalTimer() const; + void setRentalTimer( float rentalTimer ); + float getBuddyUpdateTimer() const; + void setBuddyUpdateTimer( float buddyUpdateTimer ); + float getBuddyTimer() const; + void setBuddyTimer( float buddyTimer ); + uint8_t getBuddyRank() const; + void setBuddyRank( uint8_t buddyRank ); + uint8_t getBuddyAdditionSkillPoint() const; + void setBuddyAdditionSkillPoint( uint8_t buddyAdditionSkillPoint ); + uint32_t getBuddyExp() const; + void setBuddyExp( uint32_t buddyExp ); + uint32_t getBuddyCommand() const; + void setBuddyCommand( uint32_t buddyCommand ); + uint32_t getBuddyHp() const; + void setBuddyHp( uint32_t buddyHp ); + uint8_t getGuardianDeity() const; + void setGuardianDeity( uint8_t guardianDeity ); + uint8_t getBirthMonth() const; + void setBirthMonth( uint8_t birthMonth ); + uint8_t getBirthday() const; + void setBirthday( uint8_t birthday ); + uint8_t getStartTown() const; + void setStartTown( uint8_t startTown ); + uint16_t getActiveTitle() const; + void setActiveTitle( uint16_t activeTitle ); + uint16_t getEquippedMannequin() const; + void setEquippedMannequin( uint16_t equippedMannequin ); + uint32_t getTomeStoneCounter() const; + void setTomeStoneCounter( uint32_t tomeStoneCounter ); + float getTomeStomeTimer() const; + void setTomeStomeTimer( float tomeStomeTimer ); + uint16_t getConfigFlags() const; + void setConfigFlags( uint16_t configFlags ); + uint8_t getGmIcon() const; + void setGmIcon( uint8_t gmIcon ); + uint8_t getGmBind() const; + void setGmBind( uint8_t gmBind ); + uint32_t getCatchCount() const; + void setCatchCount( uint32_t catchCount ); + uint32_t getUseBaitCatalogId() const; + void setUseBaitCatalogId( uint32_t useBaitCatalogId ); + uint8_t getOpeningSequence() const; + void setOpeningSequence( uint8_t openingSequence ); + uint8_t getLeveTicketNum() const; + void setLeveTicketNum( uint8_t leveTicketNum ); + uint32_t getLeveTicketLastGetTime() const; + void setLeveTicketLastGetTime( uint32_t leveTicketLastGetTime ); + uint16_t getLeveAssignmentSeed() const; + void setLeveAssignmentSeed( uint16_t leveAssignmentSeed ); + uint8_t getLeveAssignmentCount() const; + void setLeveAssignmentCount( uint8_t leveAssignmentCount ); + uint16_t getGuildleveFactionCreditBr() const; + void setGuildleveFactionCreditBr( uint16_t guildleveFactionCreditBr ); + uint16_t getGuildleveFactionCreditAz() const; + void setGuildleveFactionCreditAz( uint16_t guildleveFactionCreditAz ); + uint16_t getGuildleveFactionCreditHo() const; + void setGuildleveFactionCreditHo( uint16_t guildleveFactionCreditHo ); + uint8_t getGrandCompany() const; + void setGrandCompany( uint8_t grandCompany ); + uint8_t getGearsetMaxNum() const; + void setGearsetMaxNum( uint8_t gearsetMaxNum ); + uint32_t getContentJoinTime() const; + void setContentJoinTime( uint32_t contentJoinTime ); + uint32_t getPathId() const; + void setPathId( uint32_t pathId ); + uint16_t getStepIndex() const; + void setStepIndex( uint16_t stepIndex ); + uint32_t getPathIdBackUp() const; + void setPathIdBackUp( uint32_t pathIdBackUp ); + uint16_t getStepIndexBackUp() const; + void setStepIndexBackUp( uint16_t stepIndexBackUp ); + uint8_t getGcSupplySeed() const; + void setGcSupplySeed( uint8_t gcSupplySeed ); + uint32_t getGcSupplyTime() const; + void setGcSupplyTime( uint32_t gcSupplyTime ); + uint32_t getLayerSet() const; + void setLayerSet( uint32_t layerSet ); + uint16_t getGcChangeTime() const; + void setGcChangeTime( uint16_t gcChangeTime ); + uint8_t getFateFlag() const; + void setFateFlag( uint8_t fateFlag ); + uint8_t getContentRaidCounter() const; + void setContentRaidCounter( uint8_t contentRaidCounter ); + uint16_t getContentRaidTimer() const; + void setContentRaidTimer( uint16_t contentRaidTimer ); + uint64_t getId() const; + void setId( uint64_t id ); + + // CHARAPC data END ------------------------------------------------------------------------------------ + }; + } +} +#endif \ No newline at end of file diff --git a/src/servers/Server_Zone/ChatPacket.h b/src/servers/Server_Zone/ChatPacket.h new file mode 100644 index 00000000..a1353281 --- /dev/null +++ b/src/servers/Server_Zone/ChatPacket.h @@ -0,0 +1,41 @@ +#ifndef _CHATPACKET_H +#define _CHATPACKET_H + +#include +#include +#include "Forwards.h" + + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +/** +* @brief The Chat packet. +*/ +class ChatPacket : + public GamePacketNew< FFXIVIpcChat > +{ +public: + ChatPacket( Entity::PlayerPtr player, Common::ChatType chatType, const std::string& msg ) : + GamePacketNew( player->getId(), player->getId() ) + { + initialize( player, chatType, msg ); + }; + +private: + void initialize( Entity::PlayerPtr player, Common::ChatType chatType, const std::string& msg ) + { + m_data.chatType = chatType; + strcpy( m_data.name, player->getName().c_str() ); + strcpy( m_data.msg, msg.c_str() ); + }; +}; + +} +} +} +} + +#endif /*_CHATPACKET_H*/ \ No newline at end of file diff --git a/src/servers/Server_Zone/Event.cpp b/src/servers/Server_Zone/Event.cpp new file mode 100644 index 00000000..272084b3 --- /dev/null +++ b/src/servers/Server_Zone/Event.cpp @@ -0,0 +1,73 @@ +#include "Event.h" + +Core::Event::Event::Event( uint64_t actorId, uint32_t eventId, uint8_t eventType, uint8_t eventParam2, uint32_t eventParam3 ) + : m_actorId( actorId ), + m_eventId( eventId ), + m_playedScene( false ) +{ + + m_param1 = static_cast< uint16_t >( eventId ); + m_param2 = static_cast< uint16_t >( eventId >> 16 ); + + m_eventType = eventType; + m_eventParam2 = eventParam2; + m_eventParam3 = eventParam3; + + m_callback = nullptr; +} + +uint64_t Core::Event::Event::getActorId() const +{ + return m_actorId; +} + +uint32_t Core::Event::Event::getId() const +{ + return m_eventId; +} + +uint32_t Core::Event::Event::getParam1() const +{ + return m_param1; +} + +uint16_t Core::Event::Event::getParam2() const +{ + return m_param2; +} + +uint8_t Core::Event::Event::getEventType() const +{ + return m_eventType; +} + +uint32_t Core::Event::Event::getEventParam2() const +{ + return m_eventParam2; +} + +uint32_t Core::Event::Event::getEventParam3() const +{ + return m_eventParam3; +} + +Core::Scripting::EventReturnCallback Core::Event::Event::getEventReturnCallback() const +{ + return m_callback; +} + +void Core::Event::Event::setEventReturnCallback( Core::Scripting::EventReturnCallback callback ) +{ + m_callback = callback; +} + + +bool Core::Event::Event::hasPlayedScene() const +{ + return m_playedScene; +} + +void Core::Event::Event::setPlayedScene( bool playedScene ) +{ + m_playedScene = playedScene; +} diff --git a/src/servers/Server_Zone/Event.h b/src/servers/Server_Zone/Event.h new file mode 100644 index 00000000..184d4d71 --- /dev/null +++ b/src/servers/Server_Zone/Event.h @@ -0,0 +1,78 @@ +#ifndef _EVENT_H +#define _EVENT_H + +#include "Forwards.h" + +namespace Core { + namespace Event { + + class Event + { + public: + Event( uint64_t actorId, uint32_t eventId, uint8_t eventType, uint8_t eventParam2, uint32_t eventParam3 ); + + ~Event() {} + + uint64_t getActorId() const; + + uint32_t getId() const; + + uint32_t getParam1() const; + + uint16_t getParam2() const; + + uint8_t getEventType() const; + + uint32_t getEventParam2() const; + + uint32_t getEventParam3() const; + + bool hasPlayedScene() const; + + void setPlayedScene( bool playedScene ); + + Scripting::EventReturnCallback getEventReturnCallback() const; + + void setEventReturnCallback( Scripting::EventReturnCallback callback ); + + enum EventType : uint8_t + { + Talk = 1, + Emote = 2, + DistanceBelow = 3, + DistanceOver = 4, + BattleReward = 5, + Craft = 6, + Nest = 7, + Item = 8, + Drop = 9, + WithinRange = 10, + OutsideRange = 11, + GameStart = 12, + GameProgress = 13, + EnterTerritory = 15, + GameComeBack = 17, + ActionResult = 18, + MateriaCraft = 19, + Fishing = 20, + UI = 21, + Housing = 22, + Say = 23, + TableGame = 24, + }; + + protected: + uint64_t m_actorId; + uint32_t m_eventId; + uint32_t m_param1; + uint16_t m_param2; + uint8_t m_eventType; + uint8_t m_eventParam2; + uint32_t m_eventParam3; + bool m_playedScene; + Scripting::EventReturnCallback m_callback; + }; + + } +} +#endif diff --git a/src/servers/Server_Zone/EventAction.cpp b/src/servers/Server_Zone/EventAction.cpp new file mode 100644 index 00000000..7f4b427b --- /dev/null +++ b/src/servers/Server_Zone/EventAction.cpp @@ -0,0 +1,141 @@ +#include +#include +#include + +#include "EventAction.h" +#include "ActorControlPacket142.h" +#include "ActorControlPacket143.h" +#include "Player.h" +#include "Event.h" + +extern Core::Logger g_log; +extern Core::Data::ExdData g_exdData; + +using namespace Core::Common; +using namespace Core::Network; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +Core::Action::EventAction::EventAction() +{ + m_actionType = Common::ActionType::Event; +} + +Core::Action::EventAction::EventAction( Entity::ActorPtr pActor, uint32_t eventId, uint16_t action, + ActionCallback finishRef, ActionCallback interruptRef, uint64_t additional ) +{ + m_additional = additional; + m_actionType = ActionType::Event; + m_eventId = eventId; + m_id = action; + m_castTime = g_exdData.m_EventActionInfoMap[action].castTime; // TODO: Add security checks. + m_onActionFinishClb = finishRef; + m_onActionInterruptClb = interruptRef; + m_pSource = pActor; + m_bInterrupt = false; +} + +Core::Action::EventAction::~EventAction() +{ + +} + +void Core::Action::EventAction::onStart() +{ + if( !m_pSource ) + return; + + m_startTime = Util::getTimeMs(); + + auto control = ActorControlPacket142( m_pSource->getId(), Common::ActorControlType::CastStart, + 1, m_id, 0x4000002F ); + + if( m_pSource->isPlayer() ) + { + m_pSource->sendToInRangeSet( control, true ); + m_pSource->getAsPlayer()->setStateFlag( PlayerStateFlag::NoCombat ); + m_pSource->getAsPlayer()->setStateFlag( PlayerStateFlag::Occupied1 ); + m_pSource->getAsPlayer()->sendStateFlags(); + } + else + m_pSource->sendToInRangeSet( control ); +} + +void Core::Action::EventAction::onFinish() +{ + if( !m_pSource ) + return; + + try + { + auto pEvent = m_pSource->getAsPlayer()->getEvent( m_eventId ); + + pEvent->setPlayedScene( false ); + + if( m_onActionFinishClb ) + m_onActionFinishClb( *m_pSource->getAsPlayer(), m_eventId, m_additional ); + + auto control = ActorControlPacket142( m_pSource->getId(), Common::ActorControlType::CastStart, 0, m_id ); + + + if( !pEvent->hasPlayedScene() ) + m_pSource->getAsPlayer()->eventFinish( m_eventId, 1 ); + else + pEvent->setPlayedScene( false ); + + if( m_pSource->isPlayer() ) + { + m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::NoCombat ); + m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Occupied1 ); + m_pSource->getAsPlayer()->sendStateFlags(); + m_pSource->sendToInRangeSet( control, true ); + } + else + m_pSource->sendToInRangeSet( control ); + } + catch( std::exception& e ) + { + g_log.error( e.what() ); + } + +} + +void Core::Action::EventAction::onInterrupt() +{ + if( !m_pSource ) + return; + + try + { + + auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, + 0x219, 0x04, m_id ); + + if( m_pSource->isPlayer() ) + { + auto control1 = ActorControlPacket143( m_pSource->getId(), ActorControlType::FreeEventPos, m_eventId ); + + m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::NoCombat ); + m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Occupied1 ); + m_pSource->getAsPlayer()->sendStateFlags(); + m_pSource->sendToInRangeSet( control ); + m_pSource->sendToInRangeSet( control1 ); + + m_pSource->getAsPlayer()->queuePacket( control1 ); + m_pSource->getAsPlayer()->queuePacket( control ); + m_pSource->getAsPlayer()->eventFinish( m_eventId, 1 ); + + } + else + m_pSource->sendToInRangeSet( control ); + + if( m_onActionInterruptClb ) + m_onActionInterruptClb( *m_pSource->getAsPlayer(), m_eventId, m_additional ); + + } + catch( std::exception& e ) + { + g_log.error( e.what() ); + } + +} diff --git a/src/servers/Server_Zone/EventAction.h b/src/servers/Server_Zone/EventAction.h new file mode 100644 index 00000000..7e956d93 --- /dev/null +++ b/src/servers/Server_Zone/EventAction.h @@ -0,0 +1,37 @@ +#ifndef _EVENTACTION_H_ +#define _EVENTACTION_H_ + +#include + +#include "Forwards.h" +#include "Action.h" + +namespace Core { namespace Action { + + class EventAction : public Action + { + + public: + EventAction(); + ~EventAction(); + + EventAction( Entity::ActorPtr pActor, uint32_t eventId, uint16_t action, + ActionCallback finishRef, ActionCallback interruptRef, uint64_t additional ); + + void onStart() override; + void onFinish() override; + void onInterrupt() override; + + private: + uint32_t m_eventId; + uint64_t m_additional; + + ActionCallback m_onActionFinishClb; + ActionCallback m_onActionInterruptClb; + + }; + +} +} + +#endif \ No newline at end of file diff --git a/src/servers/Server_Zone/EventFinishPacket.h b/src/servers/Server_Zone/EventFinishPacket.h new file mode 100644 index 00000000..5dd6f520 --- /dev/null +++ b/src/servers/Server_Zone/EventFinishPacket.h @@ -0,0 +1,44 @@ +#ifndef _EVENTFINISH_H +#define _EVENTFINISH_H + +#include + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +/** +* @brief The packet sent to finish an event. +*/ +class EventFinishPacket : public GamePacketNew< FFXIVIpcEventFinish > +{ +public: + EventFinishPacket( uint32_t playerId, + uint32_t eventId, + uint8_t param1, + uint32_t param3 ) : + GamePacketNew< FFXIVIpcEventFinish >( playerId, playerId ) + { + initialize( eventId, param1, param3 ); + }; + +private: + void initialize( uint32_t eventId, + uint8_t param1, + uint32_t param3 ) + { + m_data.eventId = eventId; + m_data.param1 = param1; + m_data.param2 = 1; + m_data.param3 = param3; + + }; +}; + +} +} +} +} + +#endif /*_EVENTFINISH_H*/ \ No newline at end of file diff --git a/src/servers/Server_Zone/EventHelper.cpp b/src/servers/Server_Zone/EventHelper.cpp new file mode 100644 index 00000000..b91a0e96 --- /dev/null +++ b/src/servers/Server_Zone/EventHelper.cpp @@ -0,0 +1,77 @@ +#include "EventHelper.h" +#include "Event.h" +#include + +#include + +extern Core::Data::ExdData g_exdData; + +using namespace Core::Common; + +std::string Core::Event::getEventName( uint32_t eventId ) +{ + uint16_t eventType = eventId >> 16; + + switch( eventType ) + { + case EventType::Quest: + { + auto questInfo = g_exdData.getQuestInfo( eventId ); + if( questInfo ) + { + std::string name = questInfo->name_intern; + std::size_t pos = name.find_first_of( "_" ); + + return questInfo->name_intern.substr( 0, pos ); + } + } + break; + case EventType::CustomTalk: + { + auto customTalkInfo = g_exdData.getCustomTalkInfo( eventId ); + if( customTalkInfo ) + { + std::string name = customTalkInfo->name_intern; + std::size_t pos = name.find_first_of( "_" ); + + return customTalkInfo->name_intern.substr( 0, pos ); + } + + } + break; + case EventType::Opening: + { + auto openingInfo = g_exdData.getOpeningInfo( eventId ); + if( openingInfo ) + return openingInfo->name; + } + break; + case EventType::Aetheryte: + { + auto aetherInfo = g_exdData.getAetheryteInfo( eventId & 0xFFFF ); + if( aetherInfo->isAetheryte ) + return "Aetheryte"; + return "Aethernet"; + + } + case EventType::ChocoPort: + { + return "ChocoboTaxi"; + } + default: + { + return ""; + + } + } + return ""; +} + +uint32_t Core::Event::mapEventActorToRealActor( uint32_t eventActorId ) +{ + auto levelInfo = g_exdData.getLevelInfo( eventActorId ); + if( levelInfo ) + return levelInfo->actor_id; + + return 0; +} diff --git a/src/servers/Server_Zone/EventHelper.h b/src/servers/Server_Zone/EventHelper.h new file mode 100644 index 00000000..e8c531f2 --- /dev/null +++ b/src/servers/Server_Zone/EventHelper.h @@ -0,0 +1,16 @@ +#ifndef _EVENTHELPER_H +#define _EVENTHELPER_H + +#include +#include + +namespace Core { + namespace Event { + + std::string getEventName( uint32_t eventId ); + + uint32_t mapEventActorToRealActor( uint32_t eventActorId ); + + } +} +#endif diff --git a/src/servers/Server_Zone/EventItemAction.cpp b/src/servers/Server_Zone/EventItemAction.cpp new file mode 100644 index 00000000..12ac1e14 --- /dev/null +++ b/src/servers/Server_Zone/EventItemAction.cpp @@ -0,0 +1,122 @@ +#include "EventItemAction.h" +#include "ActorControlPacket142.h" +#include "ActorControlPacket143.h" +#include +#include +#include +#include +#include "Player.h" + +extern Core::Logger g_log; + +using namespace Core::Common; +using namespace Core::Network; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +Core::Action::EventItemAction::EventItemAction() +{ + m_actionType = Common::ActionType::Event; +} + +Core::Action::EventItemAction::EventItemAction( Entity::ActorPtr pActor, uint32_t eventId, uint32_t action, + ActionCallback finishRef, ActionCallback interruptRef, uint64_t additional ) +{ + m_additional = additional; + m_actionType = ActionType::Event; + m_eventId = eventId; + m_id = action; + // TODO: read the cast time from the action itself + m_castTime = 3000; + m_onActionFinishClb = finishRef; + m_onActionInterruptClb = interruptRef; + m_pSource = pActor; + m_bInterrupt = false; +} + +Core::Action::EventItemAction::~EventItemAction() +{ + +} + +void Core::Action::EventItemAction::onStart() +{ + if( !m_pSource ) + return; + + m_startTime = Util::getTimeMs(); + + GamePacketNew< FFXIVIpcActorCast > castPacket( m_pSource->getId() ); + + castPacket.data().action_id = 1; + castPacket.data().unknown = 3; + castPacket.data().unknown_1 = m_id; + castPacket.data().cast_time = 3.0f; + castPacket.data().target_id = m_pSource->getId(); + + m_pSource->sendToInRangeSet( castPacket, true ); + m_pSource->getAsPlayer()->setStateFlag( PlayerStateFlag::Casting ); + m_pSource->getAsPlayer()->sendStateFlags(); + +} + +void Core::Action::EventItemAction::onFinish() +{ + if( !m_pSource ) + return; + + try + { + GamePacketNew< FFXIVIpcEffect > effectPacket( m_pSource->getId() ); + effectPacket.data().targetId = static_cast< uint32_t >( m_additional ); + effectPacket.data().actionAnimationId = 1; +// effectPacket.data().unknown_3 = 3; + effectPacket.data().actionTextId = m_id; + effectPacket.data().unknown_5 = 2; + effectPacket.data().numEffects = 1; + effectPacket.data().rotation = Math::Util::floatToUInt16Rot( m_pSource->getRotation() ); + effectPacket.data().effectTarget = static_cast< uint32_t >( m_additional ); + + m_pSource->getAsPlayer()->unsetStateFlag( Common::PlayerStateFlag::Casting ); + m_pSource->getAsPlayer()->sendStateFlags(); + m_pSource->sendToInRangeSet( effectPacket, true ); + + if( m_onActionFinishClb ) + m_onActionFinishClb( *m_pSource->getAsPlayer(), m_eventId, m_additional ); + } + catch( std::exception& e ) + { + g_log.error( e.what() ); + } + +} + +void Core::Action::EventItemAction::onInterrupt() +{ + if( !m_pSource ) + return; + + try + { + + auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, + 0x219, 0x04, m_id ); + if( m_pSource->isPlayer() ) + { + m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Casting ); + m_pSource->getAsPlayer()->sendStateFlags(); + m_pSource->sendToInRangeSet( control, true ); + } + else + m_pSource->sendToInRangeSet( control ); + + if( m_onActionInterruptClb ) + m_onActionInterruptClb( *m_pSource->getAsPlayer(), m_eventId, m_additional ); + + } + catch( std::exception& e ) + { + g_log.error( e.what() ); + } + +} diff --git a/src/servers/Server_Zone/EventItemAction.h b/src/servers/Server_Zone/EventItemAction.h new file mode 100644 index 00000000..c367c13f --- /dev/null +++ b/src/servers/Server_Zone/EventItemAction.h @@ -0,0 +1,35 @@ +#ifndef _EVENTITEMACTION_H_ +#define _EVENTITEMACTION_H_ + +#include "Forwards.h" +#include "Action.h" + +namespace Core { namespace Action { + + class EventItemAction : public Action + { + + public: + EventItemAction(); + ~EventItemAction(); + + EventItemAction( Entity::ActorPtr pActor, uint32_t eventId, uint32_t action, + ActionCallback finishRef, ActionCallback interruptRef, uint64_t additional ); + + void onStart() override; + void onFinish() override; + void onInterrupt() override; + + private: + uint32_t m_eventId; + uint64_t m_additional; + + ActionCallback m_onActionFinishClb; + ActionCallback m_onActionInterruptClb; + + }; + +} +} + +#endif \ No newline at end of file diff --git a/src/servers/Server_Zone/EventPlayPacket.h b/src/servers/Server_Zone/EventPlayPacket.h new file mode 100644 index 00000000..bc48b6ff --- /dev/null +++ b/src/servers/Server_Zone/EventPlayPacket.h @@ -0,0 +1,55 @@ +#ifndef _EVENTPLAY_H +#define _EVENTPLAY_H + +#include +#include "Forwards.h" + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +/** +* @brief The packet sent to play an event. +*/ +class EventPlayPacket : public GamePacketNew< FFXIVIpcEventPlay > +{ +public: + EventPlayPacket( uint32_t playerId, + uint64_t actorId, + uint32_t eventId, + uint16_t scene, + uint32_t flags, + uint8_t param3, + uint32_t param4 = 0, + uint32_t param5 = 0 ) : + GamePacketNew< FFXIVIpcEventPlay >( playerId, playerId ) + { + initialize( actorId, eventId, scene, flags, param3, param4, param5 ); + }; + +private: + void initialize( uint64_t actorId, + uint32_t eventId, + uint16_t scene, + uint32_t flags, + uint8_t param3, + uint32_t param4, + uint32_t param5 ) + { + m_data.actorId = actorId; + m_data.eventId = eventId; + m_data.scene = scene; + m_data.flags = flags; + m_data.param3 = param3; + m_data.param4 = param4; + m_data.param5 = param5; + }; +}; + +} +} +} +} + +#endif /*_EVENTPLAY_H*/ \ No newline at end of file diff --git a/src/servers/Server_Zone/EventStartPacket.h b/src/servers/Server_Zone/EventStartPacket.h new file mode 100644 index 00000000..e65baa97 --- /dev/null +++ b/src/servers/Server_Zone/EventStartPacket.h @@ -0,0 +1,50 @@ +#ifndef _EVENTSTART_H +#define _EVENTSTART_H + +#include +#include "Forwards.h" + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +/** +* @brief The packet sent to start an event. +*/ +class EventStartPacket : public GamePacketNew< FFXIVIpcEventStart > +{ +public: + EventStartPacket( uint32_t playerId, + uint64_t actorId, + uint32_t eventId, + uint8_t param1 = 0, + uint8_t param2 = 0, + uint32_t param3 = 0 ) : + GamePacketNew< FFXIVIpcEventStart >( playerId, playerId ) + { + initialize( actorId, eventId, param1, param2, param3 ); + }; + +private: + void initialize( uint64_t actorId, + uint32_t eventId, + uint8_t param1, + uint8_t param2, + uint32_t param3 ) + { + m_data.actorId = actorId; + m_data.eventId = eventId; + m_data.param1 = param1; + m_data.param2 = param2; + m_data.param3 = param3; + + }; +}; + +} +} +} +} + +#endif /*_EVENTSTART_H*/ \ No newline at end of file diff --git a/src/servers/Server_Zone/Forwards.h b/src/servers/Server_Zone/Forwards.h new file mode 100644 index 00000000..87ec8bd2 --- /dev/null +++ b/src/servers/Server_Zone/Forwards.h @@ -0,0 +1,75 @@ +#ifndef _FORWARDS_H +#define _FORWARDS_H + +#include +#include + +#define TYPE_FORWARD( x ) \ +class x; \ +typedef boost::shared_ptr< x > x ## Ptr; \ +typedef std::vector< x > x ## PtrList; + +namespace Core +{ + TYPE_FORWARD( Cell ); + TYPE_FORWARD( Zone ); + TYPE_FORWARD( Item ); + TYPE_FORWARD( ItemContainer ); + TYPE_FORWARD( Inventory ); + TYPE_FORWARD( Session ); + TYPE_FORWARD( XMLConfig ); + TYPE_FORWARD( ZonePosition ) + + namespace StatusEffect + { + TYPE_FORWARD( StatusEffect ); + TYPE_FORWARD( StatusEffectContainer ); + } + + namespace Entity + { + TYPE_FORWARD( Actor ); + TYPE_FORWARD( Player ); + TYPE_FORWARD( BattleNpc ); + TYPE_FORWARD( BattleNpcTemplate ); + } + + namespace Event + { + TYPE_FORWARD( Event ); + } + + namespace Action + { + TYPE_FORWARD( Action ); + TYPE_FORWARD( ActionTeleport ); + TYPE_FORWARD( ActionCast ); + TYPE_FORWARD( EventAction ); + } + + namespace Network + { + TYPE_FORWARD( Hive ); + TYPE_FORWARD( Acceptor ); + TYPE_FORWARD( Connection ); + TYPE_FORWARD( GameConnection ); + TYPE_FORWARD( SessionConnection ); + TYPE_FORWARD( CustomMsgClientConnection ); + + namespace Packets + { + TYPE_FORWARD( GamePacket ); + } + } + + namespace Scripting + { + typedef std::function< void( Entity::Player&, uint32_t, uint16_t, uint16_t, uint16_t ) > EventReturnCallback; + } + + typedef std::function< void( Entity::Player&, uint32_t, uint64_t ) > ActionCallback; + +} + + +#endif \ No newline at end of file diff --git a/src/servers/Server_Zone/GameCommand.h b/src/servers/Server_Zone/GameCommand.h new file mode 100644 index 00000000..9f58f514 --- /dev/null +++ b/src/servers/Server_Zone/GameCommand.h @@ -0,0 +1,67 @@ +#ifndef _GAMECOMMAND_H_ +#define _GAMECOMMAND_H_ + +#include + +#include "Player.h" +#include "Forwards.h" + +namespace Core { + + class GameCommandHandler; + + // CGameCommand is used to define in game text command callbacks + // TODO it should probably be renamed to something more intuitive + // TODO the command identifier, currently '@' should probably be defined in here aswell so it is easily replaced + class GameCommand + { + public: + + typedef void (GameCommandHandler::*pFunc)(char *, Entity::PlayerPtr, boost::shared_ptr); + + // String for the command + std::string m_commandName; + + // command callback + pFunc m_pFunc; + + // helptext + std::string m_helpText; + + // userlevel needed to execute the command + Common::UserLevel m_userLevel; + + GameCommand(const std::string& n, pFunc functionPtr, const std::string& hText, Common::UserLevel uLevel) + { + m_commandName = n; + m_pFunc = functionPtr; + m_helpText = hText; + m_userLevel = uLevel; + } + + ~GameCommand() + { + + } + + const std::string& getName() const + { + return m_commandName; + } + + const std::string& getHelpText() const + { + return m_helpText; + } + + Common::UserLevel getUserLevel() const + { + return m_userLevel; + } + + }; + +} + + +#endif diff --git a/src/servers/Server_Zone/GameCommandHandler.cpp b/src/servers/Server_Zone/GameCommandHandler.cpp new file mode 100644 index 00000000..59318d6b --- /dev/null +++ b/src/servers/Server_Zone/GameCommandHandler.cpp @@ -0,0 +1,511 @@ +#include + +#include +#include +#include +#include +#include +#include + +#include "GameCommand.h" +#include "GameCommandHandler.h" + +#include "ServerNoticePacket.h" +#include "ActorControlPacket142.h" +#include "ActorControlPacket143.h" +#include "InitUIPacket.h" +#include "GameConnection.h" + + +#include "Player.h" +#include "BattleNpc.h" + +#include "Zone.h" + +#include "Globals.h" +#include "ServerZone.h" + +#include "StatusEffect.h" +#include "Session.h" +#include + + +// instanciate and initialize commands +Core::GameCommandHandler::GameCommandHandler() +{ + + // Push all commands onto the register map + registerCommand( "set", &GameCommandHandler::set, "Loads and injects a premade Packet.", Common::UserLevel::all ); + registerCommand( "get", &GameCommandHandler::get, "Loads and injects a premade Packet.", Common::UserLevel::all ); + registerCommand( "add", &GameCommandHandler::add, "Loads and injects a premade Packet.", Common::UserLevel::all ); + //registerCommand( "debug", &GameCommandHandler::debug, "Loads and injects a premade Packet.", Common::UserLevel::all ); + registerCommand( "inject", &GameCommandHandler::injectPacket, "Loads and injects a premade Packet.", Common::UserLevel::all ); + registerCommand( "script_reload", &GameCommandHandler::scriptReload, "Loads and injects a premade Packet.", Common::UserLevel::all ); + registerCommand( "nudge", &GameCommandHandler::nudge, "Nudges you forward/up/down", Common::UserLevel::all ); + +} + +// clear all loaded commands +Core::GameCommandHandler::~GameCommandHandler() +{ + for( auto it = m_commandMap.begin(); it != m_commandMap.end(); ++it ) + ( *it ).second.reset(); +} + +// add a command set to the register map +void Core::GameCommandHandler::registerCommand( const std::string& n, Core::GameCommand::pFunc functionPtr, + const std::string& hText, Core::Common::UserLevel uLevel ) +{ + m_commandMap[std::string( n )] = boost::make_shared( n, functionPtr, hText, uLevel ); +} + +// try to retrieve the command in question, execute if found +void Core::GameCommandHandler::execCommand( char * data, Core::Entity::PlayerPtr pPlayer ) +{ + + // define callback pointer + void ( GameCommandHandler::*pf )( char *, Entity::PlayerPtr, boost::shared_ptr< GameCommand > ); + + std::string commandString; + + // check if the command has parameters + std::string tmpCommand = std::string( data ); + std::size_t pos = tmpCommand.find_first_of( " " ); + + if( pos != std::string::npos ) + // command has parameters, grab the first part + commandString = tmpCommand.substr( 0, pos ); + else + // no parameters, just get the command + commandString = tmpCommand; + + // try to retrieve the command + auto it = m_commandMap.find( commandString ); + + if( it == m_commandMap.end() ) + // no command found, do something... or not + g_log.error( "[" + std::to_string( pPlayer->getId() ) + "] " + "Command not found" ); + // TODO Notify the client of the failed command + else + { + // command found, call the callback function and pass parameters if present. + pf = ( *it ).second->m_pFunc; + ( this->*pf )( data, pPlayer, ( *it ).second ); + return; + } + + +} + + + +/////////////////////////////////////////////////////////////////////////////////////// +// Definition of the commands +/////////////////////////////////////////////////////////////////////////////////////// + +void Core::GameCommandHandler::scriptReload( char * data, Core::Entity::PlayerPtr pPlayer, + boost::shared_ptr command ) +{ + g_scriptMgr.reload(); +} + +void Core::GameCommandHandler::set( char * data, Core::Entity::PlayerPtr pPlayer, boost::shared_ptr command ) +{ + std::string subCommand = ""; + std::string params = ""; + + // check if the command has parameters + std::string tmpCommand = std::string( data + command->getName().length() + 1 ); + + std::size_t pos = tmpCommand.find_first_of( " " ); + + if( pos != std::string::npos ) + // command has parameters, grab the first part + subCommand = tmpCommand.substr( 0, pos ); + else + // no subcommand given + subCommand = tmpCommand; + + if( command->getName().length() + 1 + pos + 1 < strlen( data ) ) + params = std::string( data + command->getName().length() + 1 + pos + 1 ); + + g_log.debug( "[" + std::to_string( pPlayer->getId() ) + "] " + + "subCommand " + subCommand + " params: " + params ); + + + if( ( ( subCommand == "pos" ) || ( subCommand == "posr" ) ) && ( params != "" ) ) + { + int32_t posX; + int32_t posY; + int32_t posZ; + + sscanf( params.c_str(), "%d %d %d", &posX, &posY, &posZ ); + + if( ( posX == 0xcccccccc ) || ( posY == 0xcccccccc ) || ( posZ == 0xcccccccc ) ) + { + pPlayer->sendUrgent( "Syntaxerror." ); + return; + } + + if( subCommand == "pos" ) + pPlayer->setPosition( static_cast< float >( posX ), + static_cast< float >( posY ), + static_cast< float >( posZ ) ); + else + pPlayer->setPosition( pPlayer->getPos().x + static_cast< float >( posX ), + pPlayer->getPos().y + static_cast< float >( posY ), + pPlayer->getPos().z + static_cast< float >( posZ ) ); + + Network::Packets::GamePacketNew< Network::Packets::Server::FFXIVIpcActorSetPos > + setActorPosPacket( pPlayer->getId() ); + setActorPosPacket.data().x = pPlayer->getPos().x; + setActorPosPacket.data().y = pPlayer->getPos().y; + setActorPosPacket.data().z = pPlayer->getPos().z; + pPlayer->queuePacket( setActorPosPacket ); + + } + else if( ( subCommand == "zone" ) && ( params != "" ) ) + { + int32_t zoneId; + sscanf( params.c_str(), "%i", &zoneId ); + + if( zoneId < 1 ) + pPlayer->sendUrgent( "Zone id out of range." ); + else + { + pPlayer->setPosition( pPlayer->getPos() ); + pPlayer->performZoning( zoneId, pPlayer->getPos(), 0); + } + + } + else if( ( subCommand == "hp" ) && ( params != "" ) ) + { + int32_t hp; + sscanf( params.c_str(), "%i", &hp ); + + pPlayer->setHp( hp ); + + auto control = Network::Packets::Server::ActorControlPacket142( pPlayer->getId(), Common::ActorControlType::HpSetStat, 1, pPlayer->getHp() ); + + pPlayer->sendToInRangeSet( control, true ); + + } + else if( ( subCommand == "quest" ) && ( params != "" ) ) + setQuestHandler( const_cast< char* >( params.c_str() ), pPlayer, command ); + + else if( ( subCommand == "tele" ) && ( params != "" ) ) + { + int32_t aetheryteId; + sscanf( params.c_str(), "%i", &aetheryteId ); + + pPlayer->teleport( aetheryteId ); + } + + else if( ( subCommand == "discovery" ) && ( params != "" ) ) + { + int32_t map_id; + int32_t discover_id; + sscanf( params.c_str(), "%i %i", &map_id, &discover_id ); + + Network::Packets::GamePacketNew< Network::Packets::Server::FFXIVIpcDiscovery > discoveryPacket( pPlayer->getId() ); + discoveryPacket.data().map_id = map_id; + discoveryPacket.data().map_part_id = discover_id; + pPlayer->queuePacket( discoveryPacket ); + } + + else if( ( subCommand == "discovery_pos" ) && ( params != "" ) ) + { + int32_t map_id; + int32_t discover_id; + int32_t pos_id; + sscanf( params.c_str(), "%i %i %i", &pos_id, &map_id, &discover_id ); + + std::string query2 = "UPDATE IGNORE `dbdiscoveryref` SET `discover_id` = '" + std::to_string( discover_id ) + + "' WHERE `dbdiscoveryref`.`id` = " + std::to_string( pos_id ) + ";"; + + std::string query1 = "INSERT IGNORE INTO `dbdiscoveryref` (`id`, `map_id`, `discover_id`) VALUES ('" + std::to_string( pos_id ) + + "', '" + std::to_string( map_id ) + + "', '" + std::to_string( discover_id ) + "')"; + + g_database.execute( query1.c_str() ); + g_database.execute( query2.c_str() ); + + } + + else if( subCommand == "discovery_reset" ) + { + pPlayer->resetDiscovery(); + pPlayer->queuePacket( Network::Packets::Server::InitUIPacket( pPlayer ) ); + } + + +} + +void Core::GameCommandHandler::setQuestHandler( char * data, Core::Entity::PlayerPtr pPlayer, boost::shared_ptr command ) +{ + std::string tmpCommand( data ); + std::string subCommand; + + std::size_t pos = tmpCommand.find_first_of( " " ); + + if( pos != std::string::npos ) + // command has parameters, grab the first part + subCommand = tmpCommand.substr( 0, pos ); + else + { + // no subcommand given + subCommand = tmpCommand; + return; + } + + std::string params( data + pos ); + + if( subCommand == "seq" ) + { + int32_t questId; + int32_t sequence; + sscanf( params.c_str(), "%i %i", &questId, &sequence ); + + if( sequence == -1 ) + pPlayer->removeQuest( questId ); + else + pPlayer->updateQuest( questId, sequence ); + } + else if( subCommand == "var" ) + { + int32_t questId; + int32_t varIdx; + int32_t varVal; + sscanf( params.c_str(), "%i %i %i", &questId, &varIdx, &varVal ); + + //pPlayer->updateQuestVar( questId, varIdx, varVal ); + } +} + +void Core::GameCommandHandler::add( char * data, Core::Entity::PlayerPtr pPlayer, boost::shared_ptr command ) +{ + std::string subCommand; + std::string params = ""; + + // check if the command has parameters + std::string tmpCommand = std::string( data + command->getName().length() + 1 ); + + std::size_t pos = tmpCommand.find_first_of( " " ); + + if( pos != std::string::npos ) + // command has parameters, grab the first part + subCommand = tmpCommand.substr( 0, pos ); + else + { + // no subcommand given + subCommand = tmpCommand; + return; + } + + if( command->getName().length() + 1 + pos + 1 < strlen( data ) ) + params = std::string( data + command->getName().length() + 1 + pos + 1 ); + + g_log.debug( "[" + std::to_string( pPlayer->getId() ) + "] " + + "subCommand " + subCommand + " params: " + params ); + + + if( ( subCommand == "item" ) && ( params != "" ) ) + { + int32_t catalogId; + int32_t amount; + + sscanf( params.c_str(), "%d %d", &catalogId, &amount ); + + if( amount < 1 || amount > 99 ) + { + amount = 1; + } + + if( ( catalogId == 0xcccccccc ) ) + { + pPlayer->sendUrgent( "Syntaxerror." ); + return; + } + + if( !pPlayer->addItem( -1, catalogId, amount ) ) + pPlayer->sendUrgent( "Item " + std::to_string( catalogId ) + " not found..." ); + + } + else if( subCommand == "exp" ) + { + int32_t amount; + + sscanf( params.c_str(), "%d", &amount ); + + pPlayer->gainExp( amount ); + } + else if( subCommand == "status" ) + { + int32_t id; + int32_t duration; + + sscanf( params.c_str(), "%d %d", &id, &duration ); + + StatusEffect::StatusEffectPtr effect( new StatusEffect::StatusEffect( id, pPlayer, pPlayer, duration, 3000 ) ); + pPlayer->addStatusEffect( effect ); + } + else if( subCommand == "spawn" ) + { + int32_t model, name; + + sscanf( params.c_str(), "%d %d", &model, &name ); + + Entity::BattleNpcPtr pBNpc( new Entity::BattleNpc( model, name, pPlayer->getPos() ) ); + + auto pZone = pPlayer->getCurrentZone(); + pBNpc->setCurrentZone( pZone ); + pZone->pushActor( pBNpc ); + + } + else if( subCommand == "op" ) + { + // temporary research packet + int32_t opcode; + sscanf( params.c_str(), "%x", &opcode ); + Network::Packets::GamePacketPtr pPe( new Network::Packets::GamePacket( opcode, 0x30, pPlayer->getId(), pPlayer->getId() ) ); + pPlayer->queuePacket( pPe ); + } + else if( subCommand == "actrl" ) + + { + + // temporary research packet + + int32_t opcode; + int32_t param1; + int32_t param2; + int32_t param3; + int32_t param4; + int32_t param5; + int32_t param6; + int32_t playerId; + + sscanf( params.c_str(), "%x %x %x %x %x %x %x %x", &opcode, ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6, &playerId ); + + pPlayer->sendNotice( "Injecting ACTOR_CONTROL " + std::to_string( opcode ) ); + + Network::Packets::GamePacketNew< Network::Packets::Server::FFXIVIpcActorControl143 > actorControl( playerId, pPlayer->getId() ); + actorControl.data().category = opcode; + actorControl.data().param1 = param1; + actorControl.data().param2 = param2; + actorControl.data().param3 = param3; + actorControl.data().param4 = param4; + actorControl.data().param5 = param5; + actorControl.data().param6 = param6; + pPlayer->queuePacket( actorControl ); + + + /*sscanf(params.c_str(), "%x %x %x %x %x %x %x", &opcode, ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6, &playerId); + + Network::Packets::Server::ServerNoticePacket noticePacket(pPlayer, "Injecting ACTOR_CONTROL " + std::to_string(opcode)); + + pPlayer->queuePacket(noticePacket); + + Network::Packets::Server::ActorControlPacket143 controlPacket(pPlayer, opcode, + param1, param2, param3, param4, param5, param6, playerId); + pPlayer->queuePacket(controlPacket);*/ + + } + + +} + +void Core::GameCommandHandler::get( char * data, Core::Entity::PlayerPtr pPlayer, boost::shared_ptr command ) +{ + std::string subCommand; + std::string params = ""; + + // check if the command has parameters + std::string tmpCommand = std::string( data + command->getName().length() + 1 ); + + std::size_t pos = tmpCommand.find_first_of( " " ); + + if( pos != std::string::npos ) + // command has parameters, grab the first part + subCommand = tmpCommand.substr( 0, pos ); + else + // no subcommand given + subCommand = tmpCommand; + + if( command->getName().length() + 1 + pos + 1 < strlen( data ) ) + params = std::string( data + command->getName().length() + 1 + pos + 1 ); + + g_log.debug( "[" + std::to_string( pPlayer->getId() ) + "] " + + "subCommand " + subCommand + " params: " + params ); + + + if( ( subCommand == "pos" ) ) + { + + int16_t map_id = g_exdData.m_zoneInfoMap[pPlayer->getCurrentZone()->getId()].map_id; + + pPlayer->sendNotice( "Pos:\n" + + std::to_string( pPlayer->getPos().x ) + "\n" + + std::to_string( pPlayer->getPos().y ) + "\n" + + std::to_string( pPlayer->getPos().z ) + "\n" + + std::to_string( pPlayer->getRotation() ) + "\nMapId: " + + std::to_string( map_id ) + "\nZoneID: " + + std::to_string( pPlayer->getCurrentZone()->getId() ) + "\n" ); + } + +} + +void Core::GameCommandHandler::injectPacket( char * data, Core::Entity::PlayerPtr pPlayer, boost::shared_ptr< Core::GameCommand > command ) +{ + auto pSession = g_serverZone.getSession( pPlayer->getId() ); + if( pSession ) + pSession->getZoneConnection()->injectPacket( data + 7, pPlayer ); +} + +void Core::GameCommandHandler::nudge( char * data, Entity::PlayerPtr pPlayer, boost::shared_ptr command ) +{ + std::string subCommand; + + // check if the command has parameters + std::string tmpCommand = std::string( data + command->getName().length() + 1 ); + + std::size_t spos = tmpCommand.find_first_of( " " ); + + auto& pos = pPlayer->getPos(); + + int32_t offset = 0; + char direction[20]; + memset( direction, 0, 20 ); + + sscanf( tmpCommand.c_str(), "%d %s", &offset, direction ); + + + if( direction[0] == 'u' || direction[0] == '+' ) + { + pos.y += offset; + pPlayer->sendNotice( "nudge: Placing up " + std::to_string( offset ) + " yalms" ); + } + else if( direction[0] == 'd' || direction[0] == '-' ) + { + pos.y -= offset; + pPlayer->sendNotice( "nudge: Placing down " + std::to_string( offset ) + " yalms" ); + + } + else + { + float angle = pPlayer->getRotation() + ( PI / 2 ); + pos.x -= offset * cos( angle ); + pos.z += offset * sin( angle ); + pPlayer->sendNotice( "nudge: Placing forward " + std::to_string( offset ) + " yalms" ); + } + if( offset != 0 ) + { + Network::Packets::GamePacketNew< Network::Packets::Server::FFXIVIpcActorSetPos > + setActorPosPacket( pPlayer->getId() ); + setActorPosPacket.data().x = pPlayer->getPos().x; + setActorPosPacket.data().y = pPlayer->getPos().y; + setActorPosPacket.data().z = pPlayer->getPos().z; + setActorPosPacket.data().r16 = Math::Util::floatToUInt16Rot( pPlayer->getRotation() ); + pPlayer->queuePacket( setActorPosPacket ); + } +} diff --git a/src/servers/Server_Zone/GameCommandHandler.h b/src/servers/Server_Zone/GameCommandHandler.h new file mode 100644 index 00000000..01255b19 --- /dev/null +++ b/src/servers/Server_Zone/GameCommandHandler.h @@ -0,0 +1,45 @@ +#ifndef _GAMECOMMANDHANDLER_H_ +#define _GAMECOMMANDHANDLER_H_ + +#include + +#include "GameCommand.h" +#include +#include "Forwards.h" + +namespace Core { + + +// handler for in game commands +class GameCommandHandler +{ +private: + // container mapping command string to command object + std::map > m_commandMap; + +public: + GameCommandHandler(); + ~GameCommandHandler(); + + // register command to command map + void registerCommand( const std::string& n, GameCommand::pFunc, const std::string& hText, Common::UserLevel uLevel ); + + // execute command if registered + void execCommand( char * data, Entity::PlayerPtr pPlayer ); + + // command handler callbacks + void set( char * data, Entity::PlayerPtr pPlayer, boost::shared_ptr command ); + void get( char * data, Entity::PlayerPtr pPlayer, boost::shared_ptr command ); + void add( char * data, Entity::PlayerPtr pPlayer, boost::shared_ptr command ); + //void debug( char * data, Entity::PlayerPtr pPlayer, boost::shared_ptr command ); + void scriptReload( char * data, Entity::PlayerPtr pPlayer, boost::shared_ptr command ); + + void setQuestHandler( char * data, Entity::PlayerPtr pPlayer, boost::shared_ptr command ); + + void injectPacket( char * data, Entity::PlayerPtr pPlayer, boost::shared_ptr command ); + void nudge( char* data, Entity::PlayerPtr pPlayer, boost::shared_ptr command ); + +}; + +} +#endif diff --git a/src/servers/Server_Zone/GameConnection.cpp b/src/servers/Server_Zone/GameConnection.cpp new file mode 100644 index 00000000..cca0745a --- /dev/null +++ b/src/servers/Server_Zone/GameConnection.cpp @@ -0,0 +1,401 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "GameConnection.h" + +#include "ServerZone.h" + +#include "Session.h" +#include "Zone.h" + +#include "InitUIPacket.h" + +#include "GameCommandHandler.h" + +#include "Player.h" + +#include "Forwards.h" + +extern Core::GameCommandHandler g_gameCommandMgr; +extern Core::Logger g_log; +extern Core::ServerZone g_serverZone; + +using namespace Core::Common; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +Core::Network::GameConnection::GameConnection( Core::Network::HivePtr pHive, + Core::Network::AcceptorPtr pAcceptor ) + : Connection( pHive ) + , m_pAcceptor( pAcceptor ) + , m_conType( ConnectionType::None ) +{ + auto setHandler = [=]( uint16_t opcode, std::string handlerName, GameConnection::Handler pHandler ) + { + m_packetHandlerMap[opcode] = pHandler; + m_packetHandlerStrMap[opcode] = handlerName; + }; + + setHandler( ClientIpcType::PingHandler, "PingHandler", &GameConnection::pingHandler ); + setHandler( ClientIpcType::InitHandler, "InitHandler", &GameConnection::initHandler ); + setHandler( ClientIpcType::ChatHandler, "ChatHandler", &GameConnection::chatHandler ); + + setHandler( ClientIpcType::FinishLoadingHandler, "FinishLoadingHandler", &GameConnection::finishLoadingHandler ); + + setHandler( ClientIpcType::PlayTimeHandler, "PlayTimeHandler", &GameConnection::playTimeHandler ); + setHandler( ClientIpcType::LogoutHandler, "LogoutHandler", &GameConnection::logoutHandler ); + + setHandler( ClientIpcType::SocialListHandler, "SocialListHandler", &GameConnection::socialListHandler ); + setHandler( ClientIpcType::SetSearchInfoHandler, "SetSearchInfoHandler", &GameConnection::setSearchInfoHandler ); + setHandler( ClientIpcType::ReqSearchInfoHandler, "ReqSearchInfoHandler", &GameConnection::reqSearchInfoHandler ); + + setHandler( ClientIpcType::BlackListHandler, "BlackListHandler", &GameConnection::blackListHandler ); + + setHandler( ClientIpcType::LinkshellListHandler, "LinkshellListHandler", &GameConnection::linkshellListHandler ); + + setHandler( ClientIpcType::FcInfoReqHandler, "FcInfoReqHandler", &GameConnection::fcInfoReqHandler ); + + setHandler( ClientIpcType::ZoneLineHandler, "ZoneLineHandler", &GameConnection::zoneLineHandler ); + setHandler( ClientIpcType::ActionHandler, "ActionHandler", &GameConnection::actionHandler ); + + setHandler( ClientIpcType::DiscoveryHandler, "DiscoveryHandler", &GameConnection::discoveryHandler ); + + setHandler( ClientIpcType::SkillHandler, "SkillHandler", &GameConnection::skillHandler ); + + setHandler( ClientIpcType::GMCommand1, "GMCommand1", &GameConnection::gm1Handler ); + setHandler( ClientIpcType::GMCommand2, "GMCommand2", &GameConnection::gm2Handler ); + + setHandler( ClientIpcType::UpdatePositionHandler,"UpdatePositionHandler", &GameConnection::updatePositionHandler ); + + setHandler( ClientIpcType::InventoryModifyHandler,"InventoryModifyHandler", &GameConnection::inventoryModifyHandler ); + + setHandler( ClientIpcType::TalkEventHandler, "EventHandler", &GameConnection::eventHandler ); + setHandler( ClientIpcType::EmoteEventHandler, "EventHandler", &GameConnection::eventHandler ); + setHandler( ClientIpcType::WithinRangeEventHandler, "EventHandler", &GameConnection::eventHandler ); + setHandler( ClientIpcType::OutOfRangeEventHandler, "EventHandler", &GameConnection::eventHandler ); + setHandler( ClientIpcType::EnterTeriEventHandler, "EventHandler", &GameConnection::eventHandler ); + + setHandler( ClientIpcType::ReturnEventHandler, "EventHandlerReturn", &GameConnection::eventHandler ); + setHandler( ClientIpcType::TradeReturnEventHandler, "EventHandlerReturn", &GameConnection::eventHandler ); +} + +Core::Network::GameConnection::~GameConnection() +{ + +} + + +// overwrite the parents onConnect for our game socket needs +void Core::Network::GameConnection::OnAccept( const std::string & host, uint16_t port ) +{ + GameConnectionPtr connection( new GameConnection( m_hive, m_pAcceptor ) ); + m_pAcceptor->Accept( connection ); + + g_log.info( "Connect from " + m_socket.remote_endpoint().address().to_string() ); +} + + +void Core::Network::GameConnection::OnDisconnect() +{ + g_log.debug( "DISCONNECT" ); + m_pSession = nullptr; +} + +void Core::Network::GameConnection::OnRecv( std::vector< uint8_t > & buffer ) +{ + Packets::FFXIVARR_PACKET_HEADER ipcHeader; + std::vector< Packets::FFXIVARR_PACKET_RAW > packetList; + + Network::Util::bufferToPacketList( buffer, ipcHeader, packetList ); + + handlePackets( ipcHeader, packetList ); + +} + +void Core::Network::GameConnection::OnError( const boost::system::error_code & error ) +{ + g_log.debug( "ERROR" ); +} + +void Core::Network::GameConnection::queueInPacket( Core::Network::Packets::GamePacketPtr inPacket ) +{ + m_inQueue.push( inPacket ); +} + +void Core::Network::GameConnection::queueOutPacket( Core::Network::Packets::GamePacketPtr outPacket ) +{ + m_outQueue.push( outPacket ); +} + +void Core::Network::GameConnection::handleGamePacket( Core::Network::Packets::GamePacketPtr pPacket ) +{ + if( !m_pSession ) + return; + + auto it = m_packetHandlerMap.find( pPacket->getSubType() ); + + if( it != m_packetHandlerMap.end() ) + { + auto name = m_packetHandlerStrMap[pPacket->getSubType()]; + // dont display packet notification if it is a ping or pos update, don't want the spam + if( pPacket->getSubType() != ClientIpcType::PingHandler + && pPacket->getSubType() != ClientIpcType::UpdatePositionHandler ) + g_log.debug( "[" + std::to_string( m_pSession->getId() ) + "] Handling packet : " + name + "( " + + boost::str( boost::format( "%|04X|" ) % static_cast< uint32_t >( pPacket->getSubType() & 0xFFFF ) ) + " )" ); + + ( this->*( it->second ) )( pPacket, m_pSession->getPlayer() ); + } + else + { + g_log.debug( "[" + std::to_string( m_pSession->getId() ) + "] Undefined packet : Unknown ( " + + boost::str( boost::format( "%|04X|" ) % static_cast< uint32_t >( pPacket->getSubType() & 0xFFFF ) ) + " )" ); + g_log.debug( pPacket->toString() ); + } + + +} + +void Core::Network::GameConnection::sendPackets( Packets::PacketContainer * pPacket ) +{ + //g_log.Log(LoggingSeverity::info, pPacket->toString()); + std::vector< uint8_t > sendBuffer; + + pPacket->fillSendBuffer( sendBuffer ); + Send( sendBuffer ); +} + +void Core::Network::GameConnection::processInQueue() +{ + // handle the incoming game packets + while( auto pPacket = m_inQueue.pop() ) + { + handleGamePacket( pPacket ); + } +} + +void Core::Network::GameConnection::processOutQueue() +{ + + if( m_outQueue.size() < 1 ) + return; + + int32_t totalSize = 0; + + // create a new packet container + PacketContainer pRP = PacketContainer(); + + // get next packet off the queue + while( auto pPacket = m_outQueue.pop() ) + { + if( pPacket->getSize() == 0 ) + { + g_log.debug( "end of packet set" ); + break; + } + + pRP.addPacket( *pPacket ); + totalSize += pPacket->getSize(); + } + + if( totalSize > 0 ) + sendPackets( &pRP ); + +} + +void Core::Network::GameConnection::sendSinglePacket( Packets::GamePacket * pPacket ) +{ + PacketContainer pRP = PacketContainer(); + pRP.addPacket( *pPacket ); + sendPackets( &pRP ); +} + +void Core::Network::GameConnection::injectPacket( const std::string& packetpath, Core::Entity::PlayerPtr pPlayer ) +{ + + char packet[0x11570]; + memset( packet, 0, 0x11570 ); + + // get the packet name / path from the command arguments + FILE *fp = nullptr; + fp = fopen( packetpath.c_str(), "rb" ); + if( fp == nullptr ) + { + g_log.error( "Packet " + packetpath + " not found!" ); + return; + } + + // read the packet into the buffer + fseek( fp, 0, SEEK_END ); + int32_t size = ftell( fp ); + rewind( fp ); + fread( packet, sizeof( char ), size, fp ); + fclose( fp ); + + // cycle through the packet entries and queue each one + for( int k = 0x18; k < size;) + { + uint32_t tmpId = pPlayer->getId(); + // replace ids in the entryheader if needed + if( !memcmp( packet + k + 0x04, packet + k + 0x08, 4 ) ) + { + memcpy( packet + k + 0x04, &tmpId, 4 ); + memcpy( packet + k + 0x08, &tmpId, 4 ); + } + else + memcpy( packet + k + 0x08, &tmpId, 4 ); + + uint16_t pSize = *reinterpret_cast< uint16_t* >( packet + k ); + // queue packet to the session + if( pSize == 0 ) + return; + + queueOutPacket( GamePacketPtr( new GamePacket( packet + k, pSize, false ) ) ); + k += ( pSize ); + } +} + +void Core::Network::GameConnection::handlePackets( const Core::Network::Packets::FFXIVARR_PACKET_HEADER& ipcHeader, + const std::vector& packetData ) +{ + + // if a session is set, update the last time it recieved a game packet + if( m_pSession ) + m_pSession->updateLastDataTime(); + + for( auto inPacket : packetData ) + { + + + switch( inPacket.segHdr.type ) + { + case 1: + { + char* id = ( char* ) &( inPacket.data[4] ); + uint32_t playerId = boost::lexical_cast< uint32_t >( id ); + auto pCon = boost::static_pointer_cast< GameConnection, Connection >( shared_from_this() ); + + // try to retrieve the session for this id + auto session = g_serverZone.getSession( playerId ); + + if( !session ) + { + g_log.info( "[" + std::string( id ) + "] Session not registered, creating" ); + // return; + g_serverZone.createSession( playerId ); + session = g_serverZone.getSession( playerId ); + } + + // if not set, set the session for this connection + if( !m_pSession && session ) + m_pSession = session; + + // main connection, assinging it to the session + if( ipcHeader.connectionType == 1 ) + { + g_log.info( "[" + std::string( id ) + "] Setting session for zone connection" ); + session->setZoneConnection( pCon ); + } + // chat connection, assinging it to the session + else if( ipcHeader.connectionType == 2 ) + { + g_log.info( "[" + std::string( id ) + "] Setting session for chat connection" ); + // session->setClientChatConnection( pCon ); + } + + GamePacket pPe( 0x00, 0x18, 0, 0, 0x07 ); + pPe.setValAt< uint32_t >( 0x10, 0xE0000005 ); + pPe.setValAt< uint32_t >( 0x14, static_cast< uint32_t >( time( nullptr ) ) ); + sendSinglePacket( &pPe ); + + pPe = GamePacket( 0x00, 0x38, 0, 0, 0x02 ); + pPe.setValAt< uint32_t >( 0x10, playerId ); + sendSinglePacket( &pPe ); + + break; + + } + case 3: // game packet + { + auto pPacket = new GamePacket( inPacket ); + queueInPacket( Packets::GamePacketPtr( pPacket ) ); + break; + } + case 7: // keep alive + { + uint32_t id = *( uint32_t* ) &inPacket.data[0]; + uint32_t timeStamp = *( uint32_t* ) &inPacket.data[4]; + + GamePacket pPe( 0x00, 0x18, 0, 0, 0x08 ); + pPe.setValAt< uint32_t >( 0x10, id ); + pPe.setValAt< uint32_t >( 0x14, timeStamp ); + sendSinglePacket( &pPe ); + + break; + } + case 8: + { + break; + } + } + + + //// try to retrieve the session for this id + //auto session = g_serverZone.getSession( inPacket.segHdr.source_actor ); + //auto pCon = boost::static_pointer_cast< GameConnection, Connection >( shared_from_this() ); + + //// check if this is a zoning notification + //if( *reinterpret_cast< uint16_t* >( &inPacket.data[2] ) == 0x9999 ) + //{ + + // // if we already have a session in this connection, reload the player + // if( session ) + // g_serverZone.updateSession( inPacket.segHdr.source_actor ); + // else + // { + // // if not, create a new session + // g_serverZone.createSession( inPacket.segHdr.source_actor ); + // session = g_serverZone.getSession( inPacket.segHdr.source_actor ); + // } + + // // set the zoneingType for the player so the correct animation can be played + // auto pPlayer = session->getPlayer(); + // ZoneingType zoneType = static_cast< ZoneingType >( *reinterpret_cast< uint16_t* >( &inPacket.data[18] ) ); + // switch( zoneType ) + // { + // case ZoneingType::Teleport: + // pPlayer->setTeleporting( true ); + // break; + // case ZoneingType::Return: + // pPlayer->setReturning( true ); + // break; + // default: + // break; + // } + // // place this connection in the session + // session->setZoneConnection( pCon ); + // // actually perform the zoning + // session->getPlayer()->setZone( *reinterpret_cast< uint16_t* >( &inPacket.data[16] ) ); + //} + //else + //{ + // if( !session ) + // { + // g_serverZone.createSession( inPacket.segHdr.source_actor ); + // session = g_serverZone.getSession( inPacket.segHdr.source_actor ); + // session->setZoneConnection( pCon ); + // } + + // queueInPacket( GamePacketPtr( new GamePacket( inPacket ) ) ); + //} + + //// if not set, set the session for this connection + //if( !m_pSession && session ) + // m_pSession = session; + } +} diff --git a/src/servers/Server_Zone/GameConnection.h b/src/servers/Server_Zone/GameConnection.h new file mode 100644 index 00000000..35191ac5 --- /dev/null +++ b/src/servers/Server_Zone/GameConnection.h @@ -0,0 +1,113 @@ + +#ifndef GAMECONNECTION_H +#define GAMECONNECTION_H + +#include +#include +#include + +#include + +#include + +#include "Forwards.h" + +#define DECLARE_HANDLER( x ) void x( Packets::GamePacketPtr pInPacket, Entity::PlayerPtr pPlayer ) + +namespace Core { +namespace Network { + +enum struct ConnectionType : uint8_t +{ + Zone, + Chat, + None +}; + +class GameConnection : public Connection +{ + +private: + typedef void ( GameConnection::* Handler )( Packets::GamePacketPtr pInPacket, Entity::PlayerPtr pPlayer ); + + typedef std::map< uint16_t, Handler > HandlerMap; + typedef std::map< uint16_t, std::string > HandlerStrMap; + + AcceptorPtr m_pAcceptor; + + // handler for game packets (main type 0x03) + HandlerMap m_packetHandlerMap; + HandlerStrMap m_packetHandlerStrMap; + + SessionPtr m_pSession; + + LockedQueue< Packets::GamePacketPtr > m_inQueue; + LockedQueue< Packets::GamePacketPtr > m_outQueue; + +public: + ConnectionType m_conType; + + GameConnection( HivePtr pHive, AcceptorPtr pAcceptor ); + + ~GameConnection(); + + // overwrite the parents onConnect for our game socket needs + void OnAccept( const std::string & host, uint16_t port ) override; + + void OnDisconnect() override; + + void OnRecv( std::vector< uint8_t > & buffer ) override; + + void OnError( const boost::system::error_code & error ) override; + + void handlePackets( const Packets::FFXIVARR_PACKET_HEADER& ipcHeader, + const std::vector& packetData ); + + void queueInPacket( Packets::GamePacketPtr inPacket ); + void queueOutPacket( Packets::GamePacketPtr outPacket ); + + void processInQueue(); + void processOutQueue(); + + void handleGamePacket( Packets::GamePacketPtr pPacket ); + + void sendPackets( Packets::PacketContainer * pPacket ); + + void sendSinglePacket( Packets::GamePacket * pPacket ); + + void injectPacket( const std::string& packetpath, Entity::PlayerPtr pPlayer ); + + DECLARE_HANDLER( initHandler ); + DECLARE_HANDLER( finishLoadingHandler ); + DECLARE_HANDLER( blackListHandler ); + DECLARE_HANDLER( socialListHandler ); + DECLARE_HANDLER( linkshellListHandler ); + DECLARE_HANDLER( playTimeHandler ); + DECLARE_HANDLER( pingHandler ); + DECLARE_HANDLER( fcInfoReqHandler ); + DECLARE_HANDLER( setSearchInfoHandler ); + DECLARE_HANDLER( reqSearchInfoHandler ); + DECLARE_HANDLER( updatePositionHandler ); + DECLARE_HANDLER( chatHandler ); + DECLARE_HANDLER( zoneLineHandler ); + DECLARE_HANDLER( actionHandler ); + DECLARE_HANDLER( inventoryModifyHandler ); + DECLARE_HANDLER( discoveryHandler ); + DECLARE_HANDLER( eventHandler ); + DECLARE_HANDLER( logoutHandler ); + DECLARE_HANDLER( skillHandler ); + + DECLARE_HANDLER( gm1Handler ); + DECLARE_HANDLER( gm2Handler ); + + + +}; + + + +} +} + + +#endif diff --git a/src/servers/Server_Zone/Globals.h b/src/servers/Server_Zone/Globals.h new file mode 100644 index 00000000..12261f48 --- /dev/null +++ b/src/servers/Server_Zone/Globals.h @@ -0,0 +1,18 @@ +#ifndef _GLOBALS_H +#define _GLOBALS_H + +#include "ZoneMgr.h" +#include +#include +#include "ServerZone.h" +#include "ScriptManager.h" +#include + +extern Core::Logger g_log; +extern Core::Db::Database g_database; +extern Core::ServerZone g_serverZone; +extern Core::ZoneMgr g_zoneMgr; +extern Core::Scripting::ScriptManager g_scriptMgr; +extern Core::Data::ExdData g_exdData; + +#endif \ No newline at end of file diff --git a/src/servers/Server_Zone/InitUIPacket.h b/src/servers/Server_Zone/InitUIPacket.h new file mode 100644 index 00000000..44d033f6 --- /dev/null +++ b/src/servers/Server_Zone/InitUIPacket.h @@ -0,0 +1,87 @@ +#ifndef _CORE_NETWORK_PACKETS_INITUIPACKET_H +#define _CORE_NETWORK_PACKETS_INITUIPACKET_H + +#include +#include +#include "Player.h" +#include "Forwards.h" + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +/** +* @brief The Client UI Initialization packet. This must be sent to the client +* once upon connection to configure the UI. +*/ +class InitUIPacket : public GamePacketNew< FFXIVIpcInitUI > +{ +public: + InitUIPacket( Entity::PlayerPtr player ) : + GamePacketNew< FFXIVIpcInitUI >( player->getId(), player->getId() ) + { + initialize( player ); + }; + +private: + void initialize( Entity::PlayerPtr player ) + { + m_data.contentId = player->getContentId(); + + // TODO: Support rested experience. + m_data.restedExp = 0; + //m_data.padding = 0x100; + m_data.charId = player->getId(); + m_data.race = player->getLookAt( Common::CharaLook::Race ); + m_data.tribe = player->getLookAt( Common::CharaLook::Tribe ); + m_data.gender = player->getLookAt( Common::CharaLook::Gender ); + m_data.currentClass = static_cast< Common::ClassJob >( player->getClass() ); + m_data.currentJob = static_cast< Common::ClassJob >( player->getClass() ); + m_data.deity = static_cast< Common::GuardianDeity >( player->getGuardianDeity() ); + m_data.namedayMonth = player->getBirthMonth(); + m_data.namedayDay = player->getBirthDay(); + // TODO: Support grand company status. + m_data.grandCompany = static_cast< Common::GrandCompany >( player->getStartTown() ); + //m_data.gcRank = GCRank::None; + + // TODO: Support starting city. + //m_data.startCity = Town::Gridania; + m_data.homepoint = player->getHomepoint(); + + memset( &m_data.name[0], 0, sizeof( m_data.name ) ); + + sprintf( &m_data.name[0], player->getName().c_str() ); + + memcpy( m_data.aetheryte, player->getAetheryteArray(), sizeof ( m_data.aetheryte ) ); + + // Set the class levels and exp. + for( uint8_t i = 0; i < 25; i++ ) + { + m_data.levels[i] = player->getClassArray()[i]; + m_data.exp[i] = player->getExpArray()[i]; + } + + memcpy( m_data.unlockBitmask, player->getUnlockBitmask(), sizeof( m_data.unlockBitmask ) ); + + memcpy( m_data.discovery, player->getDiscoveryBitmask(), sizeof( m_data.discovery ) ); + + memcpy( m_data.howto, player->getHowToArray(), sizeof( m_data.howto ) ); + + + //memset( m_data.unlockBitmask, 0xFF, sizeof( m_data.unlockBitmask ) ); + //memset( m_data.unknown_0344, 0xFF, sizeof( m_data.unknown_0344 ) ); + //memset( m_data.unknown_F4, 0xFF, sizeof( m_data.unknown_F4 ) ); + //m_data.pos.x = player->getPos().getX(); + //m_data.pos.y = player->getPos().getY(); + //m_data.pos.z = player->getPos().getZ(); + + }; +}; + +} +} +} +} + +#endif /*_CORE_NETWORK_PACKETS_CINITUIPACKET_H*/ diff --git a/src/servers/Server_Zone/Inventory.cpp b/src/servers/Server_Zone/Inventory.cpp new file mode 100644 index 00000000..e6c6e47a --- /dev/null +++ b/src/servers/Server_Zone/Inventory.cpp @@ -0,0 +1,883 @@ +#include +#include +#include +#include +#include + +#include "Inventory.h" + +#include "Player.h" + +#include "ItemContainer.h" +#include "Item.h" + +#include "ServerNoticePacket.h" + +#include + +#include "Forwards.h" +#include "ActorControlPacket143.h" + +extern Core::Logger g_log; +extern Core::Db::Database g_database; +extern Core::Data::ExdData g_exdData; + +using namespace Core::Common; +using namespace Core::Network; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +Core::Inventory::Inventory( Core::Entity::PlayerPtr pOwner ) +{ + + m_pOwner = pOwner; + + // shortcut for setting up inventory + // TODO: use a loop to set theese up? + auto setupContainer = []( InventoryMap& map, InventoryType type ) + { map[type] = ItemContainerPtr( new ItemContainer( type ) ); }; + + // main bags + setupContainer( m_inventoryMap, Bag0 ); + setupContainer( m_inventoryMap, Bag1 ); + setupContainer( m_inventoryMap, Bag2 ); + setupContainer( m_inventoryMap, Bag3 ); + + // gear set + setupContainer( m_inventoryMap, GearSet0 ); + + // gil contianer + setupContainer( m_inventoryMap, Currency ); + + // crystals?? + setupContainer( m_inventoryMap, Crystal ); + //m_inventoryMap[0x07D3] = ItemContainerPtr( new ItemContainer( UNKNOWN_0 ) ); + //m_inventoryMap[0x07D8] = ItemContainerPtr( new ItemContainer( UNKNOWN_1 ) ); + + // armory weapons - 0 + setupContainer( m_inventoryMap, ArmoryMain ); + + // armory offhand - 1 + setupContainer( m_inventoryMap, ArmoryOff ); + + //armory head - 2 + setupContainer( m_inventoryMap, ArmoryHead ); + + //armory body - 3 + setupContainer( m_inventoryMap, ArmoryBody ); + + //armory hand - 4 + setupContainer( m_inventoryMap, ArmoryHand ); + + //armory waist - 5 + setupContainer( m_inventoryMap, ArmoryWaist ); + + //armory legs - 6 + setupContainer( m_inventoryMap, ArmoryLegs ); + + //armory feet - 7 + setupContainer( m_inventoryMap, ArmoryFeet ); + + //neck + setupContainer( m_inventoryMap, ArmotyNeck ); + + //earring + setupContainer( m_inventoryMap, ArmoryEar ); + + //wrist + setupContainer( m_inventoryMap, ArmoryWrist ); + + //armory rings - 11 + setupContainer( m_inventoryMap, ArmoryRing ); + + //soul crystals - 13 + setupContainer( m_inventoryMap, ArmorySoulCrystal ); +} + + +Core::Inventory::~Inventory() +{ +} + +Core::Inventory::InvSlotPairVec Core::Inventory::getSlotsOfItemsInInventory( uint32_t catalogId ) +{ + InvSlotPairVec outVec; + for( auto i : { Bag0, Bag1, Bag2, Bag3 } ) + { + auto inv = m_inventoryMap[i]; + for( auto item : inv->getItemMap() ) + { + if( item.second && item.second->getId() == catalogId ) + outVec.push_back( std::make_pair( i, item.first ) ); + } + } + return outVec; +} + +Core::Inventory::InvSlotPair Core::Inventory::getFreeBagSlot() +{ + for( auto i : { Bag0, Bag1, Bag2, Bag3 } ) + { + int16_t freeSlot = m_inventoryMap[i]->getFreeSlot(); + + if( freeSlot != -1 ) + return std::make_pair( i, freeSlot ); + } + // no room in inventory + return std::make_pair( 0, -1 ); +} + +Core::ItemPtr Core::Inventory::getItemAt( uint16_t containerId, uint8_t slotId ) +{ + return m_inventoryMap[containerId]->getItem( slotId ); +} + +Core::ItemPtr Core::Inventory::createItem( uint32_t catalogId, uint8_t quantity ) +{ + auto itemInfo = g_exdData.getItemInfo( catalogId ); + + uint8_t itemAmount = quantity; + + if( itemInfo->stack_size == 1 ) + { + itemAmount = 1; + } + + if( !itemInfo ) + return nullptr; + + uint8_t flags = 0; + + std::string itemName( itemInfo->name ); + + ItemPtr pItem( new Item( catalogId ) ); + + pItem->setStackSize( itemAmount ); + pItem->setUId( g_database.getNextUId() ); + pItem->setModelIds( itemInfo->model_primary, itemInfo->model_secondary ); + pItem->setCategory( static_cast< ItemCategory >( itemInfo->ui_category ) ); + + g_database.query( " INSERT INTO charaglobalitem ( CharacterId, itemId, catalogId, stack, flags ) VALUES ( " + + std::to_string( m_pOwner->getId() ) + ", " + + std::to_string( pItem->getUId() ) + ", " + + std::to_string( pItem->getId() ) + ", " + + std::to_string( itemAmount ) + ", " + + std::to_string( flags ) + ");" ); + + return pItem; + +} + + +uint32_t Core::Inventory::getCurrency( CurrencyType type ) +{ + + auto currItem = m_inventoryMap[Currency]->getItem( static_cast< uint8_t >( type ) - 1 ); + + if( !currItem ) + return 0; + + return currItem->getStackSize(); + +} + +uint32_t Core::Inventory::getCrystal( CrystalType type ) +{ + + auto currItem = m_inventoryMap[Crystal]->getItem( static_cast< uint8_t >( type ) - 1 ); + + if( !currItem ) + return 0; + + return currItem->getStackSize(); + +} + +bool Core::Inventory::addCrystal( CrystalType type, uint32_t amount ) +{ + auto currItem = m_inventoryMap[Crystal]->getItem( static_cast< uint8_t >( type ) - 1 ); + + if( !currItem ) + { + // TODO: map currency type to itemid + currItem = createItem( static_cast< uint8_t >( type ) + 1 ); + m_inventoryMap[Crystal]->setItem( static_cast< uint8_t >( type ) - 1, currItem ); + updateCrystalDb(); + } + + uint32_t currentAmount = currItem->getStackSize(); + + currItem->setStackSize( currentAmount + amount ); + + updateItemDb( currItem ); + + return true; + +} + +bool Core::Inventory::addCurrency( CurrencyType type, uint32_t amount ) +{ + auto currItem = m_inventoryMap[Currency]->getItem( static_cast< uint8_t >( type ) - 1 ); + + if( !currItem ) + { + // TODO: map currency type to itemid + currItem = createItem( 1 ); + m_inventoryMap[Currency]->setItem( static_cast< uint8_t >( type ) - 1, currItem ); + updateCurrencyDb(); + } + + uint32_t currentAmount = currItem->getStackSize(); + + currItem->setStackSize( currentAmount + amount ); + + updateItemDb( currItem ); + + return true; + +} + +void Core::Inventory::updateCurrencyDb() +{ + int32_t firstItemPos = -1; + std::string query = "UPDATE charaitemcurrency SET "; + + for( int i = 0; i <= 11; i++ ) + { + auto currItem = m_inventoryMap[Currency]->getItem( i ); + + if( currItem ) + { + if( firstItemPos == -1 ) + firstItemPos = i; + + if( i > firstItemPos ) + query += ", "; + + query += "container_" + std::to_string( i ) + " = " + std::to_string( currItem->getUId() ); + } + } + + query += " WHERE CharacterId = " + std::to_string( m_pOwner->getId() ); + + auto curRes = g_database.query( query ); +} + + +void Core::Inventory::updateCrystalDb() +{ + int32_t firstItemPos = -1; + std::string query = "UPDATE charaitemcrystal SET "; + + for( int i = 0; i <= 11; i++ ) + { + auto currItem = m_inventoryMap[Crystal]->getItem( i ); + + if( currItem ) + { + if( firstItemPos == -1 ) + firstItemPos = i; + + if( i > firstItemPos ) + query += ", "; + + query += "container_" + std::to_string( i ) + " = " + std::to_string( currItem->getUId() ); + } + } + + query += " WHERE CharacterId = " + std::to_string( m_pOwner->getId() ); + + auto curRes = g_database.query( query ); +} + +void Core::Inventory::updateBagDb( InventoryType type ) +{ + std::string query = "UPDATE charaiteminventory SET "; + + for( int i = 0; i <= 34; i++ ) + { + auto currItem = m_inventoryMap[type]->getItem( i ); + + if( i > 0 ) + query += ", "; + + query += "container_" + std::to_string( i ) + " = " + std::to_string( currItem ? currItem->getUId() : 0 ); + } + + query += " WHERE CharacterId = " + std::to_string( m_pOwner->getId() ) + + " AND storageId = " + std::to_string( static_cast< uint16_t >( type ) ); + + auto curRes = g_database.query( query ); +} + +bool Core::Inventory::isArmory( uint16_t containerId ) +{ + return + containerId == ArmoryBody || + containerId == ArmoryEar || + containerId == ArmoryFeet || + containerId == ArmoryHand || + containerId == ArmoryHead || + containerId == ArmoryLegs || + containerId == ArmoryMain || + containerId == ArmoryOff || + containerId == ArmoryRing || + containerId == ArmoryWaist || + containerId == ArmoryWrist; +} + +uint16_t Core::Inventory::getArmoryToEquipSlot( uint8_t slotId ) +{ + switch( slotId ) + { + case Body: + return ArmoryBody; + + case Ear: + return ArmoryEar; + + case Feet: + return ArmoryFeet; + + case Hands: + return ArmoryHand; + + case Legs: + return ArmoryLegs; + + case MainHand: + return ArmoryMain; + + case OffHand: + return ArmoryOff; + + case Ring2: + case Ring1: + return ArmoryRing; + + case Waist: + return ArmoryWaist; + + case Wrist: + return ArmoryWrist; + } + + return 0; +} + + + +bool Core::Inventory::isEquipment( uint16_t containerId ) +{ + return containerId == GearSet0; +} + + +void Core::Inventory::updateMannequinDb( InventoryType type ) +{ + std::string query = "UPDATE charaitemgearset SET "; + + for( int i = 0; i <= 13; i++ ) + { + auto currItem = m_inventoryMap[type]->getItem( i ); + + if( i > 0 ) + query += ", "; + + query += "container_" + std::to_string( i ) + " = " + std::to_string( currItem ? currItem->getUId() : 0 ); + } + + query += " WHERE CharacterId = " + std::to_string( m_pOwner->getId() ) + + " AND storageId = " + std::to_string( static_cast< uint16_t >( type ) ); + + g_log.Log( LoggingSeverity::debug, query ); + auto curRes = g_database.query( query ); +} + + +void Core::Inventory::updateItemDb( Core::ItemPtr pItem ) const +{ + g_database.query( "UPDATE charaglobalitem SET stack = " + std::to_string( pItem->getStackSize() ) + " " + + // TODO: add other attributes + " WHERE itemId = " + std::to_string( pItem->getUId() ) ); +} + +bool Core::Inventory::removeCurrency( CurrencyType type, uint32_t amount ) +{ + + auto currItem = m_inventoryMap[Currency]->getItem( static_cast< uint8_t >( type ) - 1 ); + + if( !currItem ) + return false; + + uint32_t currentAmount = currItem->getStackSize(); + if( amount > currentAmount ) + currItem->setStackSize( 0 ); + else + currItem->setStackSize( currentAmount - amount ); + + updateItemDb( currItem ); + + return true; +} + +bool Core::Inventory::removeCrystal( CrystalType type, uint32_t amount ) +{ + + auto currItem = m_inventoryMap[Crystal]->getItem( static_cast< uint8_t >( type ) - 1 ); + + if( !currItem ) + return false; + + uint32_t currentAmount = currItem->getStackSize(); + if( amount > currentAmount ) + currItem->setStackSize( 0 ); + else + currItem->setStackSize( currentAmount - amount ); + + updateItemDb( currItem ); + + return true; +} + +bool Core::Inventory::isObtainable( uint32_t catalogId, uint16_t quantity ) +{ + + return true; +} + + +int16_t Core::Inventory::addItem( uint16_t inventoryId, int8_t slotId, uint32_t catalogId, uint16_t quantity ) +{ + + auto itemInfo = g_exdData.getItemInfo( catalogId ); + + if( !itemInfo ) + { + return -1; + } + + int16_t rSlotId = -1; + + //if( itemInfo->stack_size > 1 ) + //{ + // auto itemList = this->getSlotsOfItemsInInventory( catalogId ); + // // TODO: this is a stacked item so we need to see if the item is already in inventory and + // // check how much free space we have on existing stacks before looking for empty slots. + //} + //else + { + auto freeSlot = this->getFreeBagSlot(); + inventoryId = freeSlot.first; + rSlotId = freeSlot.second; + + if( rSlotId == -1 ) + return -1; + } + + auto item = createItem( catalogId, quantity ); + + if( rSlotId != -1 ) + { + + m_inventoryMap[inventoryId]->setItem( rSlotId, item ); + + g_database.query( "UPDATE charaiteminventory SET container_" + std::to_string( rSlotId ) + " = " + std::to_string( item->getUId() ) + + " WHERE storageId = " + std::to_string( inventoryId ) + + " AND CharacterId = " + std::to_string( m_pOwner->getId() ) ); + + GamePacketNew< FFXIVIpcUpdateInventorySlot > invUpPacket( m_pOwner->getId() ); + invUpPacket.data().containerId = inventoryId; + invUpPacket.data().catalogId = catalogId; + invUpPacket.data().quantity = item->getStackSize(); + invUpPacket.data().hqFlag = item->isHq() ? 1 : 0; + invUpPacket.data().slot = rSlotId; + invUpPacket.data().condition = 30000; + m_pOwner->queuePacket( invUpPacket ); + + m_pOwner->queuePacket( ActorControlPacket143( m_pOwner->getId(), ItemObtainIcon, catalogId, item->getStackSize() ) ); + + } + + return rSlotId; + +} + +void Core::Inventory::moveItem( uint16_t fromInventoryId, uint8_t fromSlotId, uint16_t toInventoryId, uint8_t toSlot ) +{ + + auto tmpItem = m_inventoryMap[fromInventoryId]->getItem( fromSlotId ); + auto& itemMap = m_inventoryMap[fromInventoryId]->getItemMap(); + + if( tmpItem == nullptr ) + return; + + itemMap[fromSlotId].reset(); + + m_inventoryMap[toInventoryId]->setItem( toSlot, tmpItem ); + + if( toInventoryId != GearSet0 ) + updateBagDb( static_cast< InventoryType >( toInventoryId ) ); + + if( fromInventoryId != GearSet0 && fromInventoryId != toInventoryId ) + updateBagDb( static_cast< InventoryType >( fromInventoryId ) ); + + if( static_cast< InventoryType >( toInventoryId ) == GearSet0 ) + { + m_pOwner->equipItem( static_cast< EquipSlot >( toSlot ), tmpItem, true ); + updateMannequinDb( static_cast< InventoryType >( toInventoryId ) ); + } + + if( static_cast< InventoryType >( fromInventoryId ) == GearSet0 ) + { + m_pOwner->unequipItem( static_cast< EquipSlot >( fromSlotId ), tmpItem ); + updateMannequinDb( static_cast< InventoryType >( fromInventoryId ) ); + } + + +} + +bool Core::Inventory::updateContainer( uint16_t containerId, uint8_t slotId, ItemPtr pItem ) +{ + auto containerType = getContainerType( containerId ); + + m_inventoryMap[containerId]->setItem( slotId, pItem ); + + switch( containerType ) + { + case Armory: + case CurrencyCrystal: + case Bag: + { + updateBagDb( static_cast< InventoryType >( containerId ) ); + break; + } + + case GearSet: + { + if( pItem ) + m_pOwner->equipItem( static_cast< EquipSlot >( slotId ), pItem, true ); + else + m_pOwner->unequipItem( static_cast< EquipSlot >( slotId ), pItem ); + + updateMannequinDb( static_cast< InventoryType >( containerId ) ); + break; + } + default: + break; + } + + return true; +} + +void Core::Inventory::swapItem( uint16_t fromInventoryId, uint8_t fromSlotId, uint16_t toInventoryId, uint8_t toSlot ) +{ + auto fromItem = m_inventoryMap[fromInventoryId]->getItem( fromSlotId ); + auto toItem = m_inventoryMap[toInventoryId]->getItem( toSlot ); + auto& itemMap = m_inventoryMap[fromInventoryId]->getItemMap(); + + if( fromItem == nullptr || toItem == nullptr ) + return; + + // An item is being moved from bag0-3 to equippment, meaning + // the swapped out item will be placed in the matching armory. + if( isEquipment( toInventoryId ) + && !isEquipment( fromInventoryId ) + && !isArmory( fromInventoryId ) ) + { + updateContainer( fromInventoryId, fromSlotId, nullptr ); + fromInventoryId = getArmoryToEquipSlot( toSlot ); + fromSlotId = m_inventoryMap[fromInventoryId]->getFreeSlot(); + } + + auto containerTypeFrom = getContainerType( fromInventoryId ); + auto containerTypeTo = getContainerType( toInventoryId ); + + updateContainer( toInventoryId, toSlot, fromItem ); + updateContainer( fromInventoryId, fromSlotId, toItem ); +} + +void Core::Inventory::discardItem( uint16_t fromInventoryId, uint8_t fromSlotId ) +{ + // i am not entirely sure how this should be generated or if it even is important for us... + uint32_t transactionId = 1; + + auto fromItem = m_inventoryMap[fromInventoryId]->getItem( fromSlotId ); + + m_inventoryMap[fromInventoryId]->removeItem( fromSlotId ); + updateContainer( fromInventoryId, fromSlotId, nullptr ); + + GamePacketNew< FFXIVIpcInventoryTransaction > invTransPacket( m_pOwner->getId() ); + invTransPacket.data().transactionId = transactionId; + invTransPacket.data().ownerId = m_pOwner->getId(); + invTransPacket.data().storageId = fromInventoryId; + invTransPacket.data().catalogId = fromItem->getId(); + invTransPacket.data().stackSize = fromItem->getStackSize(); + invTransPacket.data().slotId = fromSlotId; + invTransPacket.data().type = 7; + m_pOwner->queuePacket( invTransPacket ); + + GamePacketNew< FFXIVIpcInventoryTransactionFinish > invTransFinPacket( m_pOwner->getId() ); + invTransFinPacket.data().transactionId = transactionId; + invTransFinPacket.data().transactionId1 = transactionId; + m_pOwner->queuePacket( invTransFinPacket ); +} + +Core::ItemPtr Core::Inventory::loadItem( uint64_t uId ) +{ + // load actual item + auto itemRes = g_database.query( "SELECT catalogId, stack, flags FROM charaglobalitem WHERE itemId = " + std::to_string( uId ) + ";" ); + if( !itemRes ) + return nullptr; + + try + { + Db::Field *itemField = itemRes->fetch(); + auto itemInfo = g_exdData.getItemInfo( itemField[0].getUInt32() ); + bool isHq = itemField[2].getUInt8() == 1 ? true : false; + ItemPtr pItem( new Item( uId, + itemInfo->id, + itemInfo->model_primary, + itemInfo->model_secondary, + static_cast< ItemCategory >( itemInfo->ui_category ), + isHq ) ); + pItem->setStackSize( itemField[1].getUInt32() ); + + return pItem; + } + catch( ... ) + { + return nullptr; + } +} + +bool Core::Inventory::load() +{ + ////////////////////////////////////////////////////////////////////////////////////////////////////// + // load active gearset + auto res = g_database.query( "SELECT storageId, container_0, container_1, container_2, container_3, " + "container_4, container_5, container_6, container_7, " + "container_8, container_9, container_10, container_11, " + "container_12, container_13 " + "FROM charaitemgearset " \ + "WHERE CharacterId = " + std::to_string( m_pOwner->getId() ) + " " \ + "ORDER BY storageId ASC;" ); + if( !res ) + return false; + + Db::Field *field = res->fetch(); + + do + { + uint16_t storageId = field[0].getUInt16(); + + for( int i = 1; i <= 14; i++ ) + { + uint64_t uItemId = field[i].getUInt64(); + if( uItemId == 0 ) + continue; + + ItemPtr pItem = loadItem( uItemId ); + + if( pItem == nullptr ) + continue; + + m_inventoryMap[storageId]->getItemMap()[i - 1] = pItem; + m_pOwner->equipItem( static_cast< EquipSlot >( i - 1 ), pItem, false ); + } + } while( res->nextRow() ); + + /////////////////////////////////////////////////////////////////////////////////////////////////////// + // Load Bags + auto bagRes = g_database.query( "SELECT storageId, " + "container_0, container_1, container_2, container_3, container_4, " + "container_5, container_6, container_7, container_8, container_9, " + "container_10, container_11, container_12, container_13, container_14, " + "container_15, container_16, container_17, container_18, container_19, " + "container_20, container_21, container_22, container_23, container_24, " + "container_25, container_26, container_27, container_28, container_29, " + "container_30, container_31, container_32, container_33, container_34 " + "FROM charaiteminventory " \ + "WHERE CharacterId = " + std::to_string( m_pOwner->getId() ) + " " \ + "ORDER BY storageId ASC;" ); + if( !bagRes ) + return false; + + Db::Field *bagField = bagRes->fetch(); + + do + { + uint16_t storageId = bagField[0].getUInt16(); + for( int i = 1; i <= 25; i++ ) + { + uint64_t uItemId = bagField[i].getUInt64(); + if( uItemId == 0 ) + continue; + + ItemPtr pItem = loadItem( uItemId ); + + if( pItem == nullptr ) + continue; + + m_inventoryMap[storageId]->getItemMap()[i - 1] = pItem; + } + } while( bagRes->nextRow() ); + + + /////////////////////////////////////////////////////////////////////////////////////////////////////// + // Load Currency + auto curRes = g_database.query( "SELECT storageId, " + "container_0, container_1, container_2, container_3, container_4, " + "container_5, container_6, container_7, container_8, container_9, " + "container_10, container_11 " + "FROM charaitemcurrency " \ + "WHERE CharacterId = " + std::to_string( m_pOwner->getId() ) + " " \ + "ORDER BY storageId ASC;" ); + if( !curRes ) + return false; + + Db::Field *curField = curRes->fetch(); + + do + { + uint16_t storageId = curField[0].getUInt16(); + for( int i = 1; i <= 12; i++ ) + { + uint64_t uItemId = curField[i].getUInt64(); + if( uItemId == 0 ) + continue; + + ItemPtr pItem = loadItem( uItemId ); + + if( pItem == nullptr ) + continue; + + m_inventoryMap[storageId]->getItemMap()[i - 1] = pItem; + } + } while( curRes->nextRow() ); + + + /////////////////////////////////////////////////////////////////////////////////////////////////////// + // Load Crystals + auto crystalRes = g_database.query( "SELECT storageId, " + "container_0, container_1, container_2, container_3, container_4, " + "container_5, container_6, container_7, container_8, container_9, " + "container_10, container_11, container_12, container_13, container_14, " + "container_15, container_16, container_17 " + "FROM charaitemcrystal " \ + "WHERE CharacterId = " + std::to_string( m_pOwner->getId() ) + " " \ + "ORDER BY storageId ASC;" ); + if( !crystalRes ) + return false; + + Db::Field *crystalField = crystalRes->fetch(); + + do + { + uint16_t storageId = crystalField[0].getUInt16(); + for( int i = 1; i <= 17; i++ ) + { + uint64_t uItemId = crystalField[i].getUInt64(); + if( uItemId == 0 ) + continue; + + ItemPtr pItem = loadItem( uItemId ); + + if( pItem == nullptr ) + continue; + + m_inventoryMap[storageId]->getItemMap()[i - 1] = pItem; + } + } while( crystalRes->nextRow() ); + + return true; +} + + +void Core::Inventory::send() +{ + InventoryMap::iterator it; + + int count = 0; + for( it = m_inventoryMap.begin(); it != m_inventoryMap.end(); ++it, count++ ) + { + + auto pMap = it->second->getItemMap(); + auto itM = pMap.begin(); + + for( ; itM != pMap.end(); ++itM ) + { + if( !itM->second ) + return; + + if( it->second->getId() == InventoryType::Currency || it->second->getId() == InventoryType::Crystal ) + { + GamePacketNew< FFXIVIpcCurrencyCrystalInfo > currencyInfoPacket( m_pOwner->getId() ); + currencyInfoPacket.data().sequence = count; + currencyInfoPacket.data().catalogId = itM->second->getId(); + currencyInfoPacket.data().unknown = 1; + currencyInfoPacket.data().quantity = itM->second->getStackSize(); + currencyInfoPacket.data().containerId = it->second->getId(); + currencyInfoPacket.data().slot = 0; + m_pOwner->queuePacket( currencyInfoPacket ); + } + else + { + GamePacketNew< FFXIVIpcItemInfo > itemInfoPacket( m_pOwner->getId() ); + itemInfoPacket.data().sequence = count; + itemInfoPacket.data().containerId = it->second->getId(); + itemInfoPacket.data().slot = itM->first; + itemInfoPacket.data().quantity = itM->second->getStackSize(); + itemInfoPacket.data().catalogId = itM->second->getId(); + itemInfoPacket.data().condition = 30000; + itemInfoPacket.data().spiritBond = 0; + itemInfoPacket.data().hqFlag = itM->second->isHq() ? 1 : 0; + m_pOwner->queuePacket( itemInfoPacket ); + } + } + + GamePacketNew< FFXIVIpcContainerInfo > containerInfoPacket( m_pOwner->getId() ); + containerInfoPacket.data().sequence = count; + containerInfoPacket.data().numItems = it->second->getEntryCount(); + containerInfoPacket.data().containerId = it->second->getId(); + m_pOwner->queuePacket( containerInfoPacket ); + + + } + +} + +uint8_t Core::Inventory::getFreeSlotsInBags() +{ + uint8_t slots = 0; + for( uint8_t container : { 0, 1, 2, 3 } ) + { + slots += 25 - m_inventoryMap[container]->getEntryCount(); + } + return slots; +} + + +Core::Inventory::ContainerType Core::Inventory::getContainerType( uint32_t containerId ) +{ + if( containerId < 5 ) + { + return Bag; + } + else if( containerId < 2000 ) + { + return GearSet; + } + else if( containerId < 3200 ) + { + return CurrencyCrystal; + } + else if( containerId < 3600 ) + { + return Armory; + } + else + { + return Unknown; + } +} diff --git a/src/servers/Server_Zone/Inventory.h b/src/servers/Server_Zone/Inventory.h new file mode 100644 index 00000000..b7bf0044 --- /dev/null +++ b/src/servers/Server_Zone/Inventory.h @@ -0,0 +1,196 @@ +#ifndef INVENTORY_H_ +#define INVENTORY_H_ +#include +#include +#include "Forwards.h" + +namespace Core +{ + +class ItemContainer; + +typedef std::map< uint16_t, ItemContainerPtr > InventoryMap; +class Inventory +{ +public: + Inventory( Entity::PlayerPtr pOwner ); + ~Inventory(); + + enum ContainerType : uint16_t + { + Unknown = 0, + Bag = 1, + GearSet = 2, + CurrencyCrystal = 3, + Armory = 4 + }; + + enum InventoryType : uint16_t + { + Bag0 = 0, + Bag1 = 1, + Bag2 = 2, + Bag3 = 3, + + GearSet0 = 1000, + GearSet1 = 1001, + + Currency = 2000, + Crystal = 2001, + //UNKNOWN_0 = 2003, + KeyItem = 2004, + DamagedGear = 2007, + //UNKNOWN_1 = 2008, + + ArmoryOff = 3200, + ArmoryHead = 3201, + ArmoryBody = 3202, + ArmoryHand = 3203, + ArmoryWaist = 3204, + ArmoryLegs = 3205, + ArmoryFeet = 3206, + ArmotyNeck = 3207, + ArmoryEar = 3208, + ArmoryWrist = 3209, + ArmoryRing = 3300, + + ArmorySoulCrystal = 3400, + ArmoryMain = 3500, + + RetainerBag0 = 10000, + RetainerBag1 = 10001, + RetainerBag2 = 10002, + RetainerBag3 = 10003, + RetainerBag4 = 10004, + RetainerBag5 = 10005, + RetainerBag6 = 10006, + RetainerEquippedGear = 11000, + RetainerGil = 12000, + RetainerCrystal = 12001, + RetainerMarket = 12002, + + FreeCompanyBag0 = 20000, + FreeCompanyBag1 = 20001, + FreeCompanyBag2 = 20002, + FreeCompanyGil = 22000, + FreeCompanyCrystal = 22001 + }; + + enum CurrencyType : uint8_t + { + Gil = 0x01, + StormSeal = 0x02, + SerpentSeal = 0x03, + FlameSeal = 0x04, + TomestonePhilo = 0x05, + TomestoneMytho = 0x06, + WolfMark = 0x07, + TomestoneSold = 0x08, + AlliedSeal = 0x09, + TomestonePoet = 0x0A, + Mgp = 0x0B, + TomestoneLaw = 0x0C, + TomestoneEso = 0x0D, + TomestoneLore = 0x0E + }; + + enum CrystalType : uint8_t + { + FireShard = 0x01, + IceShard = 0x02, + WindShard = 0x03, + EarthShard = 0x04, + LightningShard = 0x05, + WaterShard = 0x06, + + FireCrystal = 0x07, + IceCrystal = 0x08, + WindCrystal = 0x09, + EarthCrystal = 0x0A, + LightningCrystal = 0x0B, + WaterCrystal = 0x0C, + + FireCluster = 0x0D, + IceCluster = 0x0E, + WindCluster = 0x0F, + EarthCluster = 0x10, + LightningCluster = 0x11, + WaterCluster = 0x12 + }; + + enum EquipSlot : uint8_t + { + MainHand = 0, + OffHand = 1, + Head = 2, + Body = 3, + Hands = 4, + Waist = 5, + Legs = 6, + Feet = 7, + Neck = 8, + Ear = 9, + Wrist = 10, + Ring1 = 11, + Ring2 = 12, + SoulCrystal = 13, + }; + typedef std::pair< uint16_t, int8_t > InvSlotPair; + typedef std::vector< InvSlotPair > InvSlotPairVec; + + InvSlotPairVec getSlotsOfItemsInInventory( uint32_t catalogId ); + InvSlotPair getFreeBagSlot(); + int16_t addItem( uint16_t inventoryId, int8_t slotId, uint32_t catalogId, uint16_t quantity = 1 ); + void moveItem( uint16_t fromInventoryId, uint8_t fromSlotId, uint16_t toInventoryId, uint8_t toSlot ); + void swapItem( uint16_t fromInventoryId, uint8_t fromSlotId, uint16_t toInventoryId, uint8_t toSlot ); + void discardItem( uint16_t fromInventoryId, uint8_t fromSlotId ); + + ItemPtr createItem( uint32_t catalogId, uint8_t quantity = 1 ); + + ItemPtr loadItem( uint64_t uId ); + + ItemPtr getItemAt( uint16_t containerId, uint8_t slotId ); + + bool updateContainer( uint16_t containerId, uint8_t slotId, ItemPtr pItem ); + + /*! return the current amount of currency of type */ + uint32_t getCurrency( CurrencyType type ); + /*! add amount to the current of type */ + bool addCurrency( CurrencyType type, uint32_t amount ); + /*! remove amount from the currency of type */ + bool removeCurrency( CurrencyType type, uint32_t amount ); + + void updateCurrencyDb(); + void updateBagDb( InventoryType type ); + void updateMannequinDb( InventoryType type ); + void updateItemDb( ItemPtr pItem ) const; + + bool isArmory( uint16_t containerId ); + bool isEquipment( uint16_t containerId ); + uint16_t getArmoryToEquipSlot( uint8_t slotId ); + + /*! return the crystal amount of currency of type */ + uint32_t getCrystal( CrystalType type ); + /*! add amount to the crystal of type */ + bool addCrystal( CrystalType type, uint32_t amount ); + /*! remove amount from the crystals of type */ + bool removeCrystal( CrystalType type, uint32_t amount ); + bool isObtainable( uint32_t catalogId, uint16_t quantity ); + + void updateCrystalDb(); + + bool load(); + + void send(); + + uint8_t getFreeSlotsInBags(); + + ContainerType getContainerType( uint32_t containerId ); + +private: + Entity::PlayerPtr m_pOwner; + InventoryMap m_inventoryMap; +}; + +} +#endif diff --git a/src/servers/Server_Zone/Item.cpp b/src/servers/Server_Zone/Item.cpp new file mode 100644 index 00000000..e07083af --- /dev/null +++ b/src/servers/Server_Zone/Item.cpp @@ -0,0 +1,105 @@ +#include +#include +#include "Item.h" + +extern Core::Data::ExdData g_exdData; + +Core::Item::Item() +{ + +} + +Core::Item::Item( uint32_t catalogId ) : + m_id( catalogId ), + m_isHq( false ) +{ + +} + +Core::Item::Item( uint64_t uId, uint32_t catalogId, uint64_t model1, uint64_t model2, Common::ItemCategory categoryId, bool isHq ) : + m_id( catalogId ), + m_uId( uId ), + m_category( categoryId ), + m_model1( model1 ), + m_model2( model2 ), + m_isHq( isHq ) +{ + auto itemInfo = g_exdData.getItemInfo( catalogId ); + m_delayMs = itemInfo->delayMs; +} + +Core::Item::~Item() +{ + +} + +uint16_t Core::Item::getDelay() const +{ + return m_delayMs; +} + +uint32_t Core::Item::getId() const +{ + return m_id; +} + +void Core::Item::setId( uint32_t id ) +{ + m_id = id; +} + +uint64_t Core::Item::getUId() const +{ + return m_uId; +} + +void Core::Item::setUId( uint64_t id ) +{ + m_uId = id; +} + +void Core::Item::setStackSize( uint32_t size ) +{ + m_stackSize = size; +} + +uint32_t Core::Item::getStackSize() const +{ + return m_stackSize; +} + +void Core::Item::setCategory( Common::ItemCategory categoryId ) +{ + m_category = categoryId; +} + +Core::Common::ItemCategory Core::Item::getCategory() const +{ + return m_category; +} + +void Core::Item::setModelIds( uint64_t model1, uint64_t model2 ) +{ + m_model1 = model1; + m_model2 = model2; +} + +uint64_t Core::Item::getModelId1() const +{ + return m_model1; +} + +uint64_t Core::Item::getModelId2() const +{ + return m_model2; +} + +bool Core::Item::isHq() const +{ + return m_isHq; +} + +void Core::Item::setHq( bool isHq ) +{ + m_isHq = isHq; +} diff --git a/src/servers/Server_Zone/Item.h b/src/servers/Server_Zone/Item.h new file mode 100644 index 00000000..886680a1 --- /dev/null +++ b/src/servers/Server_Zone/Item.h @@ -0,0 +1,66 @@ +#ifndef _ITEM_H_ +#define _ITEM_H_ + +#include + +namespace Core { + +class Item +{ + +public: + Item(); + Item( uint32_t catalogId ); + Item( uint64_t uId, uint32_t catalogId, uint64_t model1, uint64_t model2, Common::ItemCategory categoryId, bool isHq = false ); + ~Item(); + + uint32_t getId() const; + + void setId( uint32_t id ); + + uint64_t getUId() const; + + void setUId( uint64_t id ); + + void setStackSize( uint32_t size ); + + uint32_t getStackSize() const; + + void setCategory( Common::ItemCategory categoryId ); + + Common::ItemCategory getCategory() const; + + void setModelIds( uint64_t model1, uint64_t model2 ); + + uint64_t getModelId1() const; + + uint64_t getModelId2() const; + + bool isHq() const; + + void setHq( bool isHq ); + uint16_t getDelay() const; + + +protected: + uint32_t m_id; + + uint64_t m_uId; + + Common::ItemCategory m_category; + + uint32_t m_stackSize; + std::vector< uint8_t > m_classJobList; + + uint64_t m_model1; + uint64_t m_model2; + + bool m_isHq; + + uint16_t m_delayMs; + +}; + +} + +#endif \ No newline at end of file diff --git a/src/servers/Server_Zone/ItemContainer.cpp b/src/servers/Server_Zone/ItemContainer.cpp new file mode 100644 index 00000000..76d97eb9 --- /dev/null +++ b/src/servers/Server_Zone/ItemContainer.cpp @@ -0,0 +1,99 @@ +#include "Forwards.h" +#include "ItemContainer.h" + +#include +#include +#include + +#include "Player.h" + +#include "Item.h" + +extern Core::Logger g_log; +extern Core::Db::Database g_database; + +Core::ItemContainer::ItemContainer( uint16_t locationId ) : + m_id( locationId ), + m_size( 25 ) +{ + +} + +Core::ItemContainer::~ItemContainer() +{ + +} + +uint16_t Core::ItemContainer::getId() const +{ + return m_id; +} + +uint8_t Core::ItemContainer::getEntryCount() const +{ + return static_cast< uint8_t >( m_itemMap.size() ); +} + +void Core::ItemContainer::removeItem( uint8_t slotId ) +{ + ItemMap::iterator it = m_itemMap.find( slotId ); + + if( it != m_itemMap.end() ) + { + + + g_database.execute( "DELETE FROM charaglobalitem " \ + "WHERE itemId = %i ", + it->second->getUId() ); + + m_itemMap.erase( it ); + + g_log.debug( "Dropped item from slot " + std::to_string( slotId ) ); + } + else + { + g_log.debug( "Item could not be dropped from slot " + std::to_string( slotId ) ); + } +} + +Core::ItemMap & Core::ItemContainer::getItemMap() +{ + return m_itemMap; +} + +const Core::ItemMap & Core::ItemContainer::getItemMap() const +{ + return m_itemMap; +} + +int16_t Core::ItemContainer::getFreeSlot() +{ + for( unsigned char slotId = 0; slotId < m_size; slotId++ ) + { + ItemMap::iterator it = m_itemMap.find( slotId ); + if( it == m_itemMap.end() || + it->second == nullptr ) + return slotId; + } + return -1; +} + +Core::ItemPtr Core::ItemContainer::getItem( uint8_t slotId ) +{ + + if( ( slotId > m_size ) || ( slotId == -1 ) ) + { + g_log.error( "Slot out of range " + std::to_string( slotId ) ); + return nullptr; + } + + return m_itemMap[slotId]; +} + +void Core::ItemContainer::setItem( uint8_t slotId, Core::ItemPtr pItem ) +{ + if( ( slotId > m_size ) ) + return; + + m_itemMap[slotId] = pItem; +} diff --git a/src/servers/Server_Zone/ItemContainer.h b/src/servers/Server_Zone/ItemContainer.h new file mode 100644 index 00000000..7fe8b7aa --- /dev/null +++ b/src/servers/Server_Zone/ItemContainer.h @@ -0,0 +1,48 @@ +#pragma once +#ifndef _ITEMCONTAINER_H_ +#define _ITEMCONTAINER_H_ + +#include + +#include + +#include "Forwards.h" + +namespace Core +{ + + typedef std::map< uint8_t, ItemPtr > ItemMap; + + class ItemContainer + { + + public: + ItemContainer(uint16_t locationId); + ~ItemContainer(); + + uint16_t getId() const; + + uint8_t getEntryCount() const; + + void removeItem( uint8_t slotId ); + + ItemMap& getItemMap(); + + const ItemMap& getItemMap() const; + + ItemPtr getItem(uint8_t slotId); + + void setItem(uint8_t slotId, ItemPtr item); + + int16_t getFreeSlot(); + + private: + uint16_t m_id; + uint8_t m_size; + ItemMap m_itemMap; + Entity::PlayerPtr m_pOwner; + }; + +} + +#endif \ No newline at end of file diff --git a/src/servers/Server_Zone/ModelEquipPacket.h b/src/servers/Server_Zone/ModelEquipPacket.h new file mode 100644 index 00000000..8e826c3a --- /dev/null +++ b/src/servers/Server_Zone/ModelEquipPacket.h @@ -0,0 +1,44 @@ +#ifndef _MODELEQUIPPACKET_H +#define _MODELEQUIPPACKET_H + +#include +#include "Player.h" +#include "Forwards.h" + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +/** +* @brief The update model packet. +*/ +class ModelEquipPacket : + public GamePacketNew +{ +public: + ModelEquipPacket( Entity::PlayerPtr player ) : + GamePacketNew( player->getId(), player->getId() ) + { + initialize( player ); + }; + +private: + void initialize( Entity::PlayerPtr player ) + { + m_data.mainWeapon = player->getModelMainWeapon(); + m_data.offWeapon = player->getModelSubWeapon(); + m_data.models[0] = player->getModelForSlot( Inventory::EquipSlot::Head ); + m_data.models[1] = player->getModelForSlot( Inventory::EquipSlot::Body ); + m_data.models[2] = player->getModelForSlot( Inventory::EquipSlot::Hands ); + m_data.models[3] = player->getModelForSlot( Inventory::EquipSlot::Legs ); + m_data.models[4] = player->getModelForSlot( Inventory::EquipSlot::Feet ); + }; +}; + +} +} +} +} + +#endif /*_MODELEQUIPPACKET_H*/ \ No newline at end of file diff --git a/src/servers/Server_Zone/MoveActorPacket.h b/src/servers/Server_Zone/MoveActorPacket.h new file mode 100644 index 00000000..c2d042c0 --- /dev/null +++ b/src/servers/Server_Zone/MoveActorPacket.h @@ -0,0 +1,51 @@ +#ifndef _MOVEACTORPACKET_H +#define _MOVEACTORPACKET_H + +#include +#include +#include +#include "Player.h" +#include "Forwards.h" + + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +/** +* @brief The Client UI Initialization packet. This must be sent to the client +* once upon connection to configure the UI. +*/ +class MoveActorPacket : + public GamePacketNew +{ +public: + MoveActorPacket( Entity::ActorPtr actor, uint8_t unk1, uint8_t unk2, uint8_t unk3, uint16_t unk4 ) : + GamePacketNew( actor->getId(), actor->getId() ) + { + initialize( actor, unk1, unk2, unk3, unk4 ); + }; + +private: + void initialize( Entity::ActorPtr actor, uint8_t unk1, uint8_t unk2, uint8_t unk3, uint16_t unk4 ) + { + + m_data.rotation = Math::Util::floatToUInt8Rot( actor->getRotation() ); + m_data.unknown_1 = unk1; + m_data.unknown_2 = unk2; + m_data.unknown_3 = unk3; + m_data.unknown_4 = unk4; + m_data.posX = Math::Util::floatToUInt16( actor->getPos().x ); + m_data.posY = Math::Util::floatToUInt16( actor->getPos().y ); + m_data.posZ = Math::Util::floatToUInt16( actor->getPos().z ); + + }; +}; + +} +} +} +} + +#endif /*_MOVEACTORPACKET_H*/ \ No newline at end of file diff --git a/src/servers/Server_Zone/PacketHandlers.cpp b/src/servers/Server_Zone/PacketHandlers.cpp new file mode 100644 index 00000000..fdd1f42f --- /dev/null +++ b/src/servers/Server_Zone/PacketHandlers.cpp @@ -0,0 +1,1134 @@ +#include +#include +#include +#include +#include +#include +#include + +#include + + +#include "GameConnection.h" + +#include "Session.h" +#include "Zone.h" +#include "ZonePosition.h" +#include "ServerZone.h" +#include "ZoneMgr.h" + +#include "InitUIPacket.h" +#include "PingPacket.h" +#include "MoveActorPacket.h" +#include "ChatPacket.h" +#include "ServerNoticePacket.h" +#include "ActorControlPacket142.h" +#include "ActorControlPacket143.h" +#include "ActorControlPacket144.h" +#include "EventStartPacket.h" +#include "EventFinishPacket.h" +#include "PlayerStateFlagsPacket.h" + + +#include "GameCommandHandler.h" + +#include "Player.h" +#include "Inventory.h" + +#include "Forwards.h" + +#include "EventHelper.h" + +#include "Action.h" +#include "ActionTeleport.h" + +extern Core::Logger g_log; +extern Core::Db::Database g_database; +extern Core::ServerZone g_serverZone; +extern Core::ZoneMgr g_zoneMgr; +extern Core::Data::ExdData g_exdData; +extern Core::GameCommandHandler g_gameCommandMgr; + +using namespace Core::Common; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +void Core::Network::GameConnection::fcInfoReqHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + GamePacketPtr pPe( new GamePacket( 0xDD, 0x78, pPlayer->getId(), pPlayer->getId() ) ); + pPe->setValAt< uint8_t >( 0x48, 0x01 ); + queueOutPacket( pPe ); +} + +void Core::Network::GameConnection::setSearchInfoHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + uint32_t inval = pInPacket->getValAt< uint32_t >( 0x20 ); + uint32_t inval1 = pInPacket->getValAt< uint32_t >( 0x24 ); + uint64_t status = pInPacket->getValAt< uint64_t >( 0x20 ); + + uint8_t selectRegion = pInPacket->getValAt< uint8_t >( 0x31 ); + + pPlayer->setSearchInfo( selectRegion, 0, pInPacket->getStringAt( 0x32 ) ); + + pPlayer->setOnlineStatusMask( status ); + + if( pPlayer->isNewAdventurer() && !( inval & 0x01000000 ) ) + // mark player as not new adventurer anymore + pPlayer->setNewAdventurer( false ); + else if( inval & 0x01000000 ) + // mark player as new adventurer + pPlayer->setNewAdventurer( true ); + + GamePacketNew< FFXIVIpcSetOnlineStatus > statusPacket( pPlayer->getId() ); + statusPacket.data().onlineStatusFlags = status; + queueOutPacket( statusPacket ); + + GamePacketNew< FFXIVIpcSetSearchInfo > searchInfoPacket( pPlayer->getId() ); + searchInfoPacket.data().onlineStatusFlags = status; + searchInfoPacket.data().selectRegion = pPlayer->getSearchSelectRegion(); + sprintf( searchInfoPacket.data().searchMessage, pPlayer->getSearchMessage() ); + queueOutPacket( searchInfoPacket ); + + pPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatusIcon, + static_cast< uint8_t >( pPlayer->getOnlineStatus() ) ), + true ); +} + +void Core::Network::GameConnection::reqSearchInfoHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + GamePacketNew< FFXIVIpcInitSearchInfo > searchInfoPacket( pPlayer->getId() ); + searchInfoPacket.data().onlineStatusFlags = pPlayer->getOnlineStatusMask(); + searchInfoPacket.data().selectRegion = pPlayer->getSearchSelectRegion(); + sprintf( searchInfoPacket.data().searchMessage, pPlayer->getSearchMessage() ); + queueOutPacket( searchInfoPacket ); +} + +void Core::Network::GameConnection::linkshellListHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + GamePacketNew< FFXIVIpcLinkshellList > linkshellListPacket( pPlayer->getId() ); + queueOutPacket( linkshellListPacket ); +} + +// TODO: move this and the handlers to a gm command handler +enum GmCommand +{ + Pos = 0x0000, + Lv = 0x0001, + Race = 0x0002, + Tribe = 0x0003, + Sex = 0x0004, + Time = 0x0005, + Weather = 0x0006, + Call = 0x0007, + Inspect = 0x0008, + Speed = 0x0009, + Invis = 0x000D, + + Raise = 0x0010, + Kill = 0x000E, + Icon = 0x0012, + + Hp = 0x0064, + Mp = 0x0065, + Tp = 0x0066, + Gp = 0x0067, + + Item = 0x00C8, + Gil = 0x00C9, + Collect = 0x00CA, + + QuestAccept = 0x012C, + QuestCancel = 0x012D, + QuestComplete = 0x012E, + QuestIncomplete = 0x012F, + QuestSequence = 0x0130, + QuestInspect = 0x0131, + GC = 0x0154, + GCRank = 0x0155, + TeriInfo = 0x025D, + Jump = 0x025E, + JumpNpc = 0x025F, +}; +void Core::Network::GameConnection::gm1Handler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + uint32_t commandId = pInPacket->getValAt< uint32_t >( 0x20 ); + uint32_t param1 = pInPacket->getValAt< uint32_t >( 0x24 ); + uint32_t param2 = pInPacket->getValAt< uint32_t >( 0x28 ); + uint32_t param3 = pInPacket->getValAt< uint32_t >( 0x38 ); + + g_log.debug( pPlayer->getName() + " used GM1 commandId: " + std::to_string( commandId ) + ", params: " + std::to_string( param1 ) + ", " + std::to_string( param2 ) + ", " + std::to_string( param3 ) ); + + Core::Entity::ActorPtr targetActor; + + if( pPlayer->getId() == param3 ) + { + targetActor = pPlayer; + } + else { + auto inRange = pPlayer->getInRangeActors(); + for( auto actor : inRange ) + { + if( actor->getId() == param3 ) + { + targetActor = actor; + } + } + } + + switch( commandId ) + { + case GmCommand::Kill: + { + targetActor->takeDamage( 9999999 ); + pPlayer->sendNotice( "Killed " + std::to_string( targetActor->getId() ) ); + break; + } + case GmCommand::QuestSequence: + { + targetActor->getAsPlayer()->updateQuest( param1, param2 ); + break; + } + case GmCommand::QuestComplete: + { + targetActor->getAsPlayer()->finishQuest( param1 ); + break; + } + case GmCommand::QuestAccept: + { + targetActor->getAsPlayer()->updateQuest( param1, 1 ); + break; + } + case GmCommand::QuestCancel: + { + targetActor->getAsPlayer()->removeQuest( param1 ); + break; + } + case GmCommand::QuestIncomplete: + { + targetActor->getAsPlayer()->unfinishQuest( param1 ); + break; + } + case GmCommand::Speed: + { + targetActor->getAsPlayer()->queuePacket( ActorControlPacket143( pPlayer->getId(), Flee, param1 ) ); + pPlayer->sendNotice( "Speed for " + targetActor->getAsPlayer()->getName() + " was set to " + std::to_string( param1 ) ); + break; + } + case GmCommand::Gil: + { + targetActor->getAsPlayer()->addCurrency( 1, param1 ); + pPlayer->sendNotice( "Added " + std::to_string( param1 ) + " Gil for " + targetActor->getAsPlayer()->getName() ); + break; + } + case GmCommand::Lv: + { + targetActor->getAsPlayer()->setLevel( param1 ); + pPlayer->sendNotice( "Level for " + targetActor->getAsPlayer()->getName() + " was set to " + std::to_string( param1 ) ); + break; + } + case GmCommand::Hp: + { + targetActor->getAsPlayer()->setHp( param1 ); + pPlayer->sendNotice( "Tp for " + targetActor->getAsPlayer()->getName() + " was set to " + std::to_string( param1 ) ); + break; + } + case GmCommand::Mp: + { + targetActor->getAsPlayer()->setMp( param1 ); + pPlayer->sendNotice( "Mp for " + targetActor->getAsPlayer()->getName() + " was set to " + std::to_string( param1 ) ); + break; + } + case GmCommand::Gp: + { + targetActor->getAsPlayer()->setHp( param1 ); + pPlayer->sendNotice( "Gp for " + targetActor->getAsPlayer()->getName() + " was set to " + std::to_string( param1 ) ); + break; + } + case GmCommand::Sex: + { + targetActor->getAsPlayer()->setLookAt( CharaLook::Gender, param1 ); + pPlayer->sendNotice( "Sex for " + targetActor->getAsPlayer()->getName() + " was set to " + std::to_string( param1 ) ); + targetActor->spawn( targetActor->getAsPlayer() ); + auto inRange = targetActor->getInRangeActors(); + for( auto actor : inRange ) + { + targetActor->getAsPlayer()->despawn( actor->getAsPlayer() ); + targetActor->getAsPlayer()->spawn( actor->getAsPlayer() ); + } + break; + } + case GmCommand::Race: + { + targetActor->getAsPlayer()->setLookAt( CharaLook::Race, param1 ); + pPlayer->sendNotice( "Race for " + targetActor->getAsPlayer()->getName() + " was set to " + std::to_string( param1 ) ); + targetActor->spawn( targetActor->getAsPlayer() ); + auto inRange = targetActor->getInRangeActors(); + for( auto actor : inRange ) + { + targetActor->getAsPlayer()->despawn( actor->getAsPlayer() ); + targetActor->getAsPlayer()->spawn( actor->getAsPlayer() ); + } + break; + } + case GmCommand::Tribe: + { + targetActor->getAsPlayer()->setLookAt( CharaLook::Tribe, param1 ); + pPlayer->sendNotice( "Tribe for " + targetActor->getAsPlayer()->getName() + " was set to " + std::to_string( param1 ) ); + targetActor->spawn( targetActor->getAsPlayer() ); + auto inRange = targetActor->getInRangeActors(); + for( auto actor : inRange ) + { + targetActor->getAsPlayer()->despawn( actor->getAsPlayer() ); + targetActor->getAsPlayer()->spawn( actor->getAsPlayer() ); + } + break; + } + case GmCommand::Item: + { + if( param2 < 1 || param2 > 99 ) + { + param2 = 1; + } + + if( ( param1 == 0xcccccccc ) ) + { + pPlayer->sendUrgent( "Syntaxerror." ); + return; + } + + if( !targetActor->getAsPlayer()->addItem( -1, param1, param2 ) ) + pPlayer->sendUrgent( "Item " + std::to_string( param1 ) + " not found..." ); + break; + } + case GmCommand::Weather: + { + targetActor->getAsPlayer()->getCurrentZone()->setWeatherOverride( param1 ); + pPlayer->sendNotice( "Weather in Zone \"" + targetActor->getAsPlayer()->getCurrentZone()->getName() + "\" of " + targetActor->getAsPlayer()->getName() + " set in range." ); + break; + } + case GmCommand::TeriInfo: + { + pPlayer->sendNotice( "ZoneId: " + std::to_string( pPlayer->getZoneId() ) + "\nName: " + pPlayer->getCurrentZone()->getName() + "\nInternalName: " + pPlayer->getCurrentZone()->getInternalName() + "\nPopCount: " + std::to_string( pPlayer->getCurrentZone()->getPopCount() ) + + "\nCurrentWeather:" + std::to_string( pPlayer->getCurrentZone()->getCurrentWeather() ) + "\nNextWeather:" + std::to_string( pPlayer->getCurrentZone()->getNextWeather() ) ); + break; + } + case GmCommand::Jump: + { + + auto inRange = pPlayer->getInRangeActors(); + for( auto actor : inRange ) + { + pPlayer->changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z, targetActor->getRotation() ); + } + pPlayer->sendNotice( "Jumping to " + targetActor->getAsPlayer()->getName() + " in range." ); + break; + } + case GmCommand::Collect: + { + uint32_t gil = targetActor->getAsPlayer()->getCurrency( 1 ); + + if( gil < param1 ) + { + pPlayer->sendUrgent( "Player does not have enough Gil(" + std::to_string( gil ) + ")" ); + } + else + { + targetActor->getAsPlayer()->removeCurrency( 1, param1 ); + pPlayer->sendNotice( "Removed " + std::to_string( param1 ) + " Gil from " + targetActor->getAsPlayer()->getName() + "(" + std::to_string( gil ) + " before)" ); + } + break; + } + case GmCommand::Icon: + { + targetActor->getAsPlayer()->setOnlineStatusMask( param1 ); + + GamePacketNew< FFXIVIpcSetOnlineStatus > statusPacket( targetActor->getAsPlayer()->getId() ); + statusPacket.data().onlineStatusFlags = param1; + queueOutPacket( statusPacket ); + + GamePacketNew< FFXIVIpcSetSearchInfo > searchInfoPacket( targetActor->getAsPlayer()->getId() ); + searchInfoPacket.data().onlineStatusFlags = param1; + searchInfoPacket.data().selectRegion = targetActor->getAsPlayer()->getSearchSelectRegion(); + sprintf( searchInfoPacket.data().searchMessage, targetActor->getAsPlayer()->getSearchMessage() ); + targetActor->getAsPlayer()->queuePacket( searchInfoPacket ); + + targetActor->getAsPlayer()->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatusIcon, + static_cast< uint8_t >( pPlayer->getOnlineStatus() ) ), + true ); + pPlayer->sendNotice( "Icon for " + targetActor->getAsPlayer()->getName() + " was set to " + std::to_string( param1 ) ); + break; + } + case GmCommand::GC: + { + targetActor->getAsPlayer()->setGc( param1 ); + pPlayer->sendNotice( "GC for " + targetActor->getAsPlayer()->getName() + " was set to " + std::to_string( targetActor->getAsPlayer()->getGc() ) ); + break; + } + case GmCommand::GCRank: + { + targetActor->getAsPlayer()->setGcRankAt( targetActor->getAsPlayer()->getGc() - 1, param1 ); + pPlayer->sendNotice( "GC Rank for " + targetActor->getAsPlayer()->getName() + " for GC " + std::to_string( targetActor->getAsPlayer()->getGc()) + " was set to " + std::to_string( targetActor->getAsPlayer()->getGcRankArray()[targetActor->getAsPlayer()->getGc() - 1] ) ); + break; + } + + default: + pPlayer->sendUrgent( "GM1 Command not implemented: " + std::to_string( commandId ) ); + break; + } + +} + +void Core::Network::GameConnection::gm2Handler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + uint32_t commandId = pInPacket->getValAt< uint32_t >( 0x20 ); + std::string param1 = pInPacket->getStringAt( 0x34 ); + + g_log.debug( pPlayer->getName() + " used GM2 commandId: " + std::to_string( commandId ) + ", params: " + param1 ); + + auto targetSession = g_serverZone.getSession( param1 ); + Core::Entity::ActorPtr targetActor; + + if( targetSession != nullptr ) + { + targetActor = targetSession->getPlayer(); + } + else + { + if( param1 == "self" ) + { + targetActor = pPlayer; + } + else + { + pPlayer->sendUrgent("Player " + param1 + " not found on this server."); + return; + } + } + + switch( commandId ) + { + case GmCommand::Raise: + { + targetActor->getAsPlayer()->resetHp(); + targetActor->getAsPlayer()->resetMp(); + targetActor->getAsPlayer()->setStatus( Entity::Actor::ActorStatus::Idle ); + targetActor->getAsPlayer()->setSyncFlag( Status ); + + targetActor->getAsPlayer()->sendToInRangeSet( ActorControlPacket143( pPlayer->getId(), ZoneIn, 0x01, 0x01, 0, 113 ), true ); + targetActor->getAsPlayer()->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatus, static_cast< uint8_t >( Entity::Actor::ActorStatus::Idle ) ), true ); + pPlayer->sendNotice( "Raised " + targetActor->getAsPlayer()->getName()); + break; + } + case GmCommand::Jump: + { + if( targetActor->getAsPlayer()->getZoneId() != pPlayer->getZoneId() ) + { + pPlayer->setZone( targetActor->getAsPlayer()->getZoneId() ); + } + pPlayer->changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z, targetActor->getRotation() ); + pPlayer->sendNotice( "Jumping to " + targetActor->getAsPlayer()->getName()); + break; + } + case GmCommand::Call: + { + if( targetActor->getAsPlayer()->getZoneId() != pPlayer->getZoneId() ) + { + targetActor->getAsPlayer()->setZone( pPlayer->getZoneId() ); + } + targetActor->getAsPlayer()->changePosition( pPlayer->getPos().x, pPlayer->getPos().y, pPlayer->getPos().z, pPlayer->getRotation() ); + pPlayer->sendNotice( "Calling " + targetActor->getAsPlayer()->getName() ); + break; + } + case GmCommand::Inspect: + { + pPlayer->sendNotice( "Name: " + targetActor->getAsPlayer()->getName() + "\nGil: " + std::to_string( targetActor->getAsPlayer()->getCurrency( 1 ) ) + "\nZone: " + targetActor->getAsPlayer()->getCurrentZone()->getName() + "(" + std::to_string( targetActor->getAsPlayer()->getZoneId() ) + ")" + + "\nClass: " + std::to_string( targetActor->getAsPlayer()->getClass() ) + "\nLevel: " + std::to_string( targetActor->getAsPlayer()->getLevel() ) + "\nExp: " + std::to_string( targetActor->getAsPlayer()->getExp() ) + "\nSearchMessage: " + targetActor->getAsPlayer()->getSearchMessage() + + "\nPlayTime: " + std::to_string( targetActor->getAsPlayer()->getPlayTime() ) ); + break; + } + + default: + pPlayer->sendUrgent( "GM2 Command not implemented: " + std::to_string( commandId ) ); + break; + } +} + +void Core::Network::GameConnection::updatePositionHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + // if the player is marked for zoning we no longer want to update his pos + if( pPlayer->isMarkedForZoning() ) + return; + + struct testMov + { + uint32_t specialMovement : 23; // 0x00490FDA + uint32_t strafe : 7; + uint32_t moveBackward : 1; + uint32_t strafeRight : 1; // if 0, strafe left. + } IPC_OP_019A; + + struct testMov1 + { + uint16_t bit1 : 1; // 0x00490FDA + uint16_t bit2 : 1; + uint16_t bit3 : 1; + uint16_t bit4 : 1; + uint16_t bit5 : 1; + uint16_t bit6 : 1; + uint16_t bit7 : 1; + uint16_t bit8 : 1; + uint16_t bit9 : 1; // 0x00490FDA + uint16_t bit10 : 1; + uint16_t bit11 : 1; + uint16_t bit12 : 1; + uint16_t bit13 : 1; + uint16_t bit14 : 1; + uint16_t bit15 : 1; + uint16_t bit16 : 1; + } IPC_OP_019AB; + + uint16_t flags = pInPacket->getValAt( 0x28 ); + memcpy( &IPC_OP_019AB, &flags, 2 ); + + uint32_t flags1 = pInPacket->getValAt( 0x24 ); + memcpy( &IPC_OP_019A, &flags1, 4 ); + + //g_log.Log(LoggingSeverity::debug, "" + boost::lexical_cast((int)IPC_OP_019AB.bit1) + // + boost::lexical_cast((int)IPC_OP_019AB.bit2) + // + boost::lexical_cast((int)IPC_OP_019AB.bit3) + // + boost::lexical_cast((int)IPC_OP_019AB.bit4) + // + boost::lexical_cast((int)IPC_OP_019AB.bit5) + // + boost::lexical_cast((int)IPC_OP_019AB.bit6) + // + boost::lexical_cast((int)IPC_OP_019AB.bit7) + // + boost::lexical_cast((int)IPC_OP_019AB.bit8) + // + boost::lexical_cast((int)IPC_OP_019AB.bit9) + // + boost::lexical_cast((int)IPC_OP_019AB.bit10) + // + boost::lexical_cast((int)IPC_OP_019AB.bit11) + // + boost::lexical_cast((int)IPC_OP_019AB.bit12) + // + boost::lexical_cast((int)IPC_OP_019AB.bit13) + // + boost::lexical_cast((int)IPC_OP_019AB.bit14) + // + boost::lexical_cast((int)IPC_OP_019AB.bit15) + // + boost::lexical_cast((int)IPC_OP_019AB.bit16) + // + " " + boost::lexical_cast((int)flags)); + + //g_log.Log(LoggingSeverity::debug, "\n" + boost::lexical_cast((int)IPC_OP_019A.specialMovement) + "\n" + // + boost::lexical_cast((int)IPC_OP_019A.strafe) + "\n" + // + boost::lexical_cast((int)IPC_OP_019A.moveBackward) + "\n" + // + boost::lexical_cast((int)IPC_OP_019A.strafeRight)); + + //g_log.Log(LoggingSeverity::debug, pInPacket->toString()); + + //pInPacket->debugPrint(); + + bool bPosChanged = false; + if( ( pPlayer->getPos().x != pInPacket->getValAt< float >( 0x2c ) ) || + ( pPlayer->getPos().y != pInPacket->getValAt< float >( 0x30 ) ) || + ( pPlayer->getPos().z != pInPacket->getValAt< float >( 0x34 ) ) ) + bPosChanged = true; + if( !bPosChanged && pPlayer->getRotation() == pInPacket->getValAt< float >( 0x20 ) ) + return; + + pPlayer->setRotation( pInPacket->getValAt< float >( 0x20 ) ); + pPlayer->setPosition( pInPacket->getValAt< float >( 0x2c ), + pInPacket->getValAt< float >( 0x30 ), + pInPacket->getValAt< float >( 0x34 ) ); + + pPlayer->setSyncFlag( PlayerSyncFlags::Position ); + + if( ( pPlayer->getCurrentAction() != nullptr ) && bPosChanged ) + pPlayer->getCurrentAction()->setInterrupted(); + + // if no one is in range, don't bother trying to send a position update + if( !pPlayer->hasInRangeActor() ) + return; + + uint8_t unk = pInPacket->getValAt< uint8_t >( 0x29 ); + + uint16_t moveType = pInPacket->getValAt< uint16_t >( 0x28 ); + + uint8_t unk1 = 0; + uint8_t unk2 = 0; + uint8_t unk3 = unk; + uint16_t unk4 = 0; + + // HACK: This part is hackish, we need to find out what all theese things really do. + switch( moveType ) + { + case MoveType::Strafe: + { + if( IPC_OP_019A.strafeRight == 1 ) + unk1 = 0xbf; + else + unk1 = 0x5f; + unk4 = 0x3C; + break; + } + + case 6: + { + unk1 = 0xFF; + unk2 = 0x06; + unk4 = 0x18; + break; + } + + // case MoveType::Land: + // { + // unk1 = 0x7F; + // //unk2 = 0x40; + // unk4 = 0x3C; + // break; + // } + + // case MoveType::Jump: + // { + // unk1 = 0x7F; + // if(unk == 0x01) + // { + // // unk2 = 0x20; + // //unk4 = 0x32; + // unk4 = 0x32; + // } + // else + // { + // // unk2 = 0xA0; + // unk4 = 0x3C; + // } + // + // break; + // } + // case MoveType::Fall: + // { + // unk1 = 0x7F; + // //unk2 = 0xA0; + // unk4 = 0x3C; + // + // break; + // } + default: + { + if( static_cast< int >( IPC_OP_019A.moveBackward ) ) + { + unk1 = 0xFF; + unk2 = 0x06; + unk4 = 0x18; // animation speed? + } + else + { + unk1 = 0x7F; + unk4 = 0x3C; // animation speed? + } + + break; + } + } + + MoveActorPacket movePacket( pPlayer, unk1, unk2, unk3, unk4 ); + pPlayer->sendToInRangeSet( movePacket ); + +} + + + +void Core::Network::GameConnection::zoneLineHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + uint32_t zoneLineId = pInPacket->getValAt< uint32_t >( 0x20 ); + + auto pZone = pPlayer->getCurrentZone(); + + auto pLine = g_zoneMgr.getZonePosition( zoneLineId ); + + Common::FFXIVARR_POSITION3 targetPos; + uint32_t targetZone; + float rotation = 0.0f; + + if( pLine != nullptr ) + { + g_log.debug( "ZoneLine " + std::to_string( zoneLineId ) + " found." ); + targetPos = pLine->getTargetPosition(); + targetZone = pLine->getTargetZoneId(); + rotation = pLine->getTargetRotation(); + + GamePacketNew< FFXIVIpcPrepareZoning > preparePacket( pPlayer->getId() ); + preparePacket.data().targetZone = targetZone; + + //ActorControlPacket143 controlPacket( pPlayer, ActorControlType::DespawnZoneScreenMsg, + // 0x03, pPlayer->getId(), 0x01, targetZone ); + pPlayer->queuePacket( preparePacket ); + } + else + { + // No zoneline found, revert to last zone + g_log.debug( "ZoneLine " + std::to_string( zoneLineId ) + " not found." ); + targetPos.x = 0; + targetPos.y = 0; + targetPos.z = 0; + targetZone = pZone->getId(); + } + + pPlayer->performZoning( targetZone, targetPos, rotation); + pPlayer->setSyncFlag( PlayerSyncFlags::Position ); + +} + + + +void Core::Network::GameConnection::discoveryHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + uint32_t ref_position_id = pInPacket->getValAt< uint32_t >( 0x20 ); + + auto pQR = g_database.query( "SELECT id, map_id, discover_id " + "FROM discoveryinfo " + "WHERE id = " + std::to_string( ref_position_id ) + ";" ); + + if( !pQR ) + { + pPlayer->sendNotice( "Discovery ref pos ID: " + std::to_string( ref_position_id ) + " not found. " ); + return; + } + + Db::Field *field = pQR->fetch(); + + GamePacketNew< FFXIVIpcDiscovery > discoveryPacket( pPlayer->getId() ); + discoveryPacket.data().map_id = field[1].getInt16(); + discoveryPacket.data().map_part_id = field[2].getInt16(); + + pPlayer->queuePacket( discoveryPacket ); + pPlayer->sendNotice( "Discovery ref pos ID: " + std::to_string( ref_position_id ) ); + + pPlayer->discover( field[1].getInt16(), field[2].getInt16() ); + +} + +void Core::Network::GameConnection::inventoryModifyHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + uint32_t seq = pInPacket->getValAt< uint32_t >( 0x20 ); + uint8_t action = pInPacket->getValAt< uint8_t >( 0x24 ); + uint8_t fromSlot = pInPacket->getValAt< uint8_t >( 0x30 ); + uint8_t toSlot = pInPacket->getValAt< uint8_t >( 0x44 ); + uint16_t fromContainer = pInPacket->getValAt< uint16_t >( 0x2C ); + uint16_t toContainer = pInPacket->getValAt< uint16_t >( 0x40 ); + + GamePacketNew< FFXIVIpcInventoryActionAck > ackPacket( pPlayer->getId() ); + ackPacket.data().sequence = seq; + ackPacket.data().type = 7; + pPlayer->queuePacket( ackPacket ); + + + g_log.debug( pInPacket->toString() ); + g_log.debug( "InventoryAction: " + std::to_string( action ) ); + + // TODO: other inventory operations need to be implemented + switch( action ) + { + + case 0x07: // discard item action + { + pPlayer->getInvetory()->discardItem( fromContainer, fromSlot ); + } + break; + + case 0x08: // move item action + { + pPlayer->getInvetory()->moveItem( fromContainer, fromSlot, toContainer, toSlot ); + } + break; + + case 0x09: // swap item action + { + pPlayer->getInvetory()->swapItem( fromContainer, fromSlot, toContainer, toSlot ); + } + break; + + case 0x0C: // merge stack action + { + + } + break; + + case 0x0A: // split stack action + { + + } + break; + + default: + + break; + } + + pPlayer->setSyncFlag( PlayerSyncFlags::Status ); + +} + + +void Core::Network::GameConnection::actionHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + uint16_t commandId = pInPacket->getValAt< uint16_t >( 0x20 ); + uint64_t param1 = pInPacket->getValAt< uint64_t >( 0x24 ); + uint32_t param11 = pInPacket->getValAt< uint32_t >( 0x24 ); + uint32_t param12 = pInPacket->getValAt< uint32_t >( 0x28 ); + uint32_t param2 = pInPacket->getValAt< uint32_t >( 0x2c ); + uint64_t param3 = pInPacket->getValAt< uint64_t >( 0x38 ); + + g_log.debug( "[" + std::to_string( m_pSession->getId() ) + "] Incoming action: " + + boost::str( boost::format( "%|04X|" ) % ( uint32_t ) ( commandId & 0xFFFF ) ) + + "\nparam1: " + boost::str( boost::format( "%|016X|" ) % ( uint64_t ) ( param1 & 0xFFFFFFFFFFFFFFF ) ) + + "\nparam2: " + boost::str( boost::format( "%|08X|" ) % ( uint32_t ) ( param2 & 0xFFFFFFFF ) ) + + "\nparam3: " + boost::str( boost::format( "%|016X|" ) % ( uint64_t ) ( param3 & 0xFFFFFFFFFFFFFFF ) ) + ); + + + //g_log.Log(LoggingSeverity::debug, "[" + std::to_string(m_pSession->getId()) + "] " + pInPacket->toString()); + + switch( commandId ) + { + case 0x01: + { + if( param11 == 1 ) + pPlayer->setStance( Entity::Actor::Stance::Active ); + else + pPlayer->setStance( Entity::Actor::Stance::Passive ); + + pPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), 0, param11, 1 ) ); + + break; + } + case 0x02: + { + if (param11 == 1) + pPlayer->setAutoattack( true ); + else + pPlayer->setAutoattack( false ); + + pPlayer->sendToInRangeSet(ActorControlPacket142(pPlayer->getId(), 1, param11, 1)); + + break; + } + case 0x03: // Change target + { + + uint64_t targetId = pInPacket->getValAt< uint64_t >( 0x24 ); + pPlayer->changeTarget( targetId ); + break; + } + + case 0x133: // Update howtos seen + { + uint32_t howToId = static_cast< uint32_t >( param1 ); + pPlayer->updateHowtosSeen( howToId ); + break; + } + case 0x1F4: // emote + { + uint64_t targetId = pPlayer->getTargetId(); + uint32_t emoteId = pInPacket->getValAt< uint32_t >( 0x24 ); + + pPlayer->sendToInRangeSet( ActorControlPacket144( pPlayer->getId(), Emote, emoteId, 0, 0, 0, targetId ) ); + break; + } + case 0xC8: // return dead + { + pPlayer->setZoningType( Common::ZoneingType::Return ); + pPlayer->teleport( pPlayer->getHomepoint(), 3 ); + break; + } + case 0xC9: // Finish zoning + { + switch( pPlayer->getZoningType() ) + { + case ZoneingType::None: + pPlayer->sendToInRangeSet( ActorControlPacket143( pPlayer->getId(), ZoneIn, 0x01 ), true ); + break; + case ZoneingType::Teleport: + pPlayer->sendToInRangeSet( ActorControlPacket143( pPlayer->getId(), ZoneIn, 0x01, 0, 0, 110 ), true ); + break; + case ZoneingType::Return: + case ZoneingType::ReturnDead: + { + if( pPlayer->getStatus() == Entity::Actor::ActorStatus::Dead ) + { + pPlayer->resetHp(); + pPlayer->resetMp(); + pPlayer->setStatus( Entity::Actor::ActorStatus::Idle ); + pPlayer->setSyncFlag( Status ); + pPlayer->sendToInRangeSet( ActorControlPacket143( pPlayer->getId(), ZoneIn, 0x01, 0x01, 0, 111 ), true ); + pPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatus, static_cast< uint8_t >( Entity::Actor::ActorStatus::Idle ) ), true ); + } + else + pPlayer->sendToInRangeSet( ActorControlPacket143( pPlayer->getId(), ZoneIn, 0x01, 0x00, 0, 111 ), true ); + } + break; + case ZoneingType::FadeIn: + break; + default: + break; + } + + pPlayer->setZoningType( Common::ZoneingType::None ); + + pPlayer->unsetStateFlag( PlayerStateFlag::BetweenAreas ); + pPlayer->unsetStateFlag( PlayerStateFlag::BetweenAreas1 ); + pPlayer->sendStateFlags(); + break; + } + + case 0xCA: // Teleport + { + // TODO: only register this action if enough gil is in possession + auto targetAetheryte = g_exdData.getAetheryteInfo( param11 ); + + if( targetAetheryte ) + { + auto fromAetheryte = g_exdData.getAetheryteInfo( g_exdData.m_zoneInfoMap[pPlayer->getZoneId()].aetheryte_index ); + + // calculate cost - does not apply for favorite points or homepoints neither checks for aether tickets + auto cost = ( sqrt( pow( fromAetheryte->map_coord_x - targetAetheryte->map_coord_x, 2 ) + + pow( fromAetheryte->map_coord_y - targetAetheryte->map_coord_y, 2 ) ) / 2 ) + 100; + + // cap at 999 gil + cost = cost > 999 ? 999 : cost; + + bool insufficientGil = pPlayer->getCurrency( Inventory::CurrencyType::Gil ) < cost; + // todo: figure out what param1 really does + pPlayer->queuePacket( ActorControlPacket143( pPlayer->getId(), TeleportStart, insufficientGil ? 2 : 0, param11 ) ); + + if( !insufficientGil ) + { + Action::ActionTeleportPtr pActionTeleport( new Action::ActionTeleport( pPlayer, param11, cost ) ); + pPlayer->setCurrentAction( pActionTeleport ); + } + } + break; + } + + } +} + + +void Core::Network::GameConnection::playTimeHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + GamePacketNew< FFXIVIpcPlayTime > playTimePacket( pPlayer->getId() ); + playTimePacket.data().playTimeInMinutes = pPlayer->getPlayTime() / 60; + pPlayer->queuePacket( playTimePacket ); +} + + +void Core::Network::GameConnection::initHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + // init handler means this is a login procedure + pPlayer->setIsLogin( true ); + + pPlayer->setZone( pPlayer->getZoneId() ); +} + + +void Core::Network::GameConnection::blackListHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + uint8_t count = pInPacket->getValAt< uint8_t >( 0x21 ); + + GamePacketNew< FFXIVIpcBlackList > blackListPacket( pPlayer->getId() ); + blackListPacket.data().sequence = count; + // TODO: Fill with actual blacklist data + //blackListPacket.data().entry[0].contentId = 1; + //sprintf( blackListPacket.data().entry[0].name, "Test Test" ); + queueOutPacket( blackListPacket ); + +} + + +void Core::Network::GameConnection::pingHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + int32_t inVal = pInPacket->getValAt< int32_t >( 0x20 ); + PingPacket pingPacket( pPlayer, inVal ); + queueOutPacket( pingPacket ); + + pPlayer->setLastPing( static_cast< uint32_t >( time( nullptr ) ) ); +} + + +void Core::Network::GameConnection::finishLoadingHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + // player is done zoning + pPlayer->setLoadingComplete( true ); + + // if this is a login event + if( pPlayer->isLogin() ) + { + // fire the onLogin Event + pPlayer->onLogin(); + pPlayer->setIsLogin( false ); + } + + // spawn the player for himself + pPlayer->spawn( pPlayer ); + + // notify the zone of a change in position to force an "inRangeActor" update + pPlayer->getCurrentZone()->changeActorPosition( pPlayer ); +} + +void Core::Network::GameConnection::socialListHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + + uint8_t type = pInPacket->getValAt< uint8_t >( 0x2A ); + uint8_t count = pInPacket->getValAt< uint8_t >( 0x2B ); + + if( type == 0x02 ) + { // party list + + GamePacketNew< FFXIVIpcSocialList > listPacket( pPlayer->getId() );; + + listPacket.data().type = 2; + listPacket.data().sequence = count; + + int entrysizes = sizeof( listPacket.data().entries ); + memset( listPacket.data().entries, 0, sizeof( listPacket.data().entries ) ); + + listPacket.data().entries[0].bytes[2] = pPlayer->getCurrentZone()->getId(); + listPacket.data().entries[0].bytes[3] = 0x80; + listPacket.data().entries[0].bytes[4] = 0x02; + listPacket.data().entries[0].bytes[6] = 0x3B; + listPacket.data().entries[0].bytes[11] = 0x10; + listPacket.data().entries[0].classJob = static_cast< uint8_t >( pPlayer->getClass() ); + listPacket.data().entries[0].contentId = pPlayer->getContentId(); + listPacket.data().entries[0].level = pPlayer->getLevel(); + listPacket.data().entries[0].zoneId = pPlayer->getCurrentZone()->getId(); + listPacket.data().entries[0].zoneId1 = 0x0100; + // TODO: no idea what this does + //listPacket.data().entries[0].one = 1; + + memcpy( listPacket.data().entries[0].name, pPlayer->getName().c_str(), strlen( pPlayer->getName().c_str() ) ); + + // TODO: actually store and read language from somewhere + listPacket.data().entries[0].bytes1[0] = 0x01;//flags (lang) + // TODO: these flags need to be figured out + //listPacket.data().entries[0].bytes1[1] = 0x00;//flags + listPacket.data().entries[0].onlineStatusMask = pPlayer->getOnlineStatusMask(); + + queueOutPacket( listPacket ); + + } + else if( type == 0x0b ) + { // friend list + + GamePacketNew< FFXIVIpcSocialList > listPacket( pPlayer->getId() ); + listPacket.data().type = 0x0B; + listPacket.data().sequence = count; + memset( listPacket.data().entries, 0, sizeof( listPacket.data().entries ) ); + + } + else if( type == 0x0e ) + { // player search result + // TODO: implement player search + /*CGamePacket * pPE = new CGamePacket(0xCC, 0x3A0, pPlayer->getId(), pPlayer->getId()); + pPE->setInt8At(0x2C, 0x0E); + pPE->setInt8At(0x2D, count); + + std::set tmpSet = m_playerSearchResult; + + std::set::iterator it; + + int i = 0x30; + for(it = tmpSet.begin(); it != tmpSet.end(); it++) + { + if((*it)->getId() == pPlayer->getId()) + { + continue; + } + pPE->setInt64At(i, (*it)->getContentId()); + pPE->setInt8At(i+0x16, 0x2); + pPE->setInt16At(i+0x0A, (*it)->getZone()->getLayoutId()); + pPE->setInt16At(i+0x0C, (*it)->getZone()->getLayoutId()); + pPE->setInt16At(i+0x0E, 0x46); + pPE->setInt16At(i+0x14, 0x100); + + pPE->setInt16At(i+0x1A, 0x8000); + pPE->setInt16At(i + 0x20, static_cast((*it)->getClass())); + pPE->setInt16At(i+0x22,(*it)->getLevel()); + pPE->setStringAt(i+0x26, (*it)->getName()); + i += 0x48; + } + + + pPlayer->queuePacket(pPE);*/ + + } + +} + +void Core::Network::GameConnection::chatHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + + std::string chatString( pInPacket->getStringAt( 0x3a ) ); + + uint32_t sourceId; + sourceId = pInPacket->getValAt< uint32_t >( 0x24 ); + + if( chatString.at( 0 ) == '@' ) + { + // execute game console command + g_gameCommandMgr.execCommand( const_cast< char * >( chatString.c_str() ) + 1, pPlayer ); + return; + } + + ChatType chatType = static_cast( pInPacket->getValAt< uint8_t >( 0x38 ) ); + + //ToDo, need to implement sending GM chat types. + ChatPacket chatPacket( pPlayer, chatType, chatString ); + + switch( chatType ) + { + case ChatType::Say: + { + pPlayer->getCurrentZone()->queueOutPacketForRange( pPlayer, 50, chatPacket ); + break; + } + case ChatType::Yell: + { + pPlayer->getCurrentZone()->queueOutPacketForRange(pPlayer, 6000, chatPacket); + break; + } + case ChatType::Shout: + { + pPlayer->getCurrentZone()->queueOutPacketForRange( pPlayer, 6000, chatPacket ); + break; + } + default: + { + pPlayer->getCurrentZone()->queueOutPacketForRange( pPlayer, 50, chatPacket ); + break; + } + } + +} + +// TODO: this handler needs to be improved for timed logout, also the session should be instantly removed +// currently we wait for the session to just time out after logout, this can be a problem is the user tries to +// log right back in. +// Also the packet needs to be converted to an ipc structure +void Core::Network::GameConnection::logoutHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + GamePacketNew< FFXIVIpcLogout > logoutPacket( pPlayer->getId() ); + logoutPacket.data().flags1 = 0x02; + logoutPacket.data().flags2 = 0x2000; + queueOutPacket( logoutPacket ); +} diff --git a/src/servers/Server_Zone/PacketHandlers2.cpp b/src/servers/Server_Zone/PacketHandlers2.cpp new file mode 100644 index 00000000..08ecf302 --- /dev/null +++ b/src/servers/Server_Zone/PacketHandlers2.cpp @@ -0,0 +1,227 @@ +#include +#include +#include +#include +#include + +#include + + +#include "GameConnection.h" + +#include "Session.h" +#include "Zone.h" +#include "ZonePosition.h" + +#include "InitUIPacket.h" +#include "PingPacket.h" +#include "MoveActorPacket.h" +#include "ChatPacket.h" +#include "ServerNoticePacket.h" +#include "ActorControlPacket142.h" +#include "ActorControlPacket143.h" +#include "ActorControlPacket144.h" +#include "EventStartPacket.h" +#include "EventFinishPacket.h" +#include "PlayerStateFlagsPacket.h" + + +#include "GameCommandHandler.h" + +#include "Player.h" +#include "Inventory.h" + +#include "Globals.h" + +#include "Forwards.h" + +#include "EventHelper.h" + +#include "Action.h" +#include "ActionTeleport.h" +#include "ActionCast.h" + + +extern Core::GameCommandHandler g_gameCommandMgr; + +using namespace Core::Common; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +void Core::Network::GameConnection::skillHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + + uint32_t action = pInPacket->getValAt< uint32_t >( 0x24 ); + uint32_t useCount = pInPacket->getValAt< uint32_t >( 0x28 ); + + uint64_t targetId = pInPacket->getValAt< uint64_t >( 0x30 ); + + + if( action < 1000000 ) // normal action + { + std::string actionIdStr = boost::str( boost::format( "%|04X|" ) % action ); + pPlayer->sendDebug( "---------------------------------------" ); + pPlayer->sendDebug( "ActionHandler ( " + actionIdStr + " | " + g_exdData.m_actionInfoMap[action].name + " )" ); + + if( action == 5 ) + { + auto currentAction = pPlayer->getCurrentAction(); + + // we should always have an action here, if not there is a bug + assert( currentAction ); + currentAction->onStart(); + } + else + { + Core::Entity::ActorPtr targetActor; + + auto inRange = pPlayer->getInRangeActors(); + for( auto actor : inRange ) + { + if( actor->getId() == targetId ) + { + targetActor = actor; + } + } + + if( targetActor ) + { + Action::ActionCastPtr pActionCast( new Action::ActionCast( pPlayer, targetActor, action ) ); + pPlayer->setCurrentAction(pActionCast); + pPlayer->sendDebug( "setCurrentAction()" ); + pPlayer->getCurrentAction()->onStart(); + } + } + } + else if( action < 2000000 ) // craft action + { + + } + else if( action < 3000000 ) // item action + { + auto info = g_exdData.getEventItemInfo( action ); + if( info ) + { + g_log.debug( info->name ); + g_scriptMgr.onEventItem( pPlayer, action, info->eventId, info->castTime, targetId ); + } + } + else if( action > 3000000 ) // unknown + { + + } + +} + +void Core::Network::GameConnection::eventHandler( Core::Network::Packets::GamePacketPtr pInPacket, + Core::Entity::PlayerPtr pPlayer ) +{ + uint16_t eventHandlerId = pInPacket->getValAt< uint16_t >( 0x12 ); + + // we need to abort the event in case it has not been scripted so the player wont be locked up + auto abortEventFunc = []( Core::Entity::PlayerPtr pPlayer, uint64_t actorId, uint32_t eventId ) + { + pPlayer->queuePacket( EventStartPacket( pPlayer->getId(), actorId, eventId, 1, 0, 0 ) ); + pPlayer->queuePacket( EventFinishPacket( pPlayer->getId(), eventId, 1, 0 ) ); + // this isn't ideal as it will also reset any other status that might be active + pPlayer->queuePacket( PlayerStateFlagsPacket( pPlayer, PlayerStateFlagList{} ) ); + }; + + std::string eventIdStr = boost::str( boost::format( "%|04X|" ) % static_cast< uint32_t >( eventHandlerId & 0xFFFF ) ); + pPlayer->sendDebug( "---------------------------------------" ); + pPlayer->sendDebug( "EventHandler ( " + eventIdStr + " )" ); + + switch( eventHandlerId ) + { + + case ClientIpcType::TalkEventHandler: // Talk event + { + uint64_t actorId = pInPacket->getValAt< uint64_t >( 0x20 ); + uint32_t eventId = pInPacket->getValAt< uint32_t >( 0x28 ); + + if( !g_scriptMgr.onTalk( pPlayer, actorId, eventId ) ) + abortEventFunc( pPlayer, actorId, eventId ); + break; + } + + case ClientIpcType::EmoteEventHandler: // Emote event + { + uint64_t actorId = pInPacket->getValAt< uint64_t >( 0x20 ); + uint32_t eventId = pInPacket->getValAt< uint32_t >( 0x28 ); + uint16_t emoteId = pInPacket->getValAt< uint16_t >( 0x2C ); + + std::string eventName = Event::getEventName( eventId ); + + if( !g_scriptMgr.onEmote( pPlayer, actorId, eventId, emoteId ) ) + abortEventFunc( pPlayer, actorId, eventId ); + break; + } + + + case ClientIpcType::WithinRangeEventHandler: + { + uint32_t eventId = pInPacket->getValAt< uint32_t >( 0x24 ); + uint32_t eventParam1 = pInPacket->getValAt< uint32_t >( 0x20 ); + float x = pInPacket->getValAt< float >( 0x28 ); + float y = pInPacket->getValAt< float >( 0x2C ); + float z = pInPacket->getValAt< float >( 0x30 ); + + std::string eventName = Event::getEventName( eventId ); + + if( !g_scriptMgr.onWithinRange( pPlayer, eventId, eventParam1, x, y, z ) ) + abortEventFunc( pPlayer, 0, eventId ); + break; + } + + case ClientIpcType::OutOfRangeEventHandler: + { + uint32_t eventId = pInPacket->getValAt< uint32_t >( 0x24 ); + uint32_t eventParam1 = pInPacket->getValAt< uint32_t >( 0x20 ); + float x = pInPacket->getValAt< float >( 0x28 ); + float y = pInPacket->getValAt< float >( 0x2C ); + float z = pInPacket->getValAt< float >( 0x30 ); + + std::string eventName = Event::getEventName( eventId ); + + if( !g_scriptMgr.onOutsideRange( pPlayer, eventId, eventParam1, x, y, z ) ) + abortEventFunc( pPlayer, 0, eventId ); + break; + } + + case ClientIpcType::EnterTeriEventHandler: + { + uint32_t eventId = pInPacket->getValAt< uint32_t >( 0x20 ); + uint16_t eventParam1 = pInPacket->getValAt< uint16_t >( 0x24 ); + uint16_t eventParam2 = pInPacket->getValAt< uint16_t >( 0x26 ); + + std::string eventName = Event::getEventName( eventId ); + + if( !g_scriptMgr.onEnterTerritory( pPlayer, eventId, eventParam1, eventParam2 ) ) + abortEventFunc( pPlayer, 0, eventId ); + break; + } + + case ClientIpcType::ReturnEventHandler: + case ClientIpcType::TradeReturnEventHandler: + { + uint32_t eventId = pInPacket->getValAt< uint32_t >( 0x20 ); + uint16_t subEvent = pInPacket->getValAt< uint16_t >( 0x24 ); + uint16_t param1 = pInPacket->getValAt< uint16_t >( 0x26 ); + uint16_t param2 = pInPacket->getValAt< uint16_t >( 0x28 ); + uint16_t param3 = pInPacket->getValAt< uint16_t >( 0x2C ); + + std::string eventName = Event::getEventName( eventId ); + + if( !g_scriptMgr.onEventHandlerReturn( pPlayer, eventId, subEvent, param1, param2, param3 ) ) + abortEventFunc( pPlayer, 0, eventId ); + break; + } + + } + +} + + + + diff --git a/src/servers/Server_Zone/PingPacket.h b/src/servers/Server_Zone/PingPacket.h new file mode 100644 index 00000000..26dbd981 --- /dev/null +++ b/src/servers/Server_Zone/PingPacket.h @@ -0,0 +1,38 @@ +#ifndef _CORE_NETWORK_PACKETS_PINGPACKET_H +#define _CORE_NETWORK_PACKETS_PINGPACKET_H + +#include + +#include "Forwards.h" + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +/** +* @brief The Ping response packet. +*/ +class PingPacket : + public GamePacketNew +{ +public: + PingPacket( Entity::PlayerPtr player, int32_t inVal ) : + GamePacketNew( player->getId(), player->getId() ) + { + initialize( player, inVal ); + }; + +private: + void initialize( Entity::PlayerPtr player, int32_t inVal ) + { + m_data.timeInMilliseconds = 0x000014D00000000 + inVal; + }; +}; + +} +} +} +} + +#endif /*_CORE_NETWORK_PACKETS_CPINGPACKET_H*/ \ No newline at end of file diff --git a/src/servers/Server_Zone/Player.cpp b/src/servers/Server_Zone/Player.cpp new file mode 100644 index 00000000..66872071 --- /dev/null +++ b/src/servers/Server_Zone/Player.cpp @@ -0,0 +1,1436 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Session.h" +#include "Player.h" +#include "BattleNpc.h" + + +#include "ZoneMgr.h" +#include "Zone.h" + +#include "ServerZone.h" + + +#include "GameConnection.h" + +#include "ActorControlPacket142.h" +#include "ActorControlPacket143.h" +#include "InitUIPacket.h" +#include "ServerNoticePacket.h" +#include "ChatPacket.h" +#include "ModelEquipPacket.h" +#include "ActorSpawnPacket.h" +#include "UpdateHpMpTpPacket.h" +#include "PlayerStateFlagsPacket.h" +#include "PlayerSpawnPacket.h" + +#include "ScriptManager.h" + +#include "StatusEffectContainer.h" + +#include "Item.h" + +#include "Inventory.h" +#include "Event.h" +#include "Action.h" +#include "EventAction.h" +#include "EventItemAction.h" +#include "ZonePosition.h" +#include + +extern Core::Logger g_log; +extern Core::Db::Database g_database; +extern Core::ServerZone g_serverZone; +extern Core::ZoneMgr g_zoneMgr; +extern Core::Data::ExdData g_exdData; +extern Core::Scripting::ScriptManager g_scriptMgr; + +using namespace Core::Common; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +// player constructor +Core::Entity::Player::Player() : + m_lastWrite( 0 ), + m_lastPing( 0 ), + m_bIsLogin( false ), + m_contentId( 0 ), + m_modelMainWeapon( 0 ), + m_modelSubWeapon( 0 ), + m_homePoint( 0 ), + m_startTown( 0 ), + m_townWarpFstFlags( 0 ), + m_playTime( 0 ), + m_bInCombat( false ), + m_bLoadingComplete( false ), + m_bMarkedForZoning( false ), + m_zoningType( Common::ZoneingType::None ), + m_bAutoattack( false ) +{ + m_id = 0; + m_type = ActorType::Player; + m_currentStance = Stance::Passive; + m_onlineStatus = 0; + m_queuedZoneing = nullptr; + m_status = ActorStatus::Idle; + + memset( m_questTracking, 0, sizeof( m_questTracking ) ); + memset( m_name, 0, sizeof( m_name ) ); + memset( m_stateFlags, 0, sizeof( m_stateFlags ) ); + memset( m_searchMessage, 0, sizeof( m_searchMessage ) ); +} + +Core::Entity::Player::~Player() +{ + +} + +// TODO: add a proper calculation based on race / job / level / gear +uint32_t Core::Entity::Player::getMaxHp() +{ + return m_baseStats.max_hp; +} + +uint32_t Core::Entity::Player::getMaxMp() +{ + return m_baseStats.max_mp; +} + +uint16_t Core::Entity::Player::getZoneId() const +{ + return m_zoneId; +} + +uint8_t Core::Entity::Player::getMode() const +{ + return m_mode; +} + +void Core::Entity::Player::setMode( uint8_t mode ) +{ + m_mode = mode; +} + +uint8_t Core::Entity::Player::getStartTown() const +{ + return m_startTown; +} + +Core::Common::OnlineStatus Core::Entity::Player::getOnlineStatus() +{ + uint64_t newMask = uint64_t( 1 ) << static_cast< uint32_t >( OnlineStatus::NewAdventurer ); + uint64_t afkMask = uint64_t( 1 ) << static_cast< uint32_t >( OnlineStatus::Afk ); + uint64_t busyMask = uint64_t( 1 ) << static_cast< uint32_t >( OnlineStatus::Busy ); + uint64_t dcMask = uint64_t( 1 ) << static_cast< uint32_t >( OnlineStatus::Disconnected ); + uint64_t meldMask = uint64_t( 1 ) << static_cast< uint32_t >( OnlineStatus::LfMeld ); + uint64_t ptMask = uint64_t( 1 ) << static_cast< uint32_t >( OnlineStatus::LfParty ); + + OnlineStatus status = OnlineStatus::Online; + + //if( hasStateFlag( Common::PlayerStateFlag::NewAdventurer ) ) + if( m_onlineStatus & newMask ) + status = OnlineStatus::NewAdventurer; + + if( m_onlineStatus & afkMask ) + status = OnlineStatus::Afk; + + if( m_onlineStatus & busyMask ) + status = OnlineStatus::Busy; + + if( m_onlineStatus & dcMask ) + status = OnlineStatus::Disconnected; + + if( m_onlineStatus & meldMask ) + status = OnlineStatus::LfMeld; + + if( m_onlineStatus & ptMask ) + status = OnlineStatus::LfParty; + + if( hasStateFlag( PlayerStateFlag::WatchingCutscene ) || hasStateFlag( PlayerStateFlag::WatchingCutscene1 ) ) + status = OnlineStatus::Cutscene; + + // TODO: add all the logic for returning the proper online status, there probably is a better way for this alltogether + return status; +} + +void Core::Entity::Player::setOnlineStatusMask( uint64_t status ) +{ + m_onlineStatus = status; +} + +uint64_t Core::Entity::Player::getOnlineStatusMask() const +{ + return m_onlineStatus; +} + +void Core::Entity::Player::prepareZoning( uint16_t targetZone, bool fadeOut ) +{ + GamePacketNew< FFXIVIpcPrepareZoning > preparePacket( getId() ); + preparePacket.data().targetZone = targetZone; + preparePacket.data().fadeOut = fadeOut == true ? 1 : 0; + queuePacket( preparePacket ); +} + +void Core::Entity::Player::calculateStats() +{ + uint8_t tribe = getLookAt( Common::CharaLook::Tribe ); + uint8_t level = getLevel(); + uint8_t job = getClass(); + + auto classInfoIt = g_exdData.m_classJobInfoMap.find( job ); + auto tribeInfoIt = g_exdData.m_tribeInfoMap.find( tribe ); + auto paramGrowthInfoIt = g_exdData.m_paramGrowthInfoMap.find( level ); + + if( tribeInfoIt == g_exdData.m_tribeInfoMap.end() || + classInfoIt == g_exdData.m_classJobInfoMap.end() || + paramGrowthInfoIt == g_exdData.m_paramGrowthInfoMap.end() ) + return; + + auto tribeInfo = tribeInfoIt->second; + auto classInfo = classInfoIt->second; + auto paramGrowthInfo = paramGrowthInfoIt->second; + + // TODO: put formula somewhere else... + float base = 0.0f; + + if( level < 51 ) + base = 0.053f * ( level * level ) + ( 1.022f * level ) - 0.907f + 20; + else + base = 1.627f * level + 120.773f; + + m_baseStats.str = base * ( static_cast< float >( classInfo.mod_str ) / 100 ) + tribeInfo.mod_str; + m_baseStats.dex = base * ( static_cast< float >( classInfo.mod_dex ) / 100 ) + tribeInfo.mod_dex; + m_baseStats.vit = base * ( static_cast< float >( classInfo.mod_vit ) / 100 ) + tribeInfo.mod_vit; + m_baseStats.inte = base * ( static_cast< float >( classInfo.mod_int ) / 100 ) + tribeInfo.mod_int; + m_baseStats.mnd = base * ( static_cast< float >( classInfo.mod_mnd ) / 100 ) + tribeInfo.mod_mnd; + m_baseStats.pie = base * ( static_cast< float >( classInfo.mod_pie ) / 100 ) + tribeInfo.mod_pie; + + m_baseStats.skillSpeed = paramGrowthInfo.base_secondary; + m_baseStats.spellSpeed = paramGrowthInfo.base_secondary; + m_baseStats.accuracy = paramGrowthInfo.base_secondary; + m_baseStats.critHitRate = paramGrowthInfo.base_secondary; + m_baseStats.attackPotMagic = paramGrowthInfo.base_secondary; + m_baseStats.healingPotMagic = paramGrowthInfo.base_secondary; + + m_baseStats.max_mp = floor( + floor( + ( ( m_baseStats.pie - base ) * ( static_cast< float >( paramGrowthInfo.piety_scalar ) / 100 ) ) + paramGrowthInfo.mp_const ) * ( static_cast< float >( classInfo.mod_mpcpgp ) / 100 ) + ); + + m_baseStats.max_hp = floor( + floor( + ( ( m_baseStats.vit - base ) * ( ( static_cast< float >( paramGrowthInfo.piety_scalar ) ) / 100 ) ) + paramGrowthInfo.hp_mod ) * ( static_cast< float >( classInfo.mod_hp * 0.9f ) / 100 ) * 15 + ); + + if( m_mp > m_baseStats.max_mp ) + m_mp = m_baseStats.max_mp; + + if( m_hp > m_baseStats.max_hp ) + m_hp = m_baseStats.max_hp; + + + m_baseStats.determination = base; + +} + + +void Core::Entity::Player::setAutoattack(bool mode) +{ + m_bAutoattack = mode; + m_lastAttack = Util::getTimeMs(); +} + +bool Core::Entity::Player::isAutoattackOn() const +{ + return m_bAutoattack; +} + +void Core::Entity::Player::sendStats() +{ + GamePacketNew< FFXIVIpcPlayerStats > statPacket( getId() ); + statPacket.data().strength = m_baseStats.str; + statPacket.data().dexterity = m_baseStats.dex; + statPacket.data().vitality = m_baseStats.vit; + statPacket.data().intelligence = m_baseStats.inte; + statPacket.data().mind = m_baseStats.mnd; + statPacket.data().piety = m_baseStats.pie; + statPacket.data().determination = m_baseStats.determination; + statPacket.data().hp = m_baseStats.max_hp; + statPacket.data().mp = m_baseStats.max_mp; + statPacket.data().accuracy = m_baseStats.accuracy; + statPacket.data().attack = m_baseStats.attack; + statPacket.data().attackMagicPotency = m_baseStats.attackPotMagic; + statPacket.data().healingMagicPotency = m_baseStats.healingPotMagic; + statPacket.data().skillSpeed = m_baseStats.skillSpeed; + statPacket.data().spellSpeed = m_baseStats.spellSpeed; + statPacket.data().spellSpeed1 = m_baseStats.spellSpeed; + statPacket.data().spellSpeedMod = 100; + + statPacket.data().criticalHitRate = m_baseStats.spellSpeed; + statPacket.data().defense = m_baseStats.spellSpeed; + statPacket.data().magicDefense = m_baseStats.spellSpeed; + statPacket.data().attack = m_baseStats.spellSpeed; + + queuePacket( statPacket ); +} + +void Core::Entity::Player::teleport( uint16_t aetheryteId, uint8_t type ) +{ + auto data = g_exdData.getAetheryteInfo( aetheryteId ); + + if( data != nullptr ) + { + + setStateFlag( PlayerStateFlag::BetweenAreas ); + sendStateFlags(); + + auto z_pos = g_zoneMgr.getZonePosition( data->levelId ); + + Common::FFXIVARR_POSITION3 pos; + pos.x = 0; + pos.y = 0; + pos.z = 0; + float rot = 0; + + if( z_pos != nullptr ) + { + pos = z_pos->getTargetPosition(); + rot = z_pos->getTargetRotation(); + } + + + sendDebug( "Teleport: " + data->placename + " " + data->placename_aethernet + + "(" + std::to_string( data->levelId ) + ")" ); + + // TODO: this should be simplified and a type created in server_common/common.h. + if( type == 1 ) // teleport + { + prepareZoning( data->target_zone, true ); + sendToInRangeSet( ActorControlPacket142( getId(), ActorDespawnEffect, 0x04 ) ); + setZoningType( Common::ZoneingType::Teleport ); + } + else if( type == 2 ) // aethernet + { + prepareZoning( data->target_zone, true ); + sendToInRangeSet( ActorControlPacket142( getId(), ActorDespawnEffect, 0x04 ) ); + setZoningType( Common::ZoneingType::Teleport ); + } + else if( type == 3 ) // return + { + prepareZoning( data->target_zone, true ); + sendToInRangeSet( ActorControlPacket142( getId(), ActorDespawnEffect, 0x03 ) ); + setZoningType( Common::ZoneingType::Return ); + } + + m_queuedZoneing = boost::make_shared( data->target_zone, pos, Util::getTimeMs(), rot ); + + } +} + +void Core::Entity::Player::forceZoneing( uint32_t zoneId ) +{ + m_queuedZoneing = boost::make_shared( zoneId, getPos(), Util::getTimeMs(), 0 ); + //performZoning( zoneId, Common::ZoneingType::None, getPos() ); +} + +void Core::Entity::Player::setZone( uint32_t zoneId ) +{ + auto pPlayer = getAsPlayer(); + + auto pZone = g_zoneMgr.getZone( zoneId ); + + + if( !pZone /*|| ( ( pZone == m_pCurrentZone ) && m_lastPing )*/ ) + { + g_log.error( "Zone " + std::to_string( zoneId ) + " not found on this server." ); + return; + } + + m_zoneId = zoneId; + + // mark character as zoning in progress + setLoadingComplete( false ); + + if( m_lastPing != 0 ) + m_pCurrentZone->removeActor( shared_from_this() ); + + m_pCurrentZone = pZone; + m_pCurrentZone->pushActor( shared_from_this() ); + + // mark the player for a position update in DB + setSyncFlag( PlayerSyncFlags::Position ); + + GamePacketNew< FFXIVIpcInit > initPacket( getId() ); + initPacket.data().charId = getId(); + queuePacket( initPacket ); + + sendInventory(); + + // set flags, will be reset automatically by zoning ( only on client side though ) + pPlayer->setStateFlag( PlayerStateFlag::BetweenAreas ); + pPlayer->setStateFlag( PlayerStateFlag::BetweenAreas1 ); + pPlayer->sendStateFlags(); + + pPlayer->sendStats(); + + // only initialize the UI if the player in fact just logged in. + if( isLogin() ) + { + Server::InitUIPacket initUIPacket( pPlayer ); + queuePacket( initUIPacket ); + + GamePacketNew< FFXIVIpcPlayerClassInfo > classInfoPacket( getId() ); + classInfoPacket.data().classId = getClass(); + classInfoPacket.data().unknown = 1; + classInfoPacket.data().level = getLevel(); + classInfoPacket.data().level1 = getLevel(); + queuePacket( classInfoPacket ); + + GamePacketNew< FFXIVGCAffiliation > gcAffPacket( getId() ); + gcAffPacket.data().gcId = m_gc; + gcAffPacket.data().gcRank[0] = m_gcRank[0]; + gcAffPacket.data().gcRank[1] = m_gcRank[1]; + gcAffPacket.data().gcRank[2] = m_gcRank[2]; + queuePacket( gcAffPacket ); + } + + GamePacketNew< FFXIVIpcInitZone > initZonePacket( getId() ); + initZonePacket.data().zoneId = getCurrentZone()->getLayoutId(); + initZonePacket.data().weatherId = static_cast< uint8_t >( getCurrentZone()->getCurrentWeather() ); + initZonePacket.data().bitmask = 0x2A; + initZonePacket.data().pos.x = getPos().x; + initZonePacket.data().pos.y = getPos().y; + initZonePacket.data().pos.z = getPos().z; + queuePacket( initZonePacket ); + + if( isLogin() ) + { + GamePacketNew< FFXIVARR_IPC_UNK322 > unk322( getId() ); + queuePacket( unk322 ); + + GamePacketNew< FFXIVARR_IPC_UNK320 > unk320( getId() ); + queuePacket( unk320 ); + } + + if( getLastPing() == 0 ) + sendQuestInfo(); + + m_bMarkedForZoning = false; +} + +uint32_t Core::Entity::Player::getPlayTime() const +{ + return m_playTime; +} + +uint8_t Core::Entity::Player::getRace() const +{ + return getLookAt( CharaLook::Race ); +} + +uint8_t Core::Entity::Player::getGender() const +{ + return getLookAt( CharaLook::Gender ); +} + +void Core::Entity::Player::initSpawnIdQueue() +{ + while( !m_freeSpawnIdQueue.empty() ) + { + m_freeSpawnIdQueue.pop(); + } + + for( int i = 1; i < MAX_DISPLAYED_ACTORS; i++ ) + { + m_freeSpawnIdQueue.push( i ); + } +} + +uint8_t Core::Entity::Player::getSpawnIdForActorId( uint32_t actorId ) +{ + if( m_freeSpawnIdQueue.empty() ) + return 0; + + uint8_t spawnId = m_freeSpawnIdQueue.front(); + m_freeSpawnIdQueue.pop(); + m_playerIdToSpawnIdMap[actorId] = spawnId; + return spawnId; +} + +void Core::Entity::Player::assignSpawnIdToPlayerId( uint32_t actorId, uint8_t spawnId ) +{ + m_playerIdToSpawnIdMap[actorId] = spawnId; +} + +void Core::Entity::Player::registerAetheryte( uint8_t aetheryteId ) +{ + + uint16_t index; + uint8_t value; + Util::valueToFlagByteIndexValue( aetheryteId, value, index ); + + m_aetheryte[index] |= value; + + setSyncFlag( Aetherytes ); + + queuePacket( ActorControlPacket143( getId(), LearnTeleport, aetheryteId, 1 ) ); + +} + +bool Core::Entity::Player::isAetheryteRegistered( uint8_t aetheryteId ) const +{ + uint16_t index; + uint8_t value; + Util::valueToFlagByteIndexValue( aetheryteId, value, index ); + + return m_aetheryte[index] & value; +} + +uint8_t * Core::Entity::Player::getDiscoveryBitmask() +{ + return m_discovery; +} + +void Core::Entity::Player::discover( int16_t map_id, int16_t sub_id ) +{ + // map.exd field 12 -> index in one of the two discovery sections, if field 15 is false, need to use 2nd section + // section 1 starts at 4 - 2 bytes each + + // section to starts at 320 - 4 bytes long + + int32_t offset = 4; + + auto info = g_exdData.m_zoneInfoMap[getCurrentZone()->getId()]; + if( info.is_two_byte ) + offset = 4 + 2 * info.discovery_index; + else + offset = 324 + 4 * info.discovery_index; + + int32_t index = offset + sub_id / 8; + uint8_t bitIndex = sub_id % 8; + + uint8_t value = 1 << bitIndex; + + m_discovery[index] |= value; + + setSyncFlag( PlayerSyncFlags::Discovery ); + + uint16_t level = getLevel(); + + uint32_t exp = ( g_exdData.m_paramGrowthInfoMap[level].needed_exp * 5 / 100 ); + + gainExp( exp ); + + + +} + +bool Core::Entity::Player::isNewAdventurer() const +{ + return m_bNewAdventurer; +} + +void Core::Entity::Player::setNewAdventurer( bool state ) +{ + if( !state ) + { + unsetStateFlag( PlayerStateFlag::NewAdventurer ); + } + else + { + setStateFlag( PlayerStateFlag::NewAdventurer ); + } + sendStateFlags(); + m_bNewAdventurer = state; + setSyncFlag( PlayerSyncFlags::NewAdventurer ); +} + +void Core::Entity::Player::resetDiscovery() +{ + memset( m_discovery, 0, sizeof( m_discovery ) ); + setSyncFlag( PlayerSyncFlags::Discovery ); +} + +void Core::Entity::Player::changePosition( float x, float y, float z, float o ) +{ + Common::FFXIVARR_POSITION3 pos; + pos.x = x; + pos.y = y; + pos.z = z; + m_queuedZoneing = boost::make_shared( getZoneId(), pos, Util::getTimeMs(), o ); +} + +void Core::Entity::Player::learnAction( uint8_t actionId ) +{ + uint16_t index; + uint8_t value; + Util::valueToFlagByteIndexValue( actionId, value, index ); + + m_unlocks[index] |= value; + + setSyncFlag( Unlocks ); + queuePacket( ActorControlPacket143( getId(), ToggleActionUnlock, actionId, 1 ) ); +} + +bool Core::Entity::Player::isActionLearned( uint8_t actionId ) const +{ + uint16_t index; + uint8_t value; + Util::valueToFlagByteIndexValue( actionId, value, index ); + + return m_unlocks[index] & value; +} + +void Core::Entity::Player::gainExp( uint32_t amount ) +{ + uint32_t currentExp = getExp(); + + uint16_t level = getLevel(); + + uint32_t neededExpToLevel = g_exdData.m_paramGrowthInfoMap[level].needed_exp; + + uint32_t neededExpToLevelplus1 = g_exdData.m_paramGrowthInfoMap[level + 1].needed_exp; + + queuePacket( ActorControlPacket143( getId(), GainExpMsg, static_cast< uint8_t >( getClass() ), amount ) ); + + if( level >= 60 ) // temporary fix for leveling over levelcap + { + queuePacket( ActorControlPacket143( getId(), UpdateUiExp, static_cast< uint8_t >( getClass() ), amount ) ); + return; + } + + if( ( currentExp + amount ) >= neededExpToLevel ) + { + // levelup + amount = ( currentExp + amount - neededExpToLevel ) > neededExpToLevelplus1 ? neededExpToLevelplus1 - 1 : ( currentExp + amount - neededExpToLevel ); + setExp( amount ); + gainLevel(); + queuePacket( ActorControlPacket143( getId(), UpdateUiExp, static_cast< uint8_t >( getClass() ), amount ) ); + + } + else + { + queuePacket( ActorControlPacket143( getId(), UpdateUiExp, static_cast< uint8_t >( getClass() ), currentExp + amount ) ); + setExp( currentExp + amount ); + } + + sendStatusUpdate(); + setSyncFlag( PlayerSyncFlags::ExpLevel ); +} + +void Core::Entity::Player::gainLevel() +{ + setLevel( getLevel() + 1 ); + + calculateStats(); + sendStats(); + sendStatusUpdate(); + + m_hp = getMaxHp(); + m_mp = getMaxMp(); + + GamePacketNew< FFXIVIpcStatusEffectList > effectListPacket( getId() ); + effectListPacket.data().classId = getClass(); + effectListPacket.data().classId1 = getClass(); + effectListPacket.data().level = getLevel(); + effectListPacket.data().current_hp = getMaxHp(); + effectListPacket.data().current_mp = getMaxMp(); + effectListPacket.data().currentTp = 1000; + effectListPacket.data().max_hp = getMaxHp(); + effectListPacket.data().max_mp = getMaxMp(); + sendToInRangeSet( effectListPacket, true ); + + sendToInRangeSet( ActorControlPacket142( getId(), LevelUpEffect, static_cast< uint8_t >( getClass() ), + getLevel(), getLevel() - 1 ), true ); + + + GamePacketNew< FFXIVIpcUpdateClassInfo > classInfoPacket( getId() ); + classInfoPacket.data().classId = getClass(); + classInfoPacket.data().classId1 = getClass(); + classInfoPacket.data().level = getLevel(); + classInfoPacket.data().nextLevelIndex = getLevel(); + classInfoPacket.data().currentExp = getExp(); + queuePacket( classInfoPacket ); + +} + +void Core::Entity::Player::unlock() +{ + queuePacket( PlayerStateFlagsPacket( getAsPlayer(), PlayerStateFlagList{} ) ); +} + +void Core::Entity::Player::sendStatusUpdate( bool toSelf ) +{ + // CGamePacket* pPE = new CGamePacket(0x140, 0x0128, getId(), getId()); + + //pPE->setInt8At(0x20, static_cast(getClass())); + + // pPE->setInt8At(0x21, getLevel()); + // pPE->setInt8At(0x22, getLevel()); + + // // current exp + // pPE->setInt32At(0x28, getExp()); + + // // rested exp + // //pPE->setInt32At(0x2C, m_hp); + + // pPE->setInt32At(0x24, m_hp); + // pPE->setInt32At(0x28, getMaxHp()); + // pPE->setInt16At(0x2C, m_mp); + // pPE->setInt16At(0x2E, getMaxMp()); + // pPE->setInt16At(0x30, m_tp); + + // sendToInRangeSet(pPE, toSelf); + + sendToInRangeSet( UpdateHpMpTpPacket( shared_from_this() ), true ); + +} + +uint8_t Core::Entity::Player::getLevel() const +{ + uint8_t classJobIndex = g_exdData.m_classJobInfoMap[static_cast< uint8_t >( getClass() )].exp_idx; + return static_cast< uint8_t >( m_classArray[classJobIndex] ); +} + +uint32_t Core::Entity::Player::getExp() const +{ + uint8_t classJobIndex = g_exdData.m_classJobInfoMap[static_cast< uint8_t >( getClass() )].exp_idx; + return m_expArray[classJobIndex]; +} + +void Core::Entity::Player::setExp( uint32_t amount ) +{ + uint8_t classJobIndex = g_exdData.m_classJobInfoMap[static_cast< uint8_t >( getClass() )].exp_idx; + m_expArray[classJobIndex] = amount; +} + +bool Core::Entity::Player::isInCombat() const +{ + return m_bInCombat; +} + +void Core::Entity::Player::setInCombat( bool mode ) +{ + //m_lastAttack = GetTickCount(); + m_bInCombat = mode; +} + +void Core::Entity::Player::setClassJob( Core::Common::ClassJob classJob ) +{ + m_class = classJob; + uint8_t level = getLevel(); + + if( getHp() > getMaxHp() ) + m_hp = getMaxHp(); + + if( getMp() > getMaxMp() ) + m_mp = getMaxMp(); + + m_tp = 0; + + GamePacketNew< FFXIVIpcPlayerClassInfo > classInfoPacket( getId() ); + classInfoPacket.data().classId = getClass(); + classInfoPacket.data().level = getLevel(); + queuePacket( classInfoPacket ); + + sendToInRangeSet( ActorControlPacket142( getId(), ClassJobChange, 0x04 ), true ); + + setSyncFlag( Status ); + sendStatusUpdate( true ); +} + +void Core::Entity::Player::setLevel( uint8_t level ) +{ + uint8_t classJobIndex = g_exdData.m_classJobInfoMap[static_cast< uint8_t >( getClass() )].exp_idx; + m_classArray[classJobIndex] = level; + + setSyncFlag( PlayerSyncFlags::ExpLevel ); +} + +uint8_t Core::Entity::Player::getUserLevel() const +{ + return m_userLevel; +} + +bool Core::Entity::Player::isFirstLogin() const +{ + return m_bFirstLogin; +} + +void Core::Entity::Player::setFirstLogin( bool mode ) +{ + m_bFirstLogin = mode; + setSyncFlag( PlayerSyncFlags::FirstLogin ); +} + +void Core::Entity::Player::eventActionStart( uint32_t eventId, + uint32_t action, + ActionCallback finishCallback, + ActionCallback interruptCallback, + uint64_t additional ) +{ + Action::ActionPtr pEventAction( new Action::EventAction( shared_from_this(), eventId, action, + finishCallback, interruptCallback, additional ) ); + + setCurrentAction( pEventAction ); + auto pEvent = getEvent( eventId ); + + if( !pEvent && getEventCount() ) + { + // We're trying to play a nested event, need to start it first. + eventStart( getId(), eventId, Event::Event::Nest, 0, 0 ); + pEvent = getEvent( eventId ); + } + else if( !pEvent ) + { + g_log.error( "Could not find event " + std::to_string( eventId ) + ", event has not been started!" ); + return; + } + + if( pEvent ) + pEvent->setPlayedScene( true ); + pEventAction->onStart(); +} + + +void Core::Entity::Player::eventItemActionStart( uint32_t eventId, + uint32_t action, + ActionCallback finishCallback, + ActionCallback interruptCallback, + uint64_t additional ) +{ + Action::ActionPtr pEventItemAction( new Action::EventItemAction( shared_from_this(), eventId, action, + finishCallback, interruptCallback, additional ) ); + + setCurrentAction( pEventItemAction ); + + pEventItemAction->onStart(); +} + +void Core::Entity::Player::sendModel() +{ + ModelEquipPacket modelEquip( getAsPlayer() ); + sendToInRangeSet( modelEquip, true ); +} + +uint32_t Core::Entity::Player::getModelForSlot( Inventory::EquipSlot slot ) +{ + return m_modelEquip[slot]; +} + +uint64_t Core::Entity::Player::getModelMainWeapon() const +{ + return m_modelMainWeapon; +} + +uint64_t Core::Entity::Player::getModelSubWeapon() const +{ + return m_modelSubWeapon; +} + +uint64_t Core::Entity::Player::getModelSystemWeapon() const +{ + return m_modelSystemWeapon; +} + +int8_t Core::Entity::Player::getAetheryteMaskAt( uint8_t index ) const +{ + if( index > 11 ) + return 0; + return m_aetheryte[index]; +} + +uint8_t Core::Entity::Player::getBirthDay() const +{ + return m_birthDay; +} + +uint8_t Core::Entity::Player::getBirthMonth() const +{ + return m_birthMonth; +} + +uint8_t Core::Entity::Player::getGuardianDeity() const +{ + return m_guardianDeity; +} + +uint8_t Core::Entity::Player::getLookAt( uint8_t index ) const +{ + return m_customize[index]; +} + +void Core::Entity::Player::setLookAt( uint8_t index, uint8_t value ) +{ + m_customize[index] = value; + setSyncFlag( PlayerSyncFlags::Look ); +} + +// spawn this player for pTarget +void Core::Entity::Player::spawn( Core::Entity::PlayerPtr pTarget ) +{ + g_log.debug( "[" + std::to_string( pTarget->getId() ) + "] Spawning " + + getName() + " for " + + pTarget->getName() ); + + PlayerSpawnPacket spawnActor( getAsPlayer(), pTarget ); + pTarget->queuePacket( spawnActor ); +} + +// despawn +void Core::Entity::Player::despawn( Core::Entity::ActorPtr pTarget ) +{ + auto pPlayer = pTarget->getAsPlayer(); + + pPlayer->freePlayerSpawnId( getId() ); + + pPlayer->queuePacket( ActorControlPacket143( getId(), DespawnZoneScreenMsg, 0x04, getId(), 0x01 ) ); +} + +void Core::Entity::Player::setLastPing( uint32_t ping ) +{ + m_lastPing = ping; +} + +uint32_t Core::Entity::Player::getLastPing() const +{ + return m_lastPing; +} + + +void Core::Entity::Player::setVoiceId( uint8_t voiceId ) +{ + m_voice = voiceId; +} + +void Core::Entity::Player::setGc( uint8_t gc ) +{ + m_gc = gc; + + GamePacketNew< FFXIVGCAffiliation > gcAffPacket( getId() ); + gcAffPacket.data().gcId = m_gc; + gcAffPacket.data().gcRank[0] = m_gcRank[0]; + gcAffPacket.data().gcRank[1] = m_gcRank[1]; + gcAffPacket.data().gcRank[2] = m_gcRank[2]; + queuePacket( gcAffPacket ); + + setSyncFlag( PlayerSyncFlags::GC ); +} + +void Core::Entity::Player::setGcRankAt( uint8_t index, uint8_t rank ) +{ + m_gcRank[index] = rank; + + GamePacketNew< FFXIVGCAffiliation > gcAffPacket( getId() ); + gcAffPacket.data().gcId = m_gc; + gcAffPacket.data().gcRank[0] = m_gcRank[0]; + gcAffPacket.data().gcRank[1] = m_gcRank[1]; + gcAffPacket.data().gcRank[2] = m_gcRank[2]; + queuePacket( gcAffPacket ); + + setSyncFlag( PlayerSyncFlags::GC ); +} + +const uint8_t * Core::Entity::Player::getStateFlags() const +{ + return m_stateFlags; +} + +bool Core::Entity::Player::hasStateFlag( Core::Common::PlayerStateFlag flag ) const +{ + int iFlag = static_cast< uint32_t >( flag ); + + uint16_t index; + uint8_t value; + Util::valueToFlagByteIndexValue( iFlag, value, index ); + + return m_stateFlags[index] & value; +} + +void Core::Entity::Player::setStateFlag( Core::Common::PlayerStateFlag flag ) +{ + int iFlag = static_cast< uint32_t >( flag ); + + uint16_t index; + uint8_t value; + Util::valueToFlagByteIndexValue( iFlag, value, index ); + + m_stateFlags[index] |= value; + +} + +void Core::Entity::Player::sendStateFlags() +{ + queuePacket( PlayerStateFlagsPacket( getAsPlayer() ) ); +} + +void Core::Entity::Player::unsetStateFlag( Core::Common::PlayerStateFlag flag ) +{ + if( !hasStateFlag( flag ) ) + return; + + int iFlag = static_cast< uint32_t >( flag ); + + uint16_t index; + uint8_t value; + Util::valueToFlagByteIndexValue( iFlag, value, index ); + + m_stateFlags[index] ^= value; + +} + +void Core::Entity::Player::update( int64_t currTime ) +{ + + // a zoning is pending, lets do it + if( m_queuedZoneing && ( currTime - m_queuedZoneing->m_queueTime ) > 800 ) + { + Common::FFXIVARR_POSITION3 targetPos = m_queuedZoneing->m_targetPosition; + if( getCurrentZone()->getId() != m_queuedZoneing->m_targetZone ) + { + performZoning( m_queuedZoneing->m_targetZone, targetPos, m_queuedZoneing->m_targetRotation); + } + else + { + GamePacketNew< FFXIVIpcActorSetPos > setActorPosPacket( getId() ); + setActorPosPacket.data().r16 = Math::Util::floatToUInt16Rot( m_queuedZoneing->m_targetRotation ); + setActorPosPacket.data().waitForLoad = 0x04; + setActorPosPacket.data().x = targetPos.x; + setActorPosPacket.data().y = targetPos.y; + setActorPosPacket.data().z = targetPos.z; + sendToInRangeSet( setActorPosPacket, true ); + setPosition( targetPos ); + } + m_queuedZoneing.reset(); + return; + } + + if( m_hp <= 0 && m_status != ActorStatus::Dead ) + { + die(); + setSyncFlag( PlayerSyncFlags::Status ); + } + + if( !isAlive() ) + return; + + m_pStatusEffectContainer->update(); + + m_lastUpdate = currTime; + + // @TODO needs to happen in a if check. Don't want autoattacking while an action is being performed. + if( !checkAction() ) + { + if( m_targetId ) + { + auto mainWeap = m_pInventory->getItemAt( Inventory::GearSet0, Inventory::EquipSlot::MainHand ); + + for( auto actor : m_inRangeActors ) + { + if( isAutoattackOn() && + actor->getId() == m_targetId && + actor->isAlive() && + mainWeap ) + { + // default autoattack range + // TODO make this dependant on bnpc size + uint32_t range = 7; + + // default autoattack range for ranged classes + if( getClass() == JOB_MACHINIST || + getClass() == JOB_BARD || + getClass() == CLASS_ARCHER ) + range = 25; + + + if( Math::Util::distance(getPos().x, getPos().y, getPos().z, + actor->getPos().x, actor->getPos().y, actor->getPos().z) <= range ) + { + + if( ( currTime - m_lastAttack ) > mainWeap->getDelay() ) + { + m_lastAttack = currTime; + autoAttack( actor ); + } + + } + } + } + } + } + + if( ( currTime - m_lastTickTime ) > 3000 ) + { + // add 3 seconds to total play time + m_playTime += 3; + setSyncFlag( PlayerSyncFlags::PlayTime ); + + m_lastTickTime = currTime; + onTick(); + } + + createUpdateSql(); + +} + +void Core::Entity::Player::onMobKill( uint16_t nameId ) +{ + g_scriptMgr.onMobKill( getAsPlayer(), nameId ); +} + +void Core::Entity::Player::freePlayerSpawnId( uint32_t actorId ) +{ + uint8_t spawnId = m_playerIdToSpawnIdMap[actorId]; + m_playerIdToSpawnIdMap.erase( actorId ); + m_freeSpawnIdQueue.push( spawnId ); + + GamePacketNew< FFXIVIpcActorFreeSpawn > freeActorSpawnPacket( getId() ); + freeActorSpawnPacket.data().actorId = actorId; + freeActorSpawnPacket.data().spawnId = spawnId; + queuePacket( freeActorSpawnPacket ); + +} + +void Core::Entity::Player::setSyncFlag( uint32_t updateFlag ) +{ + m_updateFlags |= updateFlag; +} + +uint8_t * Core::Entity::Player::getAetheryteArray() +{ + return m_aetheryte; +} + +/*! set homepoint */ +void Core::Entity::Player::setHomepoint( uint8_t aetheryteId ) +{ + m_homePoint = aetheryteId; + + queuePacket( ActorControlPacket143( getId(), SetHomepoint, aetheryteId ) ); + + setSyncFlag( HomePoint ); +} + +/*! get homepoint */ +uint8_t Core::Entity::Player::getHomepoint() const +{ + return m_homePoint; +} + +uint16_t * Core::Entity::Player::getClassArray() +{ + return m_classArray; +} + +const uint16_t * Core::Entity::Player::getClassArray() const +{ + return m_classArray; +} + +const uint8_t * Core::Entity::Player::getLookArray() const +{ + return m_customize; +} + +const uint32_t * Core::Entity::Player::getModelArray() const +{ + return m_modelEquip; +} + +uint32_t * Core::Entity::Player::getExpArray() +{ + return m_expArray; +} + +const uint32_t * Core::Entity::Player::getExpArray() const +{ + return m_expArray; +} + +uint8_t * Core::Entity::Player::getHowToArray() +{ + return m_howTo; +} + +const uint8_t * Core::Entity::Player::getHowToArray() const +{ + return m_howTo; +} + +const uint8_t * Core::Entity::Player::getUnlockBitmask() const +{ + return m_unlocks; +} + +uint64_t Core::Entity::Player::getContentId() const +{ + return m_contentId; +} + +uint8_t Core::Entity::Player::getVoiceId() const +{ + return m_voice; +} + +uint8_t Core::Entity::Player::getGc() const +{ + return m_gc; +} + +const uint8_t * Core::Entity::Player::getGcRankArray() const +{ + return m_gcRank; +} + +void Core::Entity::Player::queuePacket( Core::Network::Packets::GamePacketPtr pPacket ) +{ + auto pSession = g_serverZone.getSession( m_id ); + + if( pSession ) + { + auto pZoneCon = pSession->getZoneConnection(); + + if( pZoneCon ) + pZoneCon->queueOutPacket( pPacket ); + } +} + +bool Core::Entity::Player::isLoadingComplete() const +{ + return m_bLoadingComplete; +} + +void Core::Entity::Player::setLoadingComplete( bool bComplete ) +{ + m_bLoadingComplete = bComplete; +} + +void Core::Entity::Player::performZoning(uint16_t zoneId, const Common::FFXIVARR_POSITION3 &pos, float rotation) +{ + m_pos = pos; + m_zoneId = zoneId; + m_bMarkedForZoning = true; + setRotation( rotation ); + + // mark the player for a position update in DB + setSyncFlag( PlayerSyncFlags::Position ); + setZone( zoneId ); +} + +bool Core::Entity::Player::isMarkedForZoning() const +{ + return m_bMarkedForZoning; +} + +ZoneingType Core::Entity::Player::getZoningType() const +{ + return m_zoningType; +} + +void Core::Entity::Player::setZoningType( Common::ZoneingType zoneingType ) +{ + m_zoningType = zoneingType; +} + +void Core::Entity::Player::setSearchInfo( uint8_t selectRegion, uint8_t selectClass, const char* searchMessage ) +{ + m_searchSelectRegion = selectRegion; + m_searchSelectClass = selectClass; + memset( &m_searchMessage[0], 0, sizeof( searchMessage ) ); + strcpy( &m_searchMessage[0], searchMessage ); + + setSyncFlag( PlayerSyncFlags::SearchInfo ); +} + +const char* Core::Entity::Player::getSearchMessage() const +{ + return &m_searchMessage[0]; +} + +uint8_t Core::Entity::Player::getSearchSelectRegion() const +{ + return m_searchSelectRegion; +} + +uint8_t Core::Entity::Player::getSearchSelectClass() const +{ + return m_searchSelectClass; +} + +void Core::Entity::Player::sendNotice( const std::string& message ) //Purple Text +{ + queuePacket( ServerNoticePacket( getId(), message ) ); +} + +void Core::Entity::Player::sendUrgent( const std::string& message ) //Red Text +{ + queuePacket( ChatPacket( getAsPlayer(), ChatType::ServerUrgent, message ) ); +} + +void Core::Entity::Player::sendDebug( const std::string& message ) //Grey Text +{ + queuePacket( ChatPacket( getAsPlayer(), ChatType::ServerDebug, message ) ); +} + +void Core::Entity::Player::updateHowtosSeen( uint32_t howToId ) +{ + uint8_t index = howToId / 8; + uint8_t bitIndex = howToId % 8; + + uint8_t value = 1 << bitIndex; + + m_howTo[index] |= value; + + setSyncFlag( PlayerSyncFlags::HowTo ); +} + + +void Core::Entity::Player::onMobAggro( Core::Entity::BattleNpcPtr pBNpc ) +{ + hateListAdd( pBNpc ); + + queuePacket( ActorControlPacket142( getId(), ToggleAggro, 1 ) ); +} + +void Core::Entity::Player::onMobDeaggro( Core::Entity::BattleNpcPtr pBNpc ) +{ + hateListRemove( pBNpc ); + + if( m_actorIdTohateSlotMap.empty() ) + queuePacket( ActorControlPacket142( getId(), ToggleAggro ) ); +} + +void Core::Entity::Player::hateListAdd( Core::Entity::BattleNpcPtr pBNpc ) + +{ + if( !m_freeHateSlotQueue.empty() ) + { + uint8_t hateId = m_freeHateSlotQueue.front(); + m_freeHateSlotQueue.pop(); + m_actorIdTohateSlotMap[pBNpc->getId()] = hateId; + sendHateList(); + } +} + +void Core::Entity::Player::hateListRemove( Core::Entity::BattleNpcPtr pBNpc ) +{ + + auto it = m_actorIdTohateSlotMap.begin(); + for( ; it != m_actorIdTohateSlotMap.end(); ++it ) + { + if( it->first == pBNpc->getId() ) + { + uint8_t hateSlot = it->second; + m_freeHateSlotQueue.push( hateSlot ); + m_actorIdTohateSlotMap.erase( it ); + sendHateList(); + + return; + } + } +} + +bool Core::Entity::Player::hateListHasMob( Core::Entity::BattleNpcPtr pBNpc ) +{ + + auto it = m_actorIdTohateSlotMap.begin(); + for( ; it != m_actorIdTohateSlotMap.end(); ++it ) + { + if( it->first == pBNpc->getId() ) + return true; + } + return false; +} + +void Core::Entity::Player::initHateSlotQueue() +{ + m_freeHateSlotQueue = std::queue< uint8_t >(); + for( int i = 1; i < 26; i++ ) + m_freeHateSlotQueue.push( i ); +} + +void Core::Entity::Player::sendHateList() +{ + GamePacketNew< FFXIVIpcHateList > hateListPacket( getId() ); + hateListPacket.data().numEntries = m_actorIdTohateSlotMap.size(); + auto it = m_actorIdTohateSlotMap.begin(); + for( int i = 0; it != m_actorIdTohateSlotMap.end(); ++it, i++ ) + { + hateListPacket.data().entry[i].actorId = it->first; + hateListPacket.data().entry[i].hatePercent = 100; + } + queuePacket( hateListPacket ); +} + +bool Core::Entity::Player::isLogin() const +{ + return m_bIsLogin; +} + +void Core::Entity::Player::setIsLogin( bool bIsLogin ) +{ + m_bIsLogin = bIsLogin; +} + +void Core::Entity::Player::autoAttack( ActorPtr pTarget ) +{ + + pTarget->onActionHostile( shared_from_this() ); + //uint64_t tick = Util::getTimeMs(); + + //srand(static_cast< uint32_t >(tick)); + uint32_t damage = 10 + rand() % 12; + uint32_t variation = 0 + rand() % 3; + + if( getClass() == 5 || getClass() == 23 || getClass() == 31 ) + { + GamePacketNew< FFXIVIpcEffect > effectPacket(getId()); + effectPacket.data().targetId = pTarget->getId(); + effectPacket.data().actionAnimationId = 8; + // effectPacket.data().unknown_2 = variation; + effectPacket.data().numEffects = 1; + effectPacket.data().unknown_61 = 1; + effectPacket.data().unknown_62 = 1; + effectPacket.data().actionTextId = 8; + effectPacket.data().rotation = Math::Util::floatToUInt16Rot(getRotation()); + effectPacket.data().effectTargetId = pTarget->getId(); + effectPacket.data().effectTarget = pTarget->getId(); + effectPacket.data().effects[0].param1 = damage; + effectPacket.data().effects[0].unknown_1 = 3; + effectPacket.data().effects[0].unknown_2 = 1; + effectPacket.data().effects[0].unknown_3 = 7; + + sendToInRangeSet(effectPacket, true); + } + else + { + + GamePacketNew< FFXIVIpcEffect > effectPacket(getId()); + effectPacket.data().targetId = pTarget->getId(); + effectPacket.data().actionAnimationId = 7; + // effectPacket.data().unknown_2 = variation; + effectPacket.data().numEffects = 1; + effectPacket.data().unknown_61 = 1; + effectPacket.data().unknown_62 = 1; + effectPacket.data().actionTextId = 7; + effectPacket.data().rotation = Math::Util::floatToUInt16Rot(getRotation()); + effectPacket.data().effectTarget = pTarget->getId(); + effectPacket.data().effects[0].param1 = damage; + effectPacket.data().effects[0].unknown_1 = 3; + effectPacket.data().effects[0].unknown_2 = 2; + effectPacket.data().effects[0].unknown_3 = 71; + + sendToInRangeSet(effectPacket, true); + } + + pTarget->takeDamage(damage); + +} diff --git a/src/servers/Server_Zone/Player.h b/src/servers/Server_Zone/Player.h new file mode 100644 index 00000000..4f2ae69d --- /dev/null +++ b/src/servers/Server_Zone/Player.h @@ -0,0 +1,591 @@ +#ifndef _PLAYER_H +#define _PLAYER_H + +#include "Forwards.h" + +#include + +#include "Actor.h" +#include "Inventory.h" +#include +#include + +namespace Core { + +namespace Entity { + +struct QueuedZoning +{ + uint16_t m_targetZone; + Common::FFXIVARR_POSITION3 m_targetPosition; + float m_targetRotation; + uint64_t m_queueTime; + + QueuedZoning( uint16_t targetZone, const Common::FFXIVARR_POSITION3& targetPosition, uint64_t queuedTime, float targetRotation ) + : m_targetZone( targetZone ) + , m_targetPosition( targetPosition ) + , m_queueTime( queuedTime ) + , m_targetRotation( targetRotation ) {} +}; + +/** Class representing the Player +* Inheriting from Actor +* +*/ +class Player : public Actor +{ +public: + /*! Contructor */ + Player(); + + /*! Destructor */ + ~Player(); + + void autoAttack( ActorPtr pTarget ) override; + + // EventHandlers + ////////////////////////////////////////////////////////////////////////////////////////////////////// + /*! start an event action */ + void eventActionStart( uint32_t eventId, uint32_t action, ActionCallback finishCallback, ActionCallback interruptCallback, uint64_t additional ); + /*! start an event item action */ + void eventItemActionStart( uint32_t eventId, uint32_t action, ActionCallback finishCallback, ActionCallback interruptCallback, uint64_t additional ); + /*! start/register a normal event */ + void eventStart( uint64_t actorId, uint32_t eventId, uint8_t eventParam, uint8_t eventParam1, uint32_t eventParam2 ); + /*! play a subevent */ + void eventPlay( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam2, uint32_t eventParam3 ); + /*! play a subevent */ + void eventPlay( uint32_t eventId, uint32_t scene, uint32_t flags, + uint32_t eventParam2, uint32_t eventParam3, Scripting::EventReturnCallback eventReturnCallback ); + /*! play a subevent */ + void eventPlay( uint32_t eventId, uint32_t scene, uint32_t flags, + uint32_t eventParam2, uint32_t eventParam3, uint32_t eventParam4, Scripting::EventReturnCallback eventReturnCallback ); + /*! play a subevent */ + void eventPlay( uint32_t eventId, uint32_t scene, uint32_t flags, Scripting::EventReturnCallback eventReturnCallback ); + /*! play a subevent */ + void eventPlay( uint32_t eventId, uint32_t scene, uint32_t flags ); + /*! finish / unregister an event */ + void eventFinish( uint32_t eventId, uint32_t freePlayer ); + /*! add an event to the event array */ + void addEvent( Event::EventPtr pEvent ); + /*! retrieve an event from the event array */ + Event::EventPtr getEvent( uint32_t eventId ); + /*! get number of active events */ + size_t getEventCount(); + /*! remove an event from the event array */ + void removeEvent( uint32_t eventId ); + /*! return the eventlist */ + std::map< uint32_t, Event::EventPtr >& eventList(); + + void checkEvent( uint32_t eventId ); + + + + // Events + ////////////////////////////////////////////////////////////////////////////////////////////////////// + /*! Event to be called when zoning process gets triggered */ + void onZoneStart(); + /*! Event to be called when zoning process is finished */ + void onZoneDone(); + /*! Event to be called on login */ + void onLogin(); + /*! Event to be called on update tick */ + void onTick() override; + /*! Event to be called upon player death */ + void onDeath() override; + /*! Event called on every session iteration */ + void update( int64_t currTime ) override; + /*! Event to be called upon Bnpc kill */ + void onMobKill( uint16_t nameId ); + + + // Quest + ////////////////////////////////////////////////////////////////////////////////////////////////////// + /*! load data for currently active quests */ + bool loadActiveQuests(); + /*! update quest ( register it as active quest if new ) */ + void updateQuest( uint16_t questId, uint16_t sequence ); + /*! return true if quest is currently active */ + bool hasQuest( uint16_t questId ); + /*! return the current quest sequence */ + uint8_t getQuestSeq( uint16_t questId ); + /*! send the quest tracker packet */ + void sendQuestTracker(); + /*! set quest tracker flag for a specified slot */ + void setQuestTracker( uint16_t index, int16_t flag ); + /*! return the index of a given quest in the players quest list */ + int16_t getQuestIndex( uint16_t questId ); + /*! finish a given quest */ + void finishQuest( uint16_t questId ); + /*! finish a given quest */ + void unfinishQuest( uint16_t questId ); + /*! remove a given quest */ + void removeQuest( uint16_t questId ); + /*! add a quest to the completed quests mask */ + void updateQuestsCompleted( uint32_t questId ); + /*! remove a quest from the completed quest mask */ + void removeQuestsCompleted( uint32_t questId ); + + bool giveQuestRewards( uint32_t questId, uint32_t optionalChoice ); + + boost::shared_ptr< Common::QuestActive > getQuestActive( uint16_t index ); + + uint8_t getQuestUI8A( uint16_t questId ); + uint8_t getQuestUI8B( uint16_t questId ); + uint8_t getQuestUI8C( uint16_t questId ); + uint8_t getQuestUI8D( uint16_t questId ); + uint8_t getQuestUI8E( uint16_t questId ); + uint8_t getQuestUI8F( uint16_t questId ); + uint8_t getQuestUI8AH( uint16_t questId ); + uint8_t getQuestUI8BH( uint16_t questId ); + uint8_t getQuestUI8CH( uint16_t questId ); + uint8_t getQuestUI8DH( uint16_t questId ); + uint8_t getQuestUI8EH( uint16_t questId ); + uint8_t getQuestUI8FH( uint16_t questId ); + uint8_t getQuestUI8AL( uint16_t questId ); + uint8_t getQuestUI8BL( uint16_t questId ); + uint8_t getQuestUI8CL( uint16_t questId ); + uint8_t getQuestUI8DL( uint16_t questId ); + uint8_t getQuestUI8EL( uint16_t questId ); + uint8_t getQuestUI8FL( uint16_t questId ); + uint16_t getQuestUI16A( uint16_t questId ); + uint16_t getQuestUI16B( uint16_t questId ); + uint16_t getQuestUI16C( uint16_t questId ); + uint32_t getQuestUI32A( uint16_t questId ); + + uint8_t getQuestBitFlag8( uint16_t questId ); + uint8_t getQuestBitFlag16( uint16_t questId ); + uint8_t getQuestBitFlag24( uint16_t questId ); + uint8_t getQuestBitFlag32( uint16_t questId ); + uint8_t getQuestBitFlag40( uint16_t questId ); + uint8_t getQuestBitFlag48( uint16_t questId ); + + + void setQuestUI8A( uint16_t questId, uint8_t val ); + void setQuestUI8B( uint16_t questId, uint8_t val ); + void setQuestUI8C( uint16_t questId, uint8_t val ); + void setQuestUI8D( uint16_t questId, uint8_t val ); + void setQuestUI8E( uint16_t questId, uint8_t val ); + void setQuestUI8F( uint16_t questId, uint8_t val ); + void setQuestUI8AH( uint16_t questId, uint8_t val ); + void setQuestUI8BH( uint16_t questId, uint8_t val ); + void setQuestUI8CH( uint16_t questId, uint8_t val ); + void setQuestUI8DH( uint16_t questId, uint8_t val ); + void setQuestUI8EH( uint16_t questId, uint8_t val ); + void setQuestUI8FH( uint16_t questId, uint8_t val ); + void setQuestUI8AL( uint16_t questId, uint8_t val ); + void setQuestUI8BL( uint16_t questId, uint8_t val ); + void setQuestUI8CL( uint16_t questId, uint8_t val ); + void setQuestUI8DL( uint16_t questId, uint8_t val ); + void setQuestUI8EL( uint16_t questId, uint8_t val ); + void setQuestUI8FL( uint16_t questId, uint8_t val ); + void setQuestUI16A( uint16_t questId, uint16_t val ); + void setQuestUI16B( uint16_t questId, uint16_t val ); + void setQuestUI16C( uint16_t questId, uint16_t val ); + void setQuestUI32A( uint16_t questId, uint32_t val ); + + void setQuestBitFlag8( uint16_t questId, uint8_t val ); + void setQuestBitFlag16( uint16_t questId, uint8_t val ); + void setQuestBitFlag24( uint16_t questId, uint8_t val ); + void setQuestBitFlag32( uint16_t questId, uint8_t val ); + void setQuestBitFlag40( uint16_t questId, uint8_t val ); + void setQuestBitFlag48( uint16_t questId, uint8_t val ); + + // Inventory / Item / Currency + ////////////////////////////////////////////////////////////////////////////////////////////////////// + /*! add an item to the first free slot in one of the 4 main containers */ + bool tryAddItem( uint16_t catalogId, uint16_t quantity ); + /*! add an item to a given container */ + bool addItem( uint16_t containerId, uint16_t catalogId, uint16_t quantity ); + /*! equip an item to a specified slot */ + void equipItem( Inventory::EquipSlot equipSlotId, ItemPtr pItem, bool sendModel ); + /*! remove an item from an equipment slot */ + void unequipItem( Inventory::EquipSlot equipSlotId, ItemPtr pItem ); + /*! equip a weapon, possibly forcing a job change */ + void equipWeapon( ItemPtr pItem ); + /*! get a const pointer to the inventory object */ + InventoryPtr getInvetory() const; + /*! get the current main hand model */ + uint64_t getModelMainWeapon() const; + /*! get the current off hand model */ + uint64_t getModelSubWeapon() const; + /*! get the current system hand model */ + uint64_t getModelSystemWeapon() const; + /*! return a const pointer to the model array */ + const uint32_t * getModelArray() const; + /*! return the equipment model in a specified equipment slot */ + uint32_t getModelForSlot( Inventory::EquipSlot slot ); + /*! return the current amount of currency of type */ + uint32_t getCurrency( uint8_t type ) const; + /*! add amount to the currency of type */ + void addCurrency( uint8_t type, uint32_t amount ); + /*! remove amount from the currency of type */ + void removeCurrency( uint8_t type, uint32_t amount ); + /*! return the current amount of crystals of type */ + uint32_t getCrystal( uint8_t type ) const; + /*! add amount to the crystals of type */ + void addCrystal( uint8_t type, uint32_t amount ); + /*! remove amount from the crystals of type */ + void removeCrystal( uint8_t type, uint32_t amount ); + + // Class / Job / Exp + ////////////////////////////////////////////////////////////////////////////////////////////////////// + /*! returns the level of the currently active class / job */ + uint8_t getLevel() const override; + /*! returns the exp of the currently active class / job */ + uint32_t getExp() const; + /*! sets the exp of the currently active class / job */ + void setExp( uint32_t amount ); + /*! adds exp to the currently active class / job */ + void gainExp( uint32_t amount ); + /*! gain a level on the currently active class / job */ + void gainLevel(); + /*! set level on the currently active class / job to given level */ + void setLevel( uint8_t level ); + /*! change class or job to given class / job */ + void setClassJob( Core::Common::ClassJob classJob ); + /*! returns a pointer to the class array */ + uint16_t * getClassArray(); + /*! returns a const pointer to the class array */ + const uint16_t * getClassArray() const; + /*! returns a pointer to the exp array */ + uint32_t * getExpArray(); + /*! returns a const pointer to the exp array */ + const uint32_t * getExpArray() const; + + // Base Look / Stats / Params + ////////////////////////////////////////////////////////////////////////////////////////////////////// + /*! return the birth day */ + uint8_t getBirthDay() const; + /*! return the birth month */ + uint8_t getBirthMonth() const; + /*! return the guardian diety Id */ + uint8_t getGuardianDeity() const; + /*! get look at specified index */ + uint8_t getLookAt( uint8_t index ) const; + /*! return the race */ + uint8_t getRace() const; + /*! return gender 0 male, 1 female */ + uint8_t getGender() const; + /*! return the id of the home town */ + uint8_t getStartTown() const; + /*! return the voice id */ + uint8_t getVoiceId() const; + /*! return the grand company */ + uint8_t getGc() const; + /*! return the grand company rank */ + const uint8_t * getGcRankArray() const; + /*! set look at index */ + void setLookAt( uint8_t index, uint8_t value ); + /*! set the voice Id */ + void setVoiceId( uint8_t voiceId ); + /*! set the grand company */ + void setGc( uint8_t gc ); + /*! set the grand company rank */ + void setGcRankAt( uint8_t index, uint8_t rank ); + /*! return a const pointer to the look array */ + const uint8_t * getLookArray() const; + /*! return true if the player is loggin in for the first time */ + bool isFirstLogin() const; + /*! set first log in state */ + void setFirstLogin( bool mode ); + /*! returns true if the player is currently in combat */ + bool isInCombat() const; + /*! sets players combat state */ + void setInCombat( bool mode ); + /*! return current online status depending on current state / activity */ + Common::OnlineStatus getOnlineStatus(); + /*! sets the players zone, initiating a zoning process */ + void setZone( uint32_t zoneId ); + + void forceZoneing( uint32_t zoneId ); + /*! change position, sends update too */ + void changePosition( float x, float y, float z, float o ); + /*! return the contentId */ + uint64_t getContentId() const; + /*! return max hp */ + uint32_t getMaxHp(); + /*! return max mp */ + uint32_t getMaxMp(); + /*! return a players total play time */ + uint32_t getPlayTime() const; + /*! return true if the player has "new adventurere" status */ + bool isNewAdventurer() const; + /*! change the players "new adventurere" status */ + void setNewAdventurer( bool state ); + /*! sets the list of current online status */ + void setOnlineStatusMask( uint64_t status ); + /*! returns the current online status */ + uint64_t getOnlineStatusMask() const; + /*! perform a teleport of a specified type ( teleport,return,aethernet ) */ + void teleport( uint16_t aetheryteId, uint8_t type = 1 ); + /*! prepares zoning / fades out the screen */ + void prepareZoning( uint16_t targetZone, bool fadeOut ); + + void calculateStats() override; + void sendStats(); + + + // Aetheryte / Action / Attribute bitmasks + ////////////////////////////////////////////////////////////////////////////////////////////////////// + /*! register aetheryte aetheryteId and send update */ + void registerAetheryte( uint8_t aetheryteId ); + /*! check if aetheryte is already registered */ + bool isAetheryteRegistered( uint8_t aetheryteId ) const; + /*! return a const pointer to the aetheryte unlock bitmask array */ + int8_t getAetheryteMaskAt( uint8_t index ) const; + /*! return a pointer to the aetheryte unlock bitmask array */ + uint8_t * getAetheryteArray(); + /*! set homepoint */ + void setHomepoint( uint8_t aetheryteId ); + /*! get homepoint */ + uint8_t getHomepoint() const; + /*! discover subarea subid fo map map_id, also send udpate packet */ + void discover( int16_t map_id, int16_t sub_id ); + /*! return a pointer to the discovery bitmask array */ + uint8_t * getDiscoveryBitmask(); + /*! helper/debug function to reset all discovered areas */ + void resetDiscovery(); + /*! get a pointer to the howto bitmask array */ + uint8_t * getHowToArray(); + /*! get a const pointer to the howto bitmask array */ + const uint8_t * getHowToArray() const; + /*! update bitmask for how-to's seen */ + void updateHowtosSeen( uint32_t howToId ); + /*! learn an action / update the unlock bitmask. */ + void learnAction( uint8_t actionId ); + /*! check if an action is already unlocked in the bitmask. */ + bool isActionLearned( uint8_t actionId ) const; + /*! return a const pointer to the unlock bitmask array */ + const uint8_t * getUnlockBitmask() const; + + + // Spawn handling + ////////////////////////////////////////////////////////////////////////////////////////////////////// + /*! initialize the spawnId queue */ + void initSpawnIdQueue(); + /*! get the spawn id mapped to a specific actorId */ + uint8_t getSpawnIdForActorId( uint32_t actorId ); + /*! assigns the given spawnId to the actor */ + void assignSpawnIdToPlayerId( uint32_t actorId, uint8_t spawnId ); + /*! frees the spawnId assigned to the given actor */ + void freePlayerSpawnId( uint32_t actorId ); + /*! send spawn packets to pTarget */ + void spawn( PlayerPtr pTarget ) override; + /*! send despawn packets to pTarget */ + void despawn( ActorPtr pTarget ) override; + + // Player State Handling + ////////////////////////////////////////////////////////////////////////////////////////////////////// + /* return a const pointer to the state flag array */ + const uint8_t* getStateFlags() const; + /* set a specified state flag */ + void setStateFlag( Common::PlayerStateFlag flag ); + /* check if a specified flag is set */ + bool hasStateFlag( Common::PlayerStateFlag flag ) const; + /* reset a specified flag */ + void unsetStateFlag( Common::PlayerStateFlag flag ); + /* helper function, send an empty state flag update */ + void unlock(); + + // Player Session Handling + ////////////////////////////////////////////////////////////////////////////////////////////////////// + /*! return the userlevel */ + uint8_t getUserLevel() const; + /*! set timestamp for last received ping */ + void setLastPing( uint32_t ping ); + /*! get timestamp of last received ping */ + uint32_t getLastPing() const; + + // Player Database Handling + ////////////////////////////////////////////////////////////////////////////////////////////////////// + /*! generate the update sql based on update flags */ + void createUpdateSql(); + /*! set an update flag */ + void setSyncFlag( uint32_t updateFlag ); + /*! load player from db, by id */ + bool load( uint32_t charId, SessionPtr pSession ); + /*! load active class data */ + bool loadClassData(); + /*! load search info */ + bool loadSearchInfo(); + + // Player Network Handling + ////////////////////////////////////////////////////////////////////////////////////////////////////// + /*! send current models ( equipment ) */ + void sendModel(); + /*! send active state flags */ + void sendStateFlags(); + /*! send status update */ + void sendStatusUpdate( bool toSelf = true ) override; + /*! send the entire inventory sequence */ + void sendInventory() const; + /*! send active quest list */ + void sendQuestInfo(); + /*! send a quest specific message */ + void sendQuestMessage( uint32_t questId, int8_t msgId, uint8_t type, uint32_t var1, uint32_t var2 ); + /*! queue a packet for the player */ + void queuePacket( Network::Packets::GamePacketPtr pPacket ); + /*! returns true if loading is complete ( 0x69 has been received ) */ + bool isLoadingComplete() const; + /*! set the loading complete bool */ + void setLoadingComplete( bool bComplete ); + /*! mark this player for zoning, notify worldserver */ + void performZoning(uint16_t zoneId, const Common::FFXIVARR_POSITION3& pos, float rotation); + /*! return true if the player is marked for zoning */ + bool isMarkedForZoning() const; + + Common::ZoneingType getZoningType() const; + void setZoningType( Common::ZoneingType zoneingType ); + + void setSearchInfo( uint8_t selectRegion, uint8_t selectClass, const char* searchMessage ); + const char* getSearchMessage() const; + uint8_t getSearchSelectRegion() const; + uint8_t getSearchSelectClass() const; + + void sendNotice( const std::string& message ); + void sendUrgent( const std::string& message ); + void sendDebug( const std::string& message ); + + void onMobAggro( BattleNpcPtr pBNpc ); + void onMobDeaggro( BattleNpcPtr pBNpc ); + + void initHateSlotQueue(); + void hateListAdd( BattleNpcPtr pBNpc ); + void hateListRemove( BattleNpcPtr pBNpc ); + + bool hateListHasMob( BattleNpcPtr pBNpc ); + + void sendHateList(); + + bool isLogin() const; + void setIsLogin( bool bIsLogin ); + + uint16_t getZoneId() const; + + uint8_t getMode() const; + void setMode( uint8_t mode ); + + void setAutoattack( bool mode ); + bool isAutoattackOn() const; + +private: + uint32_t m_lastWrite; + uint32_t m_lastPing; + + bool m_bIsLogin; + + // ==== CHARABASE + uint64_t m_contentId; // This id will be the name of the folder for character settings in "My Games" + + uint8_t m_mode; + +private: + uint8_t m_mount; + uint8_t m_ignore; + uint8_t m_invincibleGM; + uint8_t m_voice; + + uint64_t m_modelMainWeapon; + uint64_t m_modelSubWeapon; + uint64_t m_modelSystemWeapon; + + uint32_t m_modelEquip[10]; + + uint8_t m_emoteModeType; + + // timestamp of first login + uint32_t m_firstLogin; + + // id of initial language + uint32_t m_language; + + bool m_bNewGame; + + uint32_t m_primaryTerritoryType; + uint32_t m_primaryTerritoryId; + uint32_t m_primaryLayoutId; + uint32_t m_primaryExclusiveId; + uint32_t m_primaryMoveType; + uint32_t m_primaryContentId; + + uint32_t m_secondaryTerritoryType; + uint32_t m_secondaryTerritoryId; + Common::FFXIVARR_POSITION3 m_secondaryPos; + float m_secondaryRot; + uint32_t m_secondaryLayoutId; + // !! END CHARABASE + + // ==== CHARADETAIL + uint8_t m_guardianDeity; + uint8_t m_birthDay; + uint8_t m_birthMonth; + + struct RetainerInfo + { + uint32_t retainerId; + char retainerName[32]; + uint32_t createUnixTime; + bool isActive; + bool isRename; + uint8_t status; + } m_retainerInfo[8]; + + uint8_t m_titleList[32]; + uint8_t m_achievement[16]; + uint8_t m_howTo[33]; + uint8_t m_homePoint; + uint8_t m_startTown; + uint8_t m_favoritePoint[3]; + uint16_t m_townWarpFstFlags; + uint8_t m_questCompleteFlags[200]; + uint8_t m_chocoboTaxiStandFlags[8]; + uint8_t m_discovery[420]; + uint32_t m_playTime; + + uint16_t m_classArray[25]; + uint32_t m_expArray[25]; + uint8_t m_aetheryte[16]; + uint8_t m_unlocks[64]; + + InventoryPtr m_pInventory; + std::map< uint32_t, Event::EventPtr > m_eventMap; + std::map< uint32_t, uint8_t > m_playerIdToSpawnIdMap; // maps player to spawn id + std::queue< uint8_t > m_freeSpawnIdQueue; // queue with spawn ids free to be assigned + std::queue< uint8_t > m_freeHateSlotQueue; // queue with "hate slots" free to be assigned + std::map< uint32_t, uint8_t > m_actorIdTohateSlotMap; + std::map< uint32_t, uint16_t > m_questIdToQuestIdx; // quest mapping, quest id to quest container index + std::map< uint16_t, uint32_t > m_questIdxToQuestId; // quest mapping, quest container index to questId + std::queue< uint8_t > m_freeQuestIdxQueue; // queue with quest indices free to be assigned + boost::shared_ptr< Common::QuestActive > m_activeQuests[30]; + int16_t m_questTracking[5]; + uint8_t m_stateFlags[7]; + uint8_t m_userLevel; + uint16_t zoneId; + bool m_bFirstLogin; + bool m_bInCombat; + bool m_bLoadingComplete; + bool m_bAutoattack; + + Common::ZoneingType m_zoningType; + + bool m_bMarkedForZoning; + uint32_t m_updateFlags; + bool m_bNewAdventurer; + uint64_t m_onlineStatus; + boost::shared_ptr< QueuedZoning > m_queuedZoneing; + + // search info + char m_searchMessage[193]; // searchmessage to show in profile + uint8_t m_searchSelectRegion; // regions selected to show up in profile + uint8_t m_searchSelectClass; // class selected to show up in profile + + // gc info + uint8_t m_gc; + uint8_t m_gcRank[3]; + +}; + +} +} + +#endif diff --git a/src/servers/Server_Zone/PlayerEvent.cpp b/src/servers/Server_Zone/PlayerEvent.cpp new file mode 100644 index 00000000..958cbc7e --- /dev/null +++ b/src/servers/Server_Zone/PlayerEvent.cpp @@ -0,0 +1,312 @@ +#include +#include +#include +#include + +#include "Player.h" + +#include "Zone.h" + +#include "Forwards.h" + +#include "GameConnection.h" +#include "ActorControlPacket142.h" +#include "InitUIPacket.h" +#include "ServerNoticePacket.h" +#include "EventStartPacket.h" +#include "EventPlayPacket.h" +#include "EventFinishPacket.h" + +#include "Event.h" + +extern Core::Logger g_log; + +using namespace Core::Common; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +void Core::Entity::Player::addEvent( Event::EventPtr pEvent ) +{ + m_eventMap[pEvent->getId()] = pEvent; +} + +std::map< uint32_t, Core::Event::EventPtr >& Core::Entity::Player::eventList() +{ + return m_eventMap; +} + +Core::Event::EventPtr Core::Entity::Player::getEvent( uint32_t eventId ) +{ + auto it = m_eventMap.find( eventId ); + if( it != m_eventMap.end() ) + return it->second; + + return Event::EventPtr( nullptr ); +} + +size_t Core::Entity::Player::getEventCount() +{ + return m_eventMap.size(); +} + +void Core::Entity::Player::removeEvent( uint32_t eventId ) +{ + auto it = m_eventMap.find( eventId ); + if( it != m_eventMap.end() ) + { + auto tmpEvent = it->second; + m_eventMap.erase( it ); + } +} + +void Core::Entity::Player::checkEvent( uint32_t eventId ) +{ + auto pEvent = getEvent( eventId ); + if( pEvent ) + if( !pEvent->hasPlayedScene() ) + eventFinish( eventId, 1 ); +} + + +void Core::Entity::Player::eventStart( uint64_t actorId, uint32_t eventId, + uint8_t eventType, uint8_t eventParam1, + uint32_t eventParam2 ) +{ + Event::EventPtr newEvent( new Event::Event( actorId, eventId, eventType, eventParam1, eventParam2 ) ); + addEvent( newEvent ); + + setStateFlag( PlayerStateFlag::Occupied2 ); + sendStateFlags(); + + EventStartPacket eventStart( getId(), actorId, eventId, eventType, eventParam1, eventParam2 ); + + queuePacket( eventStart ); + +} + +void Core::Entity::Player::eventPlay( uint32_t eventId, uint32_t scene, + uint32_t flags, uint32_t eventParam2, + uint32_t eventParam3 ) +{ + eventPlay( eventId, scene, flags, eventParam2, eventParam3, nullptr ); +} + +void Core::Entity::Player::eventPlay( uint32_t eventId, uint32_t scene, + uint32_t flags, Scripting::EventReturnCallback eventCallback ) +{ + eventPlay( eventId, scene, flags, 0, 0, eventCallback ); +} + +void Core::Entity::Player::eventPlay( uint32_t eventId, uint32_t scene, uint32_t flags ) +{ + eventPlay( eventId, scene, flags, 0, 0, nullptr ); +} + +void Core::Entity::Player::eventPlay( uint32_t eventId, uint32_t scene, + uint32_t flags, uint32_t eventParam2, + uint32_t eventParam3, Scripting::EventReturnCallback eventCallback ) +{ + if( flags & 0x02 ) + { + setStateFlag( PlayerStateFlag::WatchingCutscene ); + sendToInRangeSet( ActorControlPacket142( getId(), SetStatusIcon, + static_cast< uint8_t >( getOnlineStatus() ) ), true ); + } + + auto pEvent = getEvent( eventId ); + if( !pEvent && getEventCount() ) + { + // We're trying to play a nested event, need to start it first. + eventStart( getId(), eventId, Event::Event::Nest, 0, 0 ); + pEvent = getEvent( eventId ); + } + else if( !pEvent ) + { + g_log.error( "Could not find event " + std::to_string( eventId ) + ", event has not been started!" ); + return; + } + + pEvent->setPlayedScene( true ); + pEvent->setEventReturnCallback( eventCallback ); + EventPlayPacket eventPlay( getId(), pEvent->getActorId(), pEvent->getId(), + scene, flags, eventParam2, eventParam3 ); + + queuePacket( eventPlay ); +} + +void Core::Entity::Player::eventPlay( uint32_t eventId, uint32_t scene, + uint32_t flags, uint32_t eventParam2, + uint32_t eventParam3, uint32_t eventParam4, Scripting::EventReturnCallback eventCallback ) +{ + if( flags & 0x02 ) + { + setStateFlag( PlayerStateFlag::WatchingCutscene ); + sendToInRangeSet( ActorControlPacket142( getId(), SetStatusIcon, + static_cast< uint8_t >( getOnlineStatus() ) ), true ); + } + + auto pEvent = getEvent( eventId ); + if( !pEvent && getEventCount() ) + { + // We're trying to play a nested event, need to start it first. + eventStart( getId(), eventId, Event::Event::Nest, 0, 0 ); + pEvent = getEvent( eventId ); + } + else if( !pEvent ) + { + g_log.error( "Could not find event " + std::to_string( eventId ) + ", event has not been started!" ); + return; + } + + pEvent->setPlayedScene( true ); + pEvent->setEventReturnCallback( eventCallback ); + EventPlayPacket eventPlay( getId(), pEvent->getActorId(), pEvent->getId(), + scene, flags, eventParam2, eventParam3, eventParam4 ); + + queuePacket( eventPlay ); +} + +void Core::Entity::Player::eventFinish( uint32_t eventId, uint32_t freePlayer ) +{ + auto pEvent = getEvent( eventId ); + + if( !pEvent ) + { + g_log.error( "Could not find event " + std::to_string( eventId ) + ", event has not been started!" ); + return; + } + + if( getEventCount() > 1 && pEvent->getEventType() != Event::Event::Nest ) + { + // this is the parent of a nested event, we can't finish it until the parent finishes + return; + } + + switch( pEvent->getEventType() ) + { + case Event::Event::Nest: + { + queuePacket( EventFinishPacket( getId(), pEvent->getId(), pEvent->getEventType(), pEvent->getEventParam3() ) ); + removeEvent( pEvent->getId() ); + + auto events = eventList(); + + for( auto it : events ) + { + + if( it.second->hasPlayedScene() == false ) + { + // TODO: not happy with this, this is also prone to break wit more than one remaining event in there + queuePacket( EventFinishPacket( getId(), it.second->getId(), it.second->getEventType(), it.second->getEventParam3() ) ); + removeEvent( it.second->getId() ); + } + } + + break; + } + default: + { + queuePacket( EventFinishPacket( getId(), pEvent->getId(), pEvent->getEventType(), pEvent->getEventParam3() ) ); + break; + } + } + + if( hasStateFlag( PlayerStateFlag::WatchingCutscene ) ) + { + unsetStateFlag( PlayerStateFlag::WatchingCutscene ); + sendToInRangeSet( ActorControlPacket142( getId(), SetStatusIcon, + static_cast< uint8_t >( getOnlineStatus() ) ), true ); + } + + removeEvent( pEvent->getId() ); + + if( freePlayer == 1 ) + { + unsetStateFlag( PlayerStateFlag::Occupied2 ); + sendStateFlags(); + } +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void Core::Entity::Player::onLogin() +{ + + // TODO: Replace this with MoTD from config + sendNotice( "<<>>\nCompiled: " __DATE__ " " __TIME__ "\n" + "Mind you, character data is going to be wiped regulary!" ); +} + +void Core::Entity::Player::onZoneStart() +{ + +} + +void Core::Entity::Player::onZoneDone() +{ + +} + +void Core::Entity::Player::onDeath() +{ + +} + + +// TODO: slightly ugly here and way too static. Needs too be done properly +void Core::Entity::Player::onTick() +{ + + bool sendUpdate = false; + + if( !isAlive() || !isLoadingComplete() ) + return; + + int32_t addHp = getMaxHp() * 0.1f + 1; + int32_t addMp = 8 * 0.1f + 1; + + if( !m_actorIdTohateSlotMap.empty() ) + { + addHp = getMaxHp() * 0.01f + 1; + addMp = getMaxHp() * 0.01f + 1; + } + + if( m_hp < getMaxHp() ) + { + + if( m_hp + addHp < getMaxHp() ) + m_hp += addHp; + else + m_hp = getMaxHp(); + + sendUpdate = true; + } + + if( m_mp < getMaxMp() ) + { + + if( m_mp + addMp < getMaxMp() ) + m_mp += addMp; + else + m_mp = getMaxMp(); + + sendUpdate = true; + } + + if( m_tp < 1000 ) + { + int32_t addTp = 100; + if( m_tp + addTp < 1000 ) + m_tp += addTp; + else + m_tp = 1000; + + sendUpdate = true; + } + + if( sendUpdate ) + { + sendStatusUpdate(); + setSyncFlag( PlayerSyncFlags::Status ); + } +} diff --git a/src/servers/Server_Zone/PlayerInventory.cpp b/src/servers/Server_Zone/PlayerInventory.cpp new file mode 100644 index 00000000..05802442 --- /dev/null +++ b/src/servers/Server_Zone/PlayerInventory.cpp @@ -0,0 +1,217 @@ +#include + +#include "Player.h" + +#include "ZoneMgr.h" +#include "Zone.h" + +#include + +#include "ActorControlPacket143.h" + +#include "Inventory.h" +#include "Item.h" + +using namespace Core::Common; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +Core::InventoryPtr Core::Entity::Player::getInvetory() const +{ + return m_pInventory; +} + +// TODO: This has to be redone and simplified +void Core::Entity::Player::equipWeapon( Core::ItemPtr pItem ) +{ + ClassJob currentClass = static_cast< ClassJob >( getClass() ); + + switch( pItem->getCategory() ) + { + case ItemCategory::PugWep: + if( currentClass != ClassJob::CLASS_PUGILIST && + currentClass != ClassJob::JOB_MONK ) + setClassJob( ClassJob::CLASS_PUGILIST ); + break; + case ItemCategory::GlaWep: + if( currentClass != ClassJob::CLASS_GLADIATOR && + currentClass != ClassJob::JOB_KNIGHT ) + setClassJob( ClassJob::CLASS_GLADIATOR ); + break; + case ItemCategory::MrdWep: + if( currentClass != ClassJob::CLASS_MARAUDER && + currentClass != ClassJob::JOB_WARRIOR ) + setClassJob( ClassJob::CLASS_MARAUDER ); + break; + case ItemCategory::ArcWep: + if( currentClass != ClassJob::CLASS_ARCHER && + currentClass != ClassJob::JOB_BARD ) + setClassJob( ClassJob::CLASS_ARCHER ); + break; + case ItemCategory::LncWep: + if( currentClass != ClassJob::CLASS_LANCER && + currentClass != ClassJob::JOB_DRAGON ) + setClassJob( ClassJob::CLASS_LANCER ); + break; + case ItemCategory::ThmWep: + case ItemCategory::Thm2Wep: + if( currentClass != ClassJob::CLASS_THAUMATURGE && + currentClass != ClassJob::JOB_BLACK ) + setClassJob( ClassJob::CLASS_THAUMATURGE ); + break; + case ItemCategory::CnjWep: + case ItemCategory::Cnj2Wep: + if( currentClass != ClassJob::CLASS_CONJURER && + currentClass != ClassJob::JOB_WHITE ) + setClassJob( ClassJob::CLASS_CONJURER ); + break; + case ItemCategory::ArnWep: + if( currentClass != ClassJob::CLASS_ARCANIST && + currentClass != ClassJob::JOB_SUMMONER && + currentClass != ClassJob::JOB_SCHOLAR ) + setClassJob( ClassJob::CLASS_ARCANIST ); + break; + default: + break; + } +} + +// equip an item +void Core::Entity::Player::equipItem( Inventory::EquipSlot equipSlotId, Core::ItemPtr pItem, bool sendModel ) +{ + + // Console->outDebOnly("Equipping into slot %i", equipSlotID); + + uint64_t model = pItem->getModelId1(); + uint64_t model2 = pItem->getModelId2(); + + switch( equipSlotId ) + { + case Inventory::EquipSlot::MainHand: + m_modelMainWeapon = model; + m_modelSubWeapon = model2; + // TODO: add job change upon changing weapon if needed + // equipWeapon( pItem ); + break; + + case Inventory::EquipSlot::OffHand: + m_modelSubWeapon = model; + break; + + case Inventory::EquipSlot::SoulCrystal: + // TODO: add Job change on equipping crystal + // change job + break; + + default: // any other slot + m_modelEquip[static_cast< uint8_t >( equipSlotId )] = static_cast< uint32_t >( model ); + break; + + } + + if( sendModel ) + this->sendModel(); +} + +void Core::Entity::Player::unequipItem( Inventory::EquipSlot equipSlotId, ItemPtr pItem ) +{ + m_modelEquip[static_cast< uint8_t >( equipSlotId )] = 0; + sendModel(); +} + +uint32_t Core::Entity::Player::getCurrency( uint8_t type ) const +{ + return m_pInventory->getCurrency( static_cast< Inventory::CurrencyType >( type ) ); +} + +// TODO: these next functions are so similar that they could likely be simplified +void Core::Entity::Player::addCurrency( uint8_t type, uint32_t amount ) +{ + if( !m_pInventory->addCurrency( static_cast< Inventory::CurrencyType >( type ), amount ) ) + return; + + GamePacketNew< FFXIVIpcUpdateInventorySlot > invUpPacket( getId() ); + invUpPacket.data().containerId = Inventory::InventoryType::Currency; + invUpPacket.data().catalogId = 1; + invUpPacket.data().quantity = m_pInventory->getCurrency( static_cast< Inventory::CurrencyType >( type ) ); + invUpPacket.data().slot = static_cast< uint8_t >( type ) - 1; + + queuePacket( invUpPacket ); +} + +void Core::Entity::Player::removeCurrency( uint8_t type, uint32_t amount ) +{ + if( !m_pInventory->removeCurrency( static_cast< Inventory::CurrencyType >( type ), amount ) ) + return; + + GamePacketNew< FFXIVIpcUpdateInventorySlot > invUpPacket( getId() ); + invUpPacket.data().containerId = Inventory::InventoryType::Currency; + invUpPacket.data().catalogId = 1; + invUpPacket.data().quantity = m_pInventory->getCurrency( static_cast< Inventory::CurrencyType >( type ) ); + invUpPacket.data().slot = static_cast< uint8_t >( type ) - 1; + + queuePacket( invUpPacket ); +} + + +uint32_t Core::Entity::Player::getCrystal( uint8_t type ) const +{ + return m_pInventory->getCrystal( static_cast< Inventory::CrystalType >( type ) ); +} + +void Core::Entity::Player::addCrystal( uint8_t type, uint32_t amount ) +{ + if( !m_pInventory->addCrystal( static_cast< Inventory::CrystalType >( type ), amount ) ) + return; + + GamePacketNew< FFXIVIpcUpdateInventorySlot > invUpPacket( getId() ); + invUpPacket.data().containerId = Inventory::InventoryType::Crystal; + invUpPacket.data().catalogId = static_cast< uint8_t >( type ) + 1; + invUpPacket.data().quantity = m_pInventory->getCrystal( static_cast< Inventory::CrystalType >( type ) ); + invUpPacket.data().slot = static_cast< uint8_t >( type ) - 1; + + queuePacket( invUpPacket ); + + queuePacket( ActorControlPacket143( getId(), ItemObtainIcon, static_cast< uint8_t >( type ) + 1, amount ) ); +} + +void Core::Entity::Player::removeCrystal( uint8_t type, uint32_t amount ) +{ + if( !m_pInventory->removeCrystal( static_cast< Inventory::CrystalType >( type ), amount ) ) + return; + + GamePacketNew< FFXIVIpcUpdateInventorySlot > invUpPacket( getId() ); + invUpPacket.data().containerId = Inventory::InventoryType::Crystal; + invUpPacket.data().catalogId = static_cast< uint8_t >( type ) + 1; + invUpPacket.data().quantity = m_pInventory->getCrystal( static_cast< Inventory::CrystalType >( type ) ); + invUpPacket.data().slot = static_cast< uint8_t >( type ) - 1; + + queuePacket( invUpPacket ); +} + +bool Core::Entity::Player::tryAddItem( uint16_t catalogId, uint16_t quantity ) +{ + + for( uint8_t i = 0; i < 4; i++ ) + { + if( m_pInventory->addItem( i, -1, catalogId, quantity ) != -1 ) + { + return true; + } + } + return false; +} + +bool Core::Entity::Player::addItem( uint16_t containerId, uint16_t catalogId, uint16_t quantity ) +{ + if( m_pInventory->addItem( containerId, -1, catalogId, quantity ) != -1 ) + return true; + + return false; +} + +void Core::Entity::Player::sendInventory() const +{ + m_pInventory->send(); +} + diff --git a/src/servers/Server_Zone/PlayerQuest.cpp b/src/servers/Server_Zone/PlayerQuest.cpp new file mode 100644 index 00000000..89e1959d --- /dev/null +++ b/src/servers/Server_Zone/PlayerQuest.cpp @@ -0,0 +1,1185 @@ +#include +#include +#include +#include +#include +#include + +#include "GameConnection.h" + +#include "QuestMessagePacket.h" + +#include "Session.h" +#include "Player.h" +#include "Inventory.h" + + + +extern Core::Db::Database g_database; +extern Core::Data::ExdData g_exdData; + +using namespace Core::Common; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +bool Core::Entity::Player::loadActiveQuests() +{ + + auto pQR = g_database.query( "SELECT * FROM charaquest WHERE CharacterId = " + std::to_string( m_id ) + ";" ); + + if( !pQR ) + return false; + + Db::Field* field = pQR->fetch(); + + for( uint8_t i = 0; i < 30; i++ ) + { + + uint16_t index = i * 10; + + //g_log.debug( " QUEST_ID: " + std::to_string( field[index].getInt16() ) + " INDEX: " + std::to_string( index ) ); + + if( field[index].getInt16() != 0 ) + { + + boost::shared_ptr pActiveQuest( new QuestActive() ); + pActiveQuest->c.questId = field[index].getInt16(); + pActiveQuest->c.sequence = field[index + 1].getUInt8(); + pActiveQuest->c.flags = field[index + 2].getUInt8(); + pActiveQuest->c.UI8A = field[index + 3].getUInt8(); + pActiveQuest->c.UI8B = field[index + 4].getUInt8(); + pActiveQuest->c.UI8C = field[index + 5].getUInt8(); + pActiveQuest->c.UI8D = field[index + 6].getUInt8(); + pActiveQuest->c.UI8E = field[index + 7].getUInt8(); + pActiveQuest->c.UI8F = field[index + 8].getUInt8(); + pActiveQuest->c.padding1 = field[index + 9].getUInt8(); + m_activeQuests[i] = pActiveQuest; + + m_questIdToQuestIdx[pActiveQuest->c.questId] = i; + m_questIdxToQuestId[i] = pActiveQuest->c.questId; + + } + else + { + m_activeQuests[i] = nullptr; + m_freeQuestIdxQueue.push( i ); + } + + } + + return true; + +} + +void Core::Entity::Player::finishQuest( uint16_t questId ) +{ + + int8_t idx = getQuestIndex( questId ); + + if( ( idx != -1 ) && ( m_activeQuests[idx] != nullptr ) ) + { + GamePacketNew< FFXIVIpcQuestUpdate > questUpdatePacket( getId() ); + questUpdatePacket.data().slot = idx; + questUpdatePacket.data().questInfo.c.questId = 0; + questUpdatePacket.data().questInfo.c.sequence = 0xFF; + queuePacket( questUpdatePacket ); + + GamePacketNew< FFXIVIpcQuestFinish > questFinishPacket( getId() ); + questFinishPacket.data().questId = questId; + questFinishPacket.data().flag1 = 1; + questFinishPacket.data().flag2 = 1; + queuePacket( questFinishPacket ); + + updateQuestsCompleted( questId ); + setSyncFlag( PlayerSyncFlags::Quests ); + setSyncFlag( PlayerSyncFlags::QuestTracker ); + + for( int ii = 0; ii < 5; ii++ ) + { + if( m_questTracking[ii] == idx ) + m_questTracking[ii] = -1; + } + + boost::shared_ptr pQuest = m_activeQuests[idx]; + m_activeQuests[idx].reset(); + + m_freeQuestIdxQueue.push( idx ); + m_questIdToQuestIdx.erase( questId ); + m_questIdxToQuestId.erase( idx ); + } + + + sendQuestTracker(); + +} + +void Core::Entity::Player::unfinishQuest( uint16_t questId ) +{ + removeQuestsCompleted( questId ); + setSyncFlag( PlayerSyncFlags::Quests ); + sendQuestInfo(); +} + +void Core::Entity::Player::removeQuest( uint16_t questId ) +{ + + int8_t idx = getQuestIndex( questId ); + + if( ( idx != -1 ) && ( m_activeQuests[idx] != nullptr ) ) + { + + GamePacketNew< FFXIVIpcQuestUpdate > questUpdatePacket( getId() ); + questUpdatePacket.data().slot = idx; + questUpdatePacket.data().questInfo.c.questId = 0; + questUpdatePacket.data().questInfo.c.sequence = 0xFF; + queuePacket( questUpdatePacket ); + + GamePacketNew< FFXIVIpcQuestFinish > questFinishPacket( getId() ); + questFinishPacket.data().questId = questId; + questFinishPacket.data().flag1 = 1; + questFinishPacket.data().flag2 = 1; + queuePacket( questFinishPacket ); + + setSyncFlag( PlayerSyncFlags::Quests ); + setSyncFlag( PlayerSyncFlags::QuestTracker ); + + for( int ii = 0; ii < 5; ii++ ) + { + if( m_questTracking[ii] == idx ) + m_questTracking[ii] = -1; + } + + boost::shared_ptr pQuest = m_activeQuests[idx]; + m_activeQuests[idx].reset(); + + m_freeQuestIdxQueue.push( idx ); + m_questIdToQuestIdx.erase( questId ); + m_questIdxToQuestId.erase( idx ); + } + + sendQuestTracker(); + +} + +bool Core::Entity::Player::hasQuest( uint16_t questId ) +{ + return ( getQuestIndex( questId ) > -1 ); +} + +int16_t Core::Entity::Player::getQuestIndex( uint16_t questId ) +{ + auto it = m_questIdToQuestIdx.find( questId ); + if( it != m_questIdToQuestIdx.end() ) + return it->second; + + return -1; +} + +uint8_t Core::Entity::Player::getQuestBitFlag8( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->a.BitFlag8; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestBitFlag16( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->a.BitFlag16; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestBitFlag24( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->a.BitFlag24; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestBitFlag32( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->a.BitFlag32; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestBitFlag40( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->a.BitFlag40; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestBitFlag48( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->a.BitFlag48; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8A( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->c.UI8A; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8B( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->c.UI8B; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8C( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->c.UI8C; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8D( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->c.UI8D; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8E( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->c.UI8E; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8F( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->c.UI8F; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8AH( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->b.UI8AH; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8BH( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->b.UI8BH; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8CH( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->b.UI8CH; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8DH( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->b.UI8DH; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8EH( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->b.UI8EH; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8FH( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->b.UI8FH; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8AL( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->b.UI8AL; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8BL( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->b.UI8BL; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8CL( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->b.UI8CL; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8DL( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->b.UI8DL; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8EL( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->b.UI8EL; + } + + return value; +} + +uint8_t Core::Entity::Player::getQuestUI8FL( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint8_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + value = pNewQuest->b.UI8FL; + } + + return value; +} + +uint16_t Core::Entity::Player::getQuestUI16A( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint16_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + // value = pNewQuest->d.UI16A; + } + + return value; +} + +uint16_t Core::Entity::Player::getQuestUI16B( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint16_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + // value = pNewQuest->d.UI16B; + } + + return value; +} + +uint16_t Core::Entity::Player::getQuestUI16C( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint16_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + // value = pNewQuest->d.UI16C; + } + + return value; +} + +uint32_t Core::Entity::Player::getQuestUI32A( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + uint32_t value = 0; + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + // value = pNewQuest->e.UI32A; + } + + return value; +} + +void Core::Entity::Player::setQuestUI8A( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->c.UI8A = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI8B( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->c.UI8B = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI8C( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->c.UI8C = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI8D( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->c.UI8D = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI8E( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->c.UI8E = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI8F( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->c.UI8F = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI8AH( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->b.UI8AH = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI8BH( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->b.UI8BH = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI8CH( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->b.UI8CH = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI8DH( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->b.UI8DH = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI8EH( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->b.UI8EH = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI8FH( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->b.UI8FH = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI8AL( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->b.UI8AL = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI8BL( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->b.UI8BL = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI8CL( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->b.UI8CL = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI8DL( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->b.UI8DL = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI8EL( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->b.UI8EL = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI8FL( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->b.UI8FL = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI16A( uint16_t questId, uint16_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + // pNewQuest->d.UI16A = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI16B( uint16_t questId, uint16_t val ) + +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + // pNewQuest->d.UI16B = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI16C( uint16_t questId, uint16_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + +// pNewQuest->d.UI16C = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestUI32A( uint16_t questId, uint32_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + // pNewQuest->e.UI32A = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestBitFlag8( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->a.BitFlag8 = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestBitFlag16( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->a.BitFlag16 = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestBitFlag24( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->a.BitFlag24 = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} +void Core::Entity::Player::setQuestBitFlag32( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->a.BitFlag32 = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestBitFlag40( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->a.BitFlag40 = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + +void Core::Entity::Player::setQuestBitFlag48( uint16_t questId, uint8_t val ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + + pNewQuest->a.BitFlag48 = val; + + updateQuest( questId, pNewQuest->c.sequence ); + setSyncFlag( PlayerSyncFlags::Quests ); + } +} + + + +uint8_t Core::Entity::Player::getQuestSeq( uint16_t questId ) +{ + int16_t idx = getQuestIndex( questId ); + + if( idx != -1 ) + { + boost::shared_ptr< QuestActive > pNewQuest = m_activeQuests[idx]; + return pNewQuest->c.sequence; + } + return 0; +} + +void Core::Entity::Player::updateQuest( uint16_t questId, uint16_t sequence ) +{ + if( hasQuest( questId ) ) + { + GamePacketNew< FFXIVIpcQuestUpdate > pe_qa( getId() ); + int16_t index = getQuestIndex( questId ); + auto pNewQuest = m_activeQuests[index]; + pe_qa.data().slot = index; + pNewQuest->c.sequence = sequence; + pe_qa.data().questInfo = *pNewQuest; + queuePacket( pe_qa ); + + setSyncFlag( PlayerSyncFlags::Quests ); + + } + else + { + + int8_t idx = m_freeQuestIdxQueue.front(); + m_freeQuestIdxQueue.pop(); + + GamePacketNew< FFXIVIpcQuestUpdate > pe_qa( getId() ); + + boost::shared_ptr< QuestActive > pNewQuest( new QuestActive() ); + pNewQuest->c.questId = questId; + pNewQuest->c.sequence = sequence; + pNewQuest->c.padding = 0; + m_activeQuests[idx] = pNewQuest; + + m_questIdToQuestIdx[questId] = idx; + m_questIdxToQuestId[idx] = questId; + + pe_qa.data().slot = idx; + pNewQuest->c.sequence = sequence; + pe_qa.data().questInfo = *pNewQuest; + + + queuePacket( pe_qa ); + + setSyncFlag( PlayerSyncFlags::Quests ); + setSyncFlag( PlayerSyncFlags::QuestTracker ); + + for( int ii = 0; ii < 5; ii++ ) + { + if( m_questTracking[ii] == -1 ) + { + m_questTracking[ii] = idx; + break; + } + } + + sendQuestTracker(); + + } +} + +void Core::Entity::Player::sendQuestTracker() +{ + GamePacketNew< FFXIVIpcQuestTracker > trackerPacket( getId() ); + + for( int ii = 0; ii < 5; ii++ ) + { + if( m_questTracking[ii] >= 0 ) + { + trackerPacket.data().entry[ii].active = 1; + trackerPacket.data().entry[ii].questIndex = m_questTracking[ii]; + } + } + queuePacket( trackerPacket ); +} + +void Core::Entity::Player::setQuestTracker( uint16_t index, int16_t flag ) +{ + if( flag == 0 ) + { + //remove + for( uint8_t ii = 0; ii < 5; ii++ ) + { + if( m_questTracking[ii] == index ) + { + m_questTracking[ii] = -1; + break; + } + } + } + else + { + //add + for( uint8_t ii = 0; ii < 5; ii++ ) + { + if( m_questTracking[ii] == -1 ) + { + m_questTracking[ii] = index; + break; + } + } + } + + setSyncFlag( PlayerSyncFlags::QuestTracker ); + +} + + +void Core::Entity::Player::sendQuestInfo() +{ + GamePacketNew< FFXIVIpcQuestActiveList > pe_qa( getId() ); + + for( int i = 0; i < 30; i++ ) + { + uint8_t offset = i * 12; + if( m_activeQuests[i] != nullptr ) + { + + auto& quest = pe_qa.data().activeQuests[i]; + quest = *m_activeQuests[i]; + + } + } + + queuePacket( pe_qa ); + + GamePacketNew< FFXIVIpcQuestCompleteList > pe_qc( getId() ); + memcpy( pe_qc.data().questCompleteMask, m_questCompleteFlags, 200 ); + queuePacket( pe_qc ); + + sendQuestTracker(); +} + +void Core::Entity::Player::sendQuestMessage( uint32_t questId, int8_t msgId, uint8_t type, uint32_t var1, uint32_t var2 ) +{ + queuePacket( QuestMessagePacket( getAsPlayer(), questId, msgId, type, var1, var2 ) ); +} + + +void Core::Entity::Player::updateQuestsCompleted( uint32_t questId ) +{ + uint8_t index = questId / 8; + uint8_t bitIndex = ( questId ) % 8; + + uint8_t value = 0x80 >> bitIndex; + + m_questCompleteFlags[index] |= value; + + setSyncFlag( PlayerSyncFlags::Quests ); +} + +void Core::Entity::Player::removeQuestsCompleted( uint32_t questId ) +{ + uint8_t index = questId / 8; + uint8_t bitIndex = ( questId ) % 8; + + uint8_t value = 0x80 >> bitIndex; + + m_questCompleteFlags[index] ^= value; + + setSyncFlag( PlayerSyncFlags::Quests ); +} + +bool Core::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t optionalChoice ) +{ + uint32_t playerLevel = getLevel(); + auto questInfo = g_exdData.getQuestInfo( questId ); + + + if( !questInfo ) + return false; + + auto paramGrowth = g_exdData.m_paramGrowthInfoMap[questInfo->quest_level]; + + uint32_t exp = ( questInfo->reward_exp_factor * paramGrowth.quest_exp_mod * ( 45 + 5 * questInfo->quest_level) ) / 100; + exp = exp + ( questInfo->reward_exp_factor / 100 ) * 10000; + + exp = questInfo->reward_exp_factor; + + uint16_t rewardItemCount = questInfo->reward_item.size(); + uint16_t optionalItemCount = questInfo->reward_item_optional.size() > 0 ? 1 : 0; + + uint32_t gilReward = questInfo->reward_gil; + + // TODO: check if there is room in inventory, else return false; + if( exp > 0 ) + gainExp( exp ); + + if( rewardItemCount > 0 ) + { + for( uint32_t i = 0; i < questInfo->reward_item.size(); i++ ) + { + // TODO: add the correct amount of items instead of 1 + addItem( -1, questInfo->reward_item.at( i ), questInfo->reward_item_count.at( i ) ); + } + } + + if( optionalItemCount > 0 ) + { + auto itemId = questInfo->reward_item_optional.at( optionalChoice ); + // TODO: add the correct amount of items instead of 1 + addItem( -1, itemId, questInfo->reward_item_optional_count.at( optionalChoice ) ); + } + + if( gilReward > 0 ) + addCurrency( 1, gilReward ); + + return true; +} + +boost::shared_ptr Core::Entity::Player::getQuestActive( uint16_t index ) +{ + return m_activeQuests[index]; +} + diff --git a/src/servers/Server_Zone/PlayerSpawnPacket.h b/src/servers/Server_Zone/PlayerSpawnPacket.h new file mode 100644 index 00000000..0353502e --- /dev/null +++ b/src/servers/Server_Zone/PlayerSpawnPacket.h @@ -0,0 +1,101 @@ +#ifndef _PLAYERSPAWN_H +#define _PLAYERSPAWN_H + +#include +#include +#include +#include "Player.h" +#include "Forwards.h" + +namespace Core { + namespace Network { + namespace Packets { + namespace Server { + + /** + * @brief The packet sent to finish an event. + */ + class PlayerSpawnPacket : + public GamePacketNew + { + public: + PlayerSpawnPacket( Entity::PlayerPtr pPlayer, Entity::PlayerPtr pTarget ) : + GamePacketNew( pPlayer->getId(), pTarget->getId() ) + { + initialize( pPlayer, pTarget ); + }; + + private: + void initialize( Entity::PlayerPtr pPlayer, Entity::PlayerPtr pTarget ) + { + // todo: figure out unkown offsets + // TODO: temporary gm rank + //m_data.gmRank = 0xff; + + + m_data.currentMount = 0; + m_data.classJob = pPlayer->getClass(); + //m_data.status = static_cast< uint8_t >( pPlayer->getStatus() ); + m_data.hPCurr = pPlayer->getHp(); + m_data.mPCurr = pPlayer->getMp(); + m_data.tPCurr = pPlayer->getTp(); + m_data.hPMax = pPlayer->getMaxHp(); + m_data.mPMax = pPlayer->getMaxMp(); + m_data.gmRank = 0xff; + //m_data.tPMax = 3000; + m_data.level = pPlayer->getLevel(); + memcpy( m_data.look, pPlayer->getLookArray(), 26 ); + m_data.mainWeaponModel = pPlayer->getModelMainWeapon(); + m_data.secWeaponModel = pPlayer->getModelSubWeapon(); + m_data.models[0] = pPlayer->getModelForSlot( Inventory::EquipSlot::Head ); + m_data.models[1] = pPlayer->getModelForSlot( Inventory::EquipSlot::Body ); + m_data.models[2] = pPlayer->getModelForSlot( Inventory::EquipSlot::Hands ); + m_data.models[3] = pPlayer->getModelForSlot( Inventory::EquipSlot::Legs ); + m_data.models[4] = pPlayer->getModelForSlot( Inventory::EquipSlot::Feet ); + strcpy( m_data.name, pPlayer->getName().c_str() ); + m_data.pos.x = pPlayer->getPos().x; + m_data.pos.y = pPlayer->getPos().y; + m_data.pos.z = pPlayer->getPos().z; + m_data.voice = pPlayer->getVoiceId(); + + m_data.rotation = Math::Util::floatToUInt16Rot( pPlayer->getRotation() ); + + m_data.onlineStatus = static_cast< uint8_t >( pPlayer->getOnlineStatus() ); + + //m_data.u23 = 0x04; + //m_data.u24 = 256; + m_data.state = 1; + m_data.type = 1; + if( pTarget == pPlayer ) + { + m_data.spawnIndex = 0x00; + } + else + { + m_data.spawnIndex = pTarget->getSpawnIdForActorId( pPlayer->getId() ); + } + // 0x20 == spawn hidden to be displayed by the spawneffect control + m_data.displayFlags = pPlayer->getStance(); + + if( pPlayer->getZoningType() != Common::ZoneingType::None ) + { + m_data.displayFlags |= 0x20; + } + + m_data.targetId = pPlayer->getTargetId(); + //m_data.type = 1; + //m_data.unknown_33 = 4; + //m_data.unknown_38 = 0x70; + //m_data.unknown_60 = 3; + //m_data.unknown_61 = 7; + + + }; + }; + + } + } + } +} + +#endif /*_PlayerSpawn_H*/ \ No newline at end of file diff --git a/src/servers/Server_Zone/PlayerSql.cpp b/src/servers/Server_Zone/PlayerSql.cpp new file mode 100644 index 00000000..83ab972b --- /dev/null +++ b/src/servers/Server_Zone/PlayerSql.cpp @@ -0,0 +1,437 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include "Player.h" + +#include "ZoneMgr.h" +#include "Zone.h" + +#include "ServerZone.h" + +#include "Forwards.h" + +#include "GameConnection.h" +#include "InitUIPacket.h" +#include "StatusEffectContainer.h" +#include "Inventory.h" + +extern Core::Logger g_log; +extern Core::Db::Database g_database; +extern Core::ServerZone g_serverZone; +extern Core::ZoneMgr g_zoneMgr; +extern Core::Data::ExdData g_exdData; + +using namespace Core::Common; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +// load player from the db +bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession ) +{ + // TODO: can't help but think that the whole player loading could be handled better... + const std::string char_id_str = std::to_string( charId ); + + auto pQR = g_database.query( "SELECT c.Name, " + "c.PrimaryTerritoryId, " + "c.Hp, " + "c.Mp, " + "c.Gp, " + "c.Mode, " + "c.Pos_0_0, " + "c.Pos_0_1, " + "c.Pos_0_2, " + "c.Pos_0_3, " + "c.FirstLogin, " + "c.Customize, " + "c.ModelMainWeapon, " + "c.ModelSubWeapon, " + "c.ModelEquip, " + "cd.GuardianDeity, " + "cd.BirthDay, " + "cd.BirthMonth, " + "cd.Status, " + "cd.Class, " + "cd.Homepoint, " + "cd.HowTo, " + "c.ContentId, " + "c.Voice, " + "cd.QuestCompleteFlags, " + "cd.QuestTracking, " + "c.IsNewGame, " + "cd.Aetheryte, " + "cd.unlocks, " + "cd.Discovery, " + "cd.StartTown, " + "cd.TotalPlayTime, " + "c.IsNewAdventurer, " + "cd.GrandCompany, " + "cd.GrandCompanyRank " + "FROM charabase AS c " + " INNER JOIN charadetail AS cd " + " ON c.CharacterId = cd.CharacterId " + "WHERE c.CharacterId = " + char_id_str + ";" ); + + if( !pQR ) + { + g_log.error( "Player id " + char_id_str + " does not exist!" ); + return false; + } + + m_updateFlags = PlayerSyncFlags::None; + m_id = charId; + + Db::Field *field = pQR->fetch(); + + strcpy( m_name, field[0].getString() ); + + ZonePtr pCurrZone = g_zoneMgr.getZone( field[1].getInt32() ); + m_zoneId = field[1].getInt32(); + + // see if a valid zone could be found for the character + if( !pCurrZone ) + { + g_log.error( "[" + char_id_str + "] Zone " + std::to_string( field[1].getInt32() ) + "not found!" ); + g_log.error( "[" + char_id_str + "] Setting default zone instead" ); + + // default to new gridania + // TODO: should probably just abort and mark character as corrupt + pCurrZone = g_zoneMgr.getZone( 132 ); + + m_pos.x = 0.0f; + m_pos.y = 0.0f; + m_pos.z = 0.0f; + setRotation( 0.0f ); + } + + m_hp = field[2].getUInt32(); + + m_mp = field[3].getUInt32(); + m_tp = 0; + + m_pos.x = field[6].getFloat(); + m_pos.y = field[7].getFloat(); + m_pos.z = field[8].getFloat(); + setRotation( field[9].getFloat() ); + + m_bFirstLogin = field[10].getBool(); + + field[11].getBinary( reinterpret_cast< char* >( m_customize ), 26 ); + + field[14].getBinary( reinterpret_cast< char* >( m_modelEquip ), 40 ); + + m_guardianDeity = field[15].getUInt8(); + m_birthDay = field[16].getUInt8(); + m_birthMonth = field[17].getUInt8(); + m_status = static_cast< ActorStatus >( field[18].getUInt8() ); + m_class = static_cast< ClassJob >( field[19].getUInt8() ); + m_homePoint = field[20].getUInt8(); + + field[21].getBinary( reinterpret_cast< char* >( m_howTo ), sizeof( m_howTo ) ); + + m_contentId = field[22].getUInt64(); + + m_voice = field[23].getUInt32(); + + field[24].getBinary( reinterpret_cast< char* >( m_questCompleteFlags ), 200 ); + + field[25].getBinary( reinterpret_cast< char* >( m_questTracking ), 10 ); + + m_bNewGame = field[26].getBool(); + + field[27].getBinary( reinterpret_cast< char* >( m_aetheryte ), sizeof( m_aetheryte ) ); + + field[28].getBinary( reinterpret_cast< char* >( m_unlocks ), 64 ); + + field[29].getBinary( reinterpret_cast< char* >( m_discovery ), sizeof( m_discovery ) ); + + m_startTown = field[30].getInt8(); + m_playTime = field[31].getUInt32(); + + m_bNewAdventurer = field[32].getBool(); + + m_gc = field[33].getUInt8(); + field[34].getBinary( reinterpret_cast< char* >( m_gcRank ), 3 ); + + m_pCell = nullptr; + + if( !loadActiveQuests() || !loadClassData() || !loadSearchInfo() ) + g_log.error( "Player id " + char_id_str + " data corrupt!" ); + + m_userLevel = 1; + + m_maxHp = getMaxHp(); + m_maxMp = getMaxMp(); + + m_modelSubWeapon = 0; + m_lastTickTime = 0; + + auto pPlayer = getAsPlayer(); + m_pInventory = InventoryPtr( new Inventory( pPlayer ) ); + + pPlayer->calculateStats(); + + // first login, run the script event + if( m_bNewGame ) + { + //g_scriptMgr.onPlayerFirstEnterWorld( pPlayer ); + m_bNewGame = false; + m_hp = getMaxHp(); + m_mp = getMaxMp(); + setSyncFlag( PlayerSyncFlags::NewGame ); + } + + if( m_hp > getMaxHp() ) + m_hp = getMaxHp(); + + if( m_mp > getMaxMp() ) + m_mp = getMaxMp(); + + if( m_hp == 0 ) + m_status = ActorStatus::Dead; + + if( m_bNewAdventurer ) + setStateFlag( PlayerStateFlag::NewAdventurer ); + + setStateFlag( PlayerStateFlag::BetweenAreas ); + + m_pInventory->load(); + + initHateSlotQueue(); + + initSpawnIdQueue(); + + m_pStatusEffectContainer = StatusEffect::StatusEffectContainerPtr( new StatusEffect::StatusEffectContainer( shared_from_this() ) ); + + if( !m_playerIdToSpawnIdMap.empty() ) + m_playerIdToSpawnIdMap.clear(); + + return true; +} + + +bool Core::Entity::Player::loadClassData() +{ + auto pQR = g_database.query( "SELECT * FROM characlass WHERE CharacterId = " + std::to_string( m_id ) + ";" ); + + if( !pQR ) + return false; + + Db::Field* field = pQR->fetch(); + + for( uint8_t i = 0; i < 25; i++ ) + { + uint8_t index = i * 2; + m_classArray[i] = field[index].getUInt8(); + m_expArray[i] = field[index + 1].getUInt32(); + } + + return true; +} + +bool Core::Entity::Player::loadSearchInfo() +{ + auto pQR = g_database.query( "SELECT * FROM charainfosearch WHERE CharacterId = " + std::to_string( m_id ) + ";" ); + + if( !pQR ) + return false; + + Db::Field* field = pQR->fetch(); + + m_searchSelectClass = field[1].getUInt8(); + m_searchSelectRegion = field[2].getUInt8(); + sprintf( m_searchMessage, field[3].getString() ); + + return true; +} + + +void Core::Entity::Player::createUpdateSql() +{ + + // if nothing to update, don't bother. + if( m_updateFlags == PlayerSyncFlags::None ) + return; + + std::set< std::string > charaBaseSet; + std::set< std::string > charaDetailSet; + std::set< std::string > charaClassSet; + std::set< std::string > charaQuestSet; + std::set< std::string > charaInfoSearchSet; + + std::string dbName = g_serverZone.getConfig()->getValue< std::string >( "Settings.General.Mysql.Database", "sapphire" ); + std::string updateCharaBase = "UPDATE " + dbName + ".charabase SET "; + std::string updateCharaDetail = "UPDATE " + dbName + ".charadetail SET "; + std::string updateCharaClass = "UPDATE " + dbName + ".characlass SET "; + std::string updateCharaQuest = "UPDATE " + dbName + ".charaquest SET "; + std::string updateCharaInfoSearch = "UPDATE " + dbName + ".charainfosearch SET "; + + std::string condition = " UPDATE_DATE = NOW() WHERE CharacterId = " + std::to_string( m_id ) + ";"; + + if( m_updateFlags & PlayerSyncFlags::Position ) + { + charaBaseSet.insert( " Pos_0_0 = " + std::to_string( m_pos.x ) ); + charaBaseSet.insert( " Pos_0_1 = " + std::to_string( m_pos.y ) ); + charaBaseSet.insert( " Pos_0_2 = " + std::to_string( m_pos.z ) ); + charaBaseSet.insert( " Pos_0_3 = " + std::to_string( getRotation() ) ); + charaBaseSet.insert( " PrimaryTerritoryId = " + std::to_string( m_zoneId ) ); + } + + if( m_updateFlags & PlayerSyncFlags::HomePoint ) + charaDetailSet.insert( " Homepoint = " + std::to_string( m_homePoint ) ); + + if( m_updateFlags & PlayerSyncFlags::Discovery ) + charaDetailSet.insert( " Discovery = UNHEX('" + std::string( Util::binaryToHexString( static_cast< uint8_t* >( m_discovery ), sizeof( m_discovery ) ) ) + "')" ); + + if( m_updateFlags & PlayerSyncFlags::PlayTime ) + charaDetailSet.insert( " TotalPlayTime = " + std::to_string( m_playTime ) ); + + if( m_updateFlags & PlayerSyncFlags::Unlocks ) + charaDetailSet.insert( " unlocks = UNHEX('" + std::string( Util::binaryToHexString( static_cast< uint8_t* >( m_unlocks ), sizeof( m_unlocks ) ) ) + "')" ); + + if( m_updateFlags & PlayerSyncFlags::QuestTracker ) + charaDetailSet.insert( " QuestTracking = UNHEX('" + std::string( Util::binaryToHexString( reinterpret_cast< uint8_t* >( m_questTracking ), sizeof( m_questTracking ) ) ) + "')" ); + + if( m_updateFlags & PlayerSyncFlags::HowTo ) + charaDetailSet.insert( " HowTo = UNHEX('" + std::string( Util::binaryToHexString( static_cast< uint8_t* >( m_howTo ), sizeof( m_howTo ) ) ) + "')" ); + + if( m_updateFlags & PlayerSyncFlags::Aetherytes ) + charaDetailSet.insert( " Aetheryte = UNHEX('" + std::string( Util::binaryToHexString( reinterpret_cast< uint8_t* >( m_aetheryte ), sizeof( m_aetheryte ) ) ) + "')" ); + + + if( m_updateFlags & PlayerSyncFlags::NewGame ) + charaBaseSet.insert( " IsNewGame = " + std::to_string( static_cast< uint32_t >( m_bNewGame ) ) ); + + if( m_updateFlags & PlayerSyncFlags::FirstLogin ) + charaBaseSet.insert( " FirstLogin = 0 " ); + + if( m_updateFlags & PlayerSyncFlags::NewAdventurer ) + charaBaseSet.insert( " IsNewAdventurer = " + std::to_string( static_cast< uint32_t >( m_bNewAdventurer ) ) ); + + if( m_updateFlags & PlayerSyncFlags::GC ) + { + charaDetailSet.insert( " GrandCompany = " + std::to_string( m_gc ) ); + charaDetailSet.insert( " GrandCompanyRank = UNHEX('" + std::string( Util::binaryToHexString( reinterpret_cast< uint8_t* >( m_gcRank ), sizeof( m_gcRank ) ) ) + "')" ); + } + + + + if( m_updateFlags & PlayerSyncFlags::ExpLevel ) + { + uint8_t classJobIndex = g_exdData.m_classJobInfoMap[static_cast< uint8_t >( getClass() )].exp_idx; + charaClassSet.insert( " Lv_" + std::to_string( classJobIndex ) + " = " + std::to_string( static_cast< uint32_t >( getLevel() ) ) ); + charaClassSet.insert( " Exp_" + std::to_string( classJobIndex ) + " = " + std::to_string( getExp() ) ); + } + + if( m_updateFlags & PlayerSyncFlags::Status ) + { + charaBaseSet.insert( " Hp = " + std::to_string( getHp() ) ); + charaBaseSet.insert( " Mp = " + std::to_string( getMp() ) ); + charaBaseSet.insert( " Mode = " + std::to_string( static_cast< uint32_t >( getStance() ) ) ); + charaBaseSet.insert( " ModelEquip = UNHEX('" + std::string( Util::binaryToHexString( reinterpret_cast< uint8_t* >( m_modelEquip ), 40 ) ) + "')" ); + charaDetailSet.insert( " Class = " + std::to_string( static_cast< uint32_t >( getClass() ) ) ); + charaDetailSet.insert( " Status = " + std::to_string( static_cast< uint8_t >( getStatus() ) ) ); + } + + if( m_updateFlags & PlayerSyncFlags::Quests ) + { + charaDetailSet.insert( " QuestCompleteFlags = UNHEX('" + std::string( Util::binaryToHexString( static_cast< uint8_t* >( m_questCompleteFlags ), 200 ) ) + "')" ); + + for( int i = 0; i < 30; i++ ) + { + if( m_activeQuests[i] != nullptr ) + { + charaQuestSet.insert( " QuestId_" + std::to_string( i ) + " = " + std::to_string( m_activeQuests[i]->c.questId ) ); + charaQuestSet.insert( " Sequence_" + std::to_string( i ) + " = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.sequence ) ) ); + charaQuestSet.insert( " Flags_" + std::to_string( i ) + " = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.flags ) ) ); + charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_0 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8A ) ) ); + charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_1 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8B ) ) ); + charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_2 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8C ) ) ); + charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_3 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8D ) ) ); + charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_4 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8E ) ) ); + charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_5 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8F ) ) ); + charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_6 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.padding1 ) ) ); + } + else + { + charaQuestSet.insert( " QuestId_" + std::to_string( i ) + " = 0" ); + charaQuestSet.insert( " Sequence_" + std::to_string( i ) + " = 0" ); + charaQuestSet.insert( " Flags_" + std::to_string( i ) + " = 0" ); + charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_0 = 0" ); + charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_1 = 0" ); + charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_2 = 0" ); + charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_3 = 0" ); + charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_4 = 0" ); + charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_5 = 0" ); + charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_6 = 0" ); + } + } + } + + if( m_updateFlags & PlayerSyncFlags::SearchInfo ) + { + charaInfoSearchSet.insert( " SelectClassId = " + std::to_string( m_searchSelectClass ) ); + charaInfoSearchSet.insert( " SelectRegion = " + std::to_string( m_searchSelectRegion ) ); + charaInfoSearchSet.insert( " SearchComment = UNHEX('" + std::string( Util::binaryToHexString( reinterpret_cast< uint8_t* >( m_searchMessage ), sizeof( m_searchMessage ) ) + "')" ) ); + } + + if( !charaInfoSearchSet.empty() ) + { + for( auto entry : charaInfoSearchSet ) + updateCharaInfoSearch += entry + ", "; + + updateCharaInfoSearch += condition; + g_database.execute( updateCharaInfoSearch.c_str() ); + } + + if( !charaBaseSet.empty() ) + { + for( auto entry : charaBaseSet ) + updateCharaBase += entry + ", "; + + updateCharaBase += condition; + g_database.execute( updateCharaBase.c_str() ); + } + + if( !charaDetailSet.empty() ) + { + for( auto entry : charaDetailSet ) + updateCharaDetail += entry + ", "; + + updateCharaDetail += condition; + g_database.execute( updateCharaDetail.c_str() ); + } + + if( !charaClassSet.empty() ) + { + for( auto entry : charaClassSet ) + updateCharaClass += entry + ", "; + + updateCharaClass += condition; + g_database.execute( updateCharaClass.c_str() ); + } + + if( !charaQuestSet.empty() ) + { + for( auto entry : charaQuestSet ) + updateCharaQuest += entry + ", "; + + updateCharaQuest += condition; + g_database.execute( updateCharaQuest.c_str() ); + } + + m_updateFlags = PlayerSyncFlags::None; + +} + diff --git a/src/servers/Server_Zone/PlayerStateFlagsPacket.h b/src/servers/Server_Zone/PlayerStateFlagsPacket.h new file mode 100644 index 00000000..7b7f801d --- /dev/null +++ b/src/servers/Server_Zone/PlayerStateFlagsPacket.h @@ -0,0 +1,58 @@ +#ifndef _PLAYERSTATE_H +#define _PLAYERSTATE_H + +#include +#include "Player.h" +#include "Forwards.h" + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +/** +* @brief The Ping response packet. +*/ +class PlayerStateFlagsPacket : + public GamePacketNew< FFXIVIpcPlayerStateFlags > +{ +public: + PlayerStateFlagsPacket( Entity::PlayerPtr pActor ) : + GamePacketNew< FFXIVIpcPlayerStateFlags >( pActor->getId(), pActor->getId() ) + { + initialize( pActor->getStateFlags() ); + } + + PlayerStateFlagsPacket( Entity::PlayerPtr pActor, std::vector< Common::PlayerStateFlag > flags ) : + GamePacketNew< FFXIVIpcPlayerStateFlags >( pActor->getId(), pActor->getId() ) + { + uint8_t newFlags[7]; + memset( newFlags, 0, 7 ); + + for( auto& flag : flags ) + { + int iFlag = static_cast< uint32_t >( flag ); + uint8_t index = iFlag / 8; + uint8_t bitIndex = iFlag % 8; + + uint8_t value = 1 << bitIndex; + + newFlags[index] |= value; + } + + initialize( newFlags ); + } + +private: + void initialize( const uint8_t* flags ) + { + memcpy( m_data.flags, flags, 7 ); + }; +}; + +} +} +} +} + +#endif /*_PLAYERSTATE_H*/ \ No newline at end of file diff --git a/src/servers/Server_Zone/QuestMessagePacket.h b/src/servers/Server_Zone/QuestMessagePacket.h new file mode 100644 index 00000000..6e5d6b5c --- /dev/null +++ b/src/servers/Server_Zone/QuestMessagePacket.h @@ -0,0 +1,42 @@ +#ifndef _QUESTMESSAGE_H +#define _QUESTMESSAGE_H + +#include +#include "Player.h" +#include "Forwards.h" + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +/** +* @brief The Ping response packet. +*/ +class QuestMessagePacket : + public GamePacketNew< FFXIVIpcQuestMessage > +{ +public: + QuestMessagePacket( Entity::ActorPtr pActor, uint32_t questId, int8_t msgId, uint8_t type = 0, uint32_t var1 = 0, uint32_t var2 = 0 ) : + GamePacketNew< FFXIVIpcQuestMessage >( pActor->getId(), pActor->getId() ) + { + initialize( questId, msgId, type, var1, var2 ); + }; + +private: + void initialize( uint32_t questId, int8_t msgId, uint8_t type, uint32_t var1, uint32_t var2 ) + { + m_data.questId = questId; + m_data.msgId = msgId; + m_data.type = type; + m_data.var1 = var1; + m_data.var2 = var2; + }; +}; + +} +} +} +} + +#endif /* _QUESTMESSAGE_H */ \ No newline at end of file diff --git a/src/servers/Server_Zone/ScriptManager.cpp b/src/servers/Server_Zone/ScriptManager.cpp new file mode 100644 index 00000000..4a05c549 --- /dev/null +++ b/src/servers/Server_Zone/ScriptManager.cpp @@ -0,0 +1,396 @@ +#include +#include +#include + +#include +#include "ScriptManager.h" + +#include "Zone.h" +#include "Player.h" +#include "BattleNpc.h" +#include "ServerZone.h" +#include "Event.h" +#include "EventHelper.h" +#include "ScriptManager.h" + +#include "ServerNoticePacket.h" + +#include +#include +#include +#include +#include + +extern Core::Logger g_log; +extern Core::Data::ExdData g_exdData; +extern Core::ServerZone g_serverZone; +extern Core::Scripting::ScriptManager g_scriptManager; + +Core::Scripting::ScriptManager::ScriptManager() +{ + m_pChaiHandler = create_chaiscript(); +} + +Core::Scripting::ScriptManager::~ScriptManager() +{ + +} + +void Core::Scripting::ScriptManager::loadDir( std::string dirname, std::set& chaiFiles ) +{ + + boost::filesystem::path targetDir( dirname ); + + boost::filesystem::recursive_directory_iterator iter( targetDir ), eod; + + BOOST_FOREACH( boost::filesystem::path const& i, make_pair( iter, eod ) ) + { + + if( is_regular_file( i ) && boost::filesystem::extension( i.string() ) == ".chai" || + boost::filesystem::extension( i.string() ) == ".inc" ) + { + chaiFiles.insert( i.string() ); + } + } + +} + +void Core::Scripting::ScriptManager::onPlayerFirstEnterWorld( Core::Entity::PlayerPtr pPlayer ) +{ + try + { + std::string test = m_onFirstEnterWorld( *pPlayer ); + } + catch( const std::exception &e ) + { + std::string what = e.what(); + g_log.Log( LoggingSeverity::error, what ); + } +} + +bool Core::Scripting::ScriptManager::registerBnpcTemplate( std::string templateName, uint32_t bnpcBaseId, uint32_t bnpcNameId, uint32_t modelId, std::string aiName ) +{ + return g_serverZone.registerBnpcTemplate( templateName, bnpcBaseId, bnpcNameId, modelId, aiName ); +} + +void Core::Scripting::ScriptManager::reload() +{ + auto handler = create_chaiscript(); + m_pChaiHandler.swap( handler ); + init(); +} + +const boost::shared_ptr& Core::Scripting::ScriptManager::getHandler() const +{ + return m_pChaiHandler; +} + + +bool Core::Scripting::ScriptManager::onTalk( Core::Entity::PlayerPtr pPlayer, uint64_t actorId, uint32_t eventId ) +{ + std::string eventName = "onTalk"; + std::string objName = Event::getEventName( eventId ); + + pPlayer->sendDebug("Actor: " + + std::to_string( actorId ) + + " \neventId: " + + std::to_string( eventId ) + + " (0x" + boost::str( boost::format( "%|08X|" ) + % static_cast< uint64_t >( eventId & 0xFFFFFFF ) ) + ")" ); + + uint16_t eventType = eventId >> 16; + + try + { + // Get object from engine + auto obj = m_pChaiHandler->eval( objName ); + pPlayer->sendDebug( "Calling: " + objName + "." + eventName ); + + pPlayer->eventStart( actorId, eventId, Event::Event::Talk, 0, 0 ); + + auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, uint32_t, Entity::Player&, uint64_t ) > >( eventName ); + fn( obj, eventId, *pPlayer, actorId ); + + pPlayer->checkEvent( eventId ); + } + catch( std::exception& e ) + { + + if( eventType == Common::EventType::Quest ) + { + auto questInfo = g_exdData.getQuestInfo( eventId ); + if( questInfo ) + { + pPlayer->sendDebug( "Quest not implemented: " + questInfo->name + "\n" + e.what() ); + return false; + } + } + + pPlayer->sendDebug( e.what() ); + return false; + } + return true; +} + +bool Core::Scripting::ScriptManager::onEnterTerritory( Core::Entity::PlayerPtr pPlayer, uint32_t eventId, + uint16_t param1, uint16_t param2 ) +{ + std::string eventName = "onEnterTerritory"; + std::string objName = Event::getEventName( eventId ); + + try + { + // Get object from engine + auto obj = m_pChaiHandler->eval( objName ); + + pPlayer->sendDebug( "Calling: " + objName + "." + eventName ); + + pPlayer->eventStart( pPlayer->getId(), eventId, Event::Event::EnterTerritory, 0, pPlayer->getZoneId() ); + + auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, uint32_t, Entity::Player&, uint16_t, uint16_t ) > >( eventName ); + fn( obj, eventId, *pPlayer, param1, param2 ); + + pPlayer->checkEvent( eventId ); + } + catch( std::exception& e ) + { + pPlayer->sendDebug( e.what() ); + return false; + } + return true; +} + +bool Core::Scripting::ScriptManager::onWithinRange( Entity::PlayerPtr pPlayer, uint32_t eventId, uint32_t param1, float x, float y, float z ) +{ + std::string eventName = "onWithinRange"; + std::string objName = Event::getEventName( eventId ); + + try + { + // Get object from engine + auto obj = m_pChaiHandler->eval( Event::getEventName( eventId ) ); + + pPlayer->sendDebug( "Calling: " + objName + "." + eventName ); + + pPlayer->eventStart( pPlayer->getId(), eventId, Event::Event::WithinRange, 1, param1 ); + + auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, uint32_t, Entity::Player&, uint32_t, float, float, float ) > >( eventName ); + fn( obj, eventId, *pPlayer, param1, x, y, z ); + + pPlayer->checkEvent( eventId ); + } + catch( std::exception& e ) + { + pPlayer->sendDebug( e.what() ); + return false; + } + return true; +} + +bool Core::Scripting::ScriptManager::onOutsideRange( Entity::PlayerPtr pPlayer, uint32_t eventId, uint32_t param1, float x, float y, float z ) +{ + std::string eventName = "onOutsideRange"; + std::string objName = Event::getEventName( eventId ); + + try + { + // Get object from engine + auto obj = m_pChaiHandler->eval( Event::getEventName( eventId ) ); + + pPlayer->sendDebug( "Calling: " + objName + "." + eventName ); + + pPlayer->eventStart( pPlayer->getId(), eventId, Event::Event::OutsideRange, 1, param1 ); + + auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, uint32_t, Entity::Player&, uint32_t, float, float, float ) > >( eventName ); + fn( obj, eventId, *pPlayer, param1, x, y, z ); + + pPlayer->checkEvent( eventId ); + } + catch( std::exception& e ) + { + pPlayer->sendDebug( e.what() ); + return false; + } + return true; +} + +bool Core::Scripting::ScriptManager::onEmote( Core::Entity::PlayerPtr pPlayer, uint64_t actorId, + uint32_t eventId, uint8_t emoteId ) +{ + std::string eventName = "onEmote"; + std::string objName = Event::getEventName( eventId ); + + try + { + auto obj = m_pChaiHandler->eval( Event::getEventName( eventId ) ); + + pPlayer->sendDebug( "Calling: " + objName + "." + eventName ); + + pPlayer->eventStart( actorId, eventId, Event::Event::Emote, 0, emoteId ); + + auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, uint32_t, Entity::Player&, uint64_t, uint8_t ) > >( eventName ); + fn( obj, eventId, *pPlayer, actorId, emoteId ); + + pPlayer->checkEvent( eventId ); + } + catch( std::exception& e ) + { + uint16_t eventType = eventId >> 16; + + if( eventType == Common::EventType::Quest ) + { + auto questInfo = g_exdData.getQuestInfo( eventId ); + if( questInfo ) + { + pPlayer->sendDebug( "Quest not implemented: " + questInfo->name + "\n" + e.what() ); + return false; + } + } + return false; + } + return true; +} + +bool Core::Scripting::ScriptManager::onEventHandlerReturn( Core::Entity::PlayerPtr pPlayer, uint32_t eventId, uint16_t subEvent, + uint16_t param1, uint16_t param2, uint16_t param3 ) +{ + + pPlayer->sendDebug("eventId: " + + std::to_string( eventId ) + + " ( 0x" + boost::str( boost::format( "%|08X|" ) % ( uint64_t ) ( eventId & 0xFFFFFFF ) ) + " ) " + + " scene: " + std::to_string( subEvent ) + + " p1: " + std::to_string( param1 ) + + " p2: " + std::to_string( param2 ) + + " p3: " + std::to_string( param3 ) ); + + try + { + auto pEvent = pPlayer->getEvent( eventId ); + if( pEvent ) + { + pEvent->setPlayedScene( false ); + // try to retrieve a stored callback + auto eventCallback = pEvent->getEventReturnCallback(); + // if there is one, proceed to call it + if( eventCallback ) + { + eventCallback( *pPlayer, eventId, param1, param2, param3 ); + if( !pEvent->hasPlayedScene() ) + pPlayer->eventFinish( eventId, 1 ); + else + pEvent->setPlayedScene( false ); + } + // else, finish the event. + else + pPlayer->eventFinish( eventId, 1 ); + } + } + catch( std::exception& e ) + { + pPlayer->sendNotice( e.what() ); + return false; + } + + return true; +} + +bool Core::Scripting::ScriptManager::onEventHandlerTradeReturn( Core::Entity::PlayerPtr pPlayer, uint32_t eventId, + uint16_t subEvent, uint16_t param, uint32_t catalogId ) +{ + std::string eventName = Event::getEventName( eventId ) + "_TRADE"; + + try + { + auto fn = m_pChaiHandler->eval< std::function< void( Entity::Player&, uint32_t, uint16_t, uint16_t, uint32_t ) > >( eventName ); + fn( *pPlayer, eventId, subEvent, param, catalogId ); + } + catch( ... ) + { + return false; + } + + return true; +} + +bool Core::Scripting::ScriptManager::onEventItem( Entity::PlayerPtr pPlayer, uint32_t eventItemId, + uint32_t eventId, uint32_t castTime, uint64_t targetId ) +{ + std::string eventName = "onEventItem"; + std::string objName = Event::getEventName( eventId ); + + try + { + auto obj = m_pChaiHandler->eval( Event::getEventName( eventId ) ); + + pPlayer->sendDebug( "Calling: " + objName + "." + eventName ); + + pPlayer->eventStart( targetId, eventId, Event::Event::Item, 0, 0 ); + + auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, uint32_t, Entity::Player&, uint32_t, uint32_t, uint64_t ) > >( eventName ); + fn( obj, eventId, *pPlayer, eventItemId, castTime, targetId ); + } + catch( std::exception& e ) + { + pPlayer->sendNotice( e.what() ); + return false; + } + + return true; + +} + +bool Core::Scripting::ScriptManager::onMobKill( Entity::PlayerPtr pPlayer, uint16_t nameId ) +{ + std::string eventName = "onBnpcKill_" + std::to_string( nameId ); + + + // loop through all active quests and try to call available onMobKill callbacks + for( size_t i = 0; i < 30; i++ ) + { + auto activeQuests = pPlayer->getQuestActive( i ); + if( !activeQuests ) + continue; + + uint16_t questId = activeQuests->c.questId; + if( questId != 0 ) + { + auto obj = m_pChaiHandler->eval( Event::getEventName( 0x00010000 | questId ) ); + std::string objName = Event::getEventName( 0x00010000 | questId ); + + pPlayer->sendDebug("Calling: " + objName + "." + eventName); + + try + { + auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, Entity::Player& ) > >(eventName); + fn( obj, *pPlayer ); + } + catch( std::exception& e ) + { + g_log.info( e.what() ); + } + + } + } + + return true; +} + +bool Core::Scripting::ScriptManager::onZoneInit( ZonePtr pZone ) +{ + std::string eventName = "onZoneInit_" + pZone->getInternalName(); + + try + { + auto fn = m_pChaiHandler->eval< std::function< void( Zone& ) > >( eventName ); + fn( *pZone ); + } + catch( std::exception& e ) + { + g_log.info( e.what() ); + return false; + } + + return true; + +} + diff --git a/src/servers/Server_Zone/ScriptManager.h b/src/servers/Server_Zone/ScriptManager.h new file mode 100644 index 00000000..83673fc2 --- /dev/null +++ b/src/servers/Server_Zone/ScriptManager.h @@ -0,0 +1,65 @@ +#ifndef _SCRIPTMANAGER_H_ +#define _SCRIPTMANAGER_H_ + +#include +#include +#include + +#include +#include "Forwards.h" + + +namespace chaiscript +{ + class ChaiScript; +} + +namespace Core +{ + namespace Scripting + { + + class ScriptManager + { + private: + + boost::shared_ptr< chaiscript::ChaiScript > m_pChaiHandler; + + std::function< std::string( Entity::Player& ) > m_onFirstEnterWorld; + // auto fn = m_pChaiHandler->eval< std::function >( "onFirstEnterWorld" ); + + public: + ScriptManager(); + ~ScriptManager(); + + int init(); + void reload(); + + const boost::shared_ptr< chaiscript::ChaiScript >& getHandler() const; + + void onPlayerFirstEnterWorld( Entity::PlayerPtr pPlayer ); + + static bool registerBnpcTemplate( std::string templateName, uint32_t bnpcBaseId, uint32_t bnpcNameId, uint32_t modelId, std::string aiName ); + + bool onTalk( Entity::PlayerPtr pPlayer, uint64_t actorId, uint32_t eventId ); + bool onEnterTerritory( Entity::PlayerPtr pPlayer, uint32_t eventId, uint16_t param1, uint16_t param2 ); + bool onWithinRange( Entity::PlayerPtr pPlayer, uint32_t eventId, uint32_t param1, float x, float y, float z ); + bool onOutsideRange( Entity::PlayerPtr pPlayer, uint32_t eventId, uint32_t param1, float x, float y, float z ); + bool onEmote( Entity::PlayerPtr pPlayer, uint64_t actorId, uint32_t eventId, uint8_t emoteId ); + bool onEventItem( Entity::PlayerPtr pPlayer, uint32_t eventItemId, uint32_t eventId, uint32_t castTime, uint64_t targetId ); + + bool onMobKill( Entity::PlayerPtr pPlayer, uint16_t nameId ); + + bool onZoneInit( ZonePtr pZone ); + + bool onEventHandlerReturn( Entity::PlayerPtr pPlayer, uint32_t eventId, uint16_t subEvent, uint16_t param1, uint16_t param2, uint16_t param3 ); + bool onEventHandlerTradeReturn( Entity::PlayerPtr pPlayer, uint32_t eventId, uint16_t subEvent, uint16_t param, uint32_t catalogId ); + + + void loadDir( std::string dirname, std::set& chaiFiles ); + + + }; + } +} +#endif diff --git a/src/servers/Server_Zone/ScriptManagerInit.cpp b/src/servers/Server_Zone/ScriptManagerInit.cpp new file mode 100644 index 00000000..b3b0fcaa --- /dev/null +++ b/src/servers/Server_Zone/ScriptManagerInit.cpp @@ -0,0 +1,199 @@ +#include +#include + +#include +#include "ScriptManager.h" + +#include "Zone.h" +#include "Player.h" +#include "BattleNpc.h" +#include "Event.h" +#include "EventHelper.h" + +#include "ServerNoticePacket.h" + +#include +#include +#include +#include +#include + + +extern Core::Logger g_log; + +int Core::Scripting::ScriptManager::init() +{ + // ACTOR / PLAYER BINDINGS + ///////////////////////////////////////////////////////////////////////////////////////////// + m_pChaiHandler->add( chaiscript::fun( &Entity::Actor::getName ), "getName" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Actor::getId ), "getId" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Actor::getHp ), "getHp" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Actor::getMp ), "getMp" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Actor::getTp ), "getTp" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Actor::getLevel ), "getLevel" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Actor::getTargetId ), "getTargetId" ); + + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::forceZoneing ), "setZone" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getClassAsInt ), "getClass" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getRace ), "getRace" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getGender ), "getGender" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::isFirstLogin ), "isFirstLogin" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setFirstLogin ), "setFirstLogin" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::gainExp ), "gainExp" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::unlock ), "unlock" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::registerAetheryte ), "aetheryteRegister" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::learnAction ), "learnAction" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getHomepoint ), "getHomepoint" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setHomepoint ), "setHomepoint" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::teleport ), "teleport" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::prepareZoning ), "prepareZoning" ); + + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getCurrency ), "getCurrency" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::addCurrency ), "addCurrency" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::removeCurrency ), "removeCurrency" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getCrystal ), "getCrystals" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::addCrystal ), "addCrystals" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::removeCrystal ), "removeCrystals" ); + + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::updateQuest ), "questUpdate" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::finishQuest ), "questFinish" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::sendQuestMessage ), "questMessage" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestSeq ), "questGetSeq" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::hasQuest ), "hasQuest" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getZoneId ), "getZoneId" ); + + + m_pChaiHandler->add( chaiscript::fun( &Core::Event::mapEventActorToRealActor ), "mapActor" ); + + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8A ), "getQuestUI8A" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8B ), "getQuestUI8B" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8C ), "getQuestUI8C" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8D ), "getQuestUI8D" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8E ), "getQuestUI8E" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8F ), "getQuestUI8F" ); + + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8AH ), "getQuestUI8AH" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8BH ), "getQuestUI8BH" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8CH ), "getQuestUI8CH" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8DH ), "getQuestUI8DH" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8EH ), "getQuestUI8EH" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8FH ), "getQuestUI8FH" ); + + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8AL ), "getQuestUI8AL" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8BL ), "getQuestUI8BL" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8CL ), "getQuestUI8CL" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8DL ), "getQuestUI8DL" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8EL ), "getQuestUI8EL" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI8FL ), "getQuestUI8FL" ); + + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI16A ), "getQuestUI16A" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI16B ), "getQuestUI16B" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI16C ), "getQuestUI16C" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestUI32A ), "getQuestUI32A" ); + + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestBitFlag8 ), "getQuestBitFlag8" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestBitFlag16 ), "getQuestBitFlag16" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestBitFlag24 ), "getQuestBitFlag24" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestBitFlag32 ), "getQuestBitFlag32" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestBitFlag40 ), "getQuestBitFlag40" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestBitFlag48 ), "getQuestBitFlag48" ); + + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8A ), "setQuestUI8A" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8B ), "setQuestUI8B" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8C ), "setQuestUI8C" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8D ), "setQuestUI8D" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8E ), "setQuestUI8E" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8F ), "setQuestUI8F" ); + + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8AH ), "setQuestUI8AH" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8BH ), "setQuestUI8BH" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8CH ), "setQuestUI8CH" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8DH ), "setQuestUI8DH" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8EH ), "setQuestUI8EH" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8FH ), "setQuestUI8FH" ); + + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8AL ), "setQuestUI8AL" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8BL ), "setQuestUI8BL" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8CL ), "setQuestUI8CL" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8DL ), "setQuestUI8DL" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8EL ), "setQuestUI8EL" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI8FL ), "setQuestUI8FL" ); + + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI16A ), "setQuestUI16A" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI16B ), "setQuestUI16B" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI16C ), "setQuestUI16C" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestUI32A ), "setQuestUI32A" ); + + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestBitFlag8 ), "setQuestBitFlag8" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestBitFlag16 ), "setQuestBitFlag16" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestBitFlag24 ), "setQuestBitFlag24" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestBitFlag32 ), "setQuestBitFlag32" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestBitFlag40 ), "setQuestBitFlag40" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::setQuestBitFlag48 ), "setQuestBitFlag48" ); + + m_pChaiHandler->add(chaiscript::fun(&Entity::Player::giveQuestRewards), "giveQuestRewards"); + + m_pChaiHandler->add( chaiscript::fun< void, Entity::Player, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t >( &Entity::Player::eventPlay ), "eventPlay" ); + m_pChaiHandler->add( chaiscript::fun< void, Entity::Player, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, EventReturnCallback >( &Entity::Player::eventPlay ), "eventPlay" ); + m_pChaiHandler->add( chaiscript::fun< void, Entity::Player, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, EventReturnCallback >( &Entity::Player::eventPlay ), "eventPlay" ); + m_pChaiHandler->add( chaiscript::fun< void, Entity::Player, uint32_t, uint32_t, uint32_t, EventReturnCallback >( &Entity::Player::eventPlay ), "eventPlay" ); + m_pChaiHandler->add( chaiscript::fun< void, Entity::Player, uint32_t, uint32_t, uint32_t >( &Entity::Player::eventPlay ), "eventPlay" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::eventActionStart ), "eventActionStart" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::eventItemActionStart ), "eventItemActionStart" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::changePosition ), "changePos" ); + + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::tryAddItem ), "tryAddItem" ); + + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::isAetheryteRegistered ), "isAetheryteRegistered" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::isActionLearned ), "isActionLearned" ); + + m_pChaiHandler->add( chaiscript::base_class< Entity::Actor, Entity::Player >() ); + m_pChaiHandler->add( chaiscript::base_class< Entity::Actor, Entity::BattleNpc >() ); + m_pChaiHandler->add( chaiscript::user_type< Entity::Actor >(), "Actor" ); + m_pChaiHandler->add( chaiscript::user_type< Entity::Player >(), "Player" ); + m_pChaiHandler->add( chaiscript::user_type< Entity::BattleNpc >(), "BattleNpc" ); + + m_pChaiHandler->add( chaiscript::user_type< Zone >(), "Zone" ); + m_pChaiHandler->add( chaiscript::fun( &Zone::getName ), "getName" ); + + m_pChaiHandler->add( chaiscript::fun( ®isterBnpcTemplate ), "registerBnpcTemplate" ); + + // EVENT BINDINGS + ///////////////////////////////////////////////////////////////////////////////////////////// + + std::set< std::string > chaiFiles; + + g_log.info( "ScriptEngine: Loading Scripts..." ); + loadDir( "scripts/chai", chaiFiles ); + + uint16_t scriptCount = 0; + uint16_t errorCount = 0; + for( auto itr = chaiFiles.begin(); itr != chaiFiles.end(); ++itr ) + { + auto& fileName = *itr; + + try + { + m_pChaiHandler->eval_file( fileName ); + scriptCount++; + } + catch( std::exception& e ) + { + g_log.Log( LoggingSeverity::error, e.what() ); + errorCount++; + } + + } + + g_log.info( "\tloaded " + std::to_string( scriptCount ) + + " scripts, " + std::to_string( errorCount ) + " errors." ); + + std::function f = + m_pChaiHandler->eval< std::function >( "onFirstEnterWorld" ); + + m_onFirstEnterWorld = f; + + + return true; +} + diff --git a/src/servers/Server_Zone/ServerNoticePacket.h b/src/servers/Server_Zone/ServerNoticePacket.h new file mode 100644 index 00000000..6db52097 --- /dev/null +++ b/src/servers/Server_Zone/ServerNoticePacket.h @@ -0,0 +1,38 @@ +#ifndef _SERVERNOTICEPACKET_H +#define _SERVERNOTICEPACKET_H + +#include +#include +#include "Forwards.h" + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +/** +* @brief The Ping response packet. +*/ +class ServerNoticePacket : + public GamePacketNew +{ +public: + ServerNoticePacket( uint32_t playerId, const std::string& message ) : + GamePacketNew( playerId, playerId ) + { + initialize( message ); + }; + +private: + void initialize( const std::string& message ) + { + strcpy( m_data.message, message.c_str() ); + }; +}; + +} +} +} +} + +#endif /*_SERVERNOTICEPACKET_H*/ \ No newline at end of file diff --git a/src/servers/Server_Zone/ServerZone.cpp b/src/servers/Server_Zone/ServerZone.cpp new file mode 100644 index 00000000..45312f88 --- /dev/null +++ b/src/servers/Server_Zone/ServerZone.cpp @@ -0,0 +1,367 @@ +#include +#include +#include + +#include "ServerZone.h" + +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include "GameConnection.h" +#include "Session.h" + +#include "ZoneMgr.h" + +#include "GameCommandHandler.h" + +#include "ScriptManager.h" + +#include "Forwards.h" +#include +#include + + +Core::Logger g_log; +Core::Db::Database g_database; +Core::GameCommandHandler g_gameCommandMgr; +Core::Scripting::ScriptManager g_scriptMgr; +Core::Data::ExdData g_exdData; +Core::ZoneMgr g_zoneMgr; + + +Core::ServerZone::ServerZone( const std::string& configPath, uint16_t serverId ) + : m_serverId( serverId ) + , m_configPath( configPath ) +{ + m_pConfig = XMLConfigPtr( new XMLConfig ); +} + +Core::ServerZone::~ServerZone() +{ +} + +Core::XMLConfigPtr Core::ServerZone::getConfig() const +{ + return m_pConfig; +} + +bool Core::ServerZone::registerBnpcTemplate( std::string templateName, uint32_t bnpcBaseId, + uint32_t bnpcNameId, uint32_t modelId, std::string aiName ) +{ + + auto it = m_bnpcTemplates.find( templateName ); + + if( it != m_bnpcTemplates.end() ) + { + g_log.error( templateName + " already registered, skipping..." ); + return false; + } + + Entity::BattleNpcTemplatePtr pNpcTemplate( new Entity::BattleNpcTemplate( templateName, bnpcBaseId, bnpcNameId, modelId, aiName ) ); + m_bnpcTemplates[templateName] = pNpcTemplate; + + return true; +} + +Core::Entity::BattleNpcTemplatePtr Core::ServerZone::getBnpcTemplate( std::string templateName ) +{ + auto it = m_bnpcTemplates.find(templateName); + + if (it != m_bnpcTemplates.end()) + return nullptr; + + return it->second; +} + + +void Core::ServerZone::setServerId( uint16_t serverId ) +{ + m_serverId = serverId; +} + +bool Core::ServerZone::loadSettings( int argc, char* argv[] ) +{ + g_log.info( "Loading config " + m_configPath ); + + if( !m_pConfig->loadConfig( m_configPath ) ) + { + g_log.fatal( "Error loading config " + m_configPath ); + return false; + } + + std::vector args( argv + 1, argv + argc ); + for( auto i = 0; i + 1 < args.size(); i += 2 ) + { + std::string arg( "" ); + std::string val( "" ); + + try + { + arg = std::string( args[i] ); + val = std::string( args[i + 1] ); + + // trim '-' from start of arg + arg = arg.erase( 0, arg.find_first_not_of( '-' ) ); + + if( arg == "ip" ) + { + // todo: ip addr in config + m_pConfig->setValue< std::string >( "Settings.General.ListenIP", val ); + } + else if( arg == "p" || arg == "port" ) + { + m_pConfig->setValue< std::string >( "Settings.General.ListenPort", val ); + } + else if( arg == "exdPath" || arg == "dataPath" ) + { + m_pConfig->setValue< std::string >( "Settings.General.DataPath", val ); + } + else if( arg == "h" || arg == "dbhost" ) + { + m_pConfig->setValue< std::string >( "Settings.General.Mysql.Host", val ); + } + else if( arg == "dbport" ) + { + m_pConfig->setValue< std::string >( "Settings.General.Mysql.Port", val ); + } + else if( arg == "u" || arg == "user" || arg == "dbuser" ) + { + m_pConfig->setValue< std::string >( "Settings.General.Mysql.Username", val ); + } + else if( arg == "pass" || arg == "dbpass" ) + { + m_pConfig->setValue< std::string >( "Settings.General.Mysql.Pass", val ); + } + else if( arg == "d" || arg == "db" || arg == "database" ) + { + m_pConfig->setValue< std::string >( "Settings.General.Mysql.Database", val ); + } + } + catch( ... ) + { + g_log.error( "Error parsing argument: " + arg + " " + "value: " + val + "\n" ); + g_log.error( "Usage: \n" ); + } + } + + g_log.info( "Setting up EXD data" ); + if( !g_exdData.init( m_pConfig->getValue< std::string >( "Settings.General.DataPath", "" ) ) ) + { + g_log.fatal( "Error setting up EXD data " ); + return false; + } + + Db::DatabaseParams params; + params.bufferSize = 16384; + params.connectionCount = 3; + params.databaseName = m_pConfig->getValue< std::string >( "Settings.General.Mysql.Database", "sapphire" ); + params.hostname = m_pConfig->getValue< std::string >( "Settings.General.Mysql.Host", "127.0.0.1" ); + params.password = m_pConfig->getValue< std::string >( "Settings.General.Mysql.Pass", "" ); + params.port = m_pConfig->getValue< uint16_t >( "Settings.General.Mysql.Port", 3306 ); + params.username = m_pConfig->getValue< std::string >( "Settings.General.Mysql.Username", "root" ); + + if( !g_database.initialize( params ) ) + { + std::this_thread::sleep_for( std::chrono::milliseconds( 5000 ) ); + return false; + } + + m_serverId = m_serverId ? m_serverId : m_pConfig->getValue< uint16_t >( "Settings.General.ServerId" ); + m_port = m_pConfig->getValue< uint16_t >( "Settings.General.ListenPort" ); + m_ip = m_pConfig->getValue< std::string >( "Settings.General.ListenIp" );; + + g_log.info( "Server ID: " + std::to_string( m_serverId ) ); + + return true; +} + +void Core::ServerZone::run( int argc, char* argv[] ) +{ + // TODO: add more error checks for the entire initialisation + g_log.setLogPath( "SapphireZone_" + std::to_string( m_serverId ) + "_" ); + g_log.init(); + + g_log.info( "===========================================================" ); + g_log.info( "Sapphire Server Project " ); + g_log.info( "Version: x.y.z" ); + g_log.info( "Compiled: " __DATE__ " " __TIME__ ); + g_log.info( "===========================================================" ); + + if( !loadSettings( argc, argv ) ) + { + g_log.fatal( "Unable to load settings!" ); + return; + } + + g_exdData.loadZoneInfo(); + g_exdData.loadClassJobInfo(); + g_exdData.loadParamGrowInfo(); + g_exdData.loadEventActionInfo(); + g_exdData.loadActionInfo(); + g_exdData.loadStatusEffectInfo(); + g_exdData.loadAetheryteInfo(); + g_exdData.loadTribeInfo(); + + Network::HivePtr hive( new Network::Hive() ); + Network::addServerToHive< Network::GameConnection >( m_ip, m_port, hive ); + + g_scriptMgr.init(); + + g_log.info( "ZoneHandler: Setting up zones" ); + g_zoneMgr.createZones(); + + std::vector< std::thread > thread_list; + thread_list.push_back( std::thread( std::bind( &Network::Hive::Run, hive.get() ) ) ); + + g_log.info( "Server listening on port: " + std::to_string( m_port ) ); + g_log.info( "Ready for connections..." ); + + while( true ) + { + std::this_thread::sleep_for( std::chrono::milliseconds( 50 ) ); + + g_zoneMgr.updateZones(); + std::lock_guard lock( m_sessionMutex ); + for( auto sessionIt : m_sessionMap ) + { + auto session = sessionIt.second; + if( session && session->getPlayer() ) + { + // if the player is in a zone, let the zone handler take care of his updates + // else do it here. + if( !session->getPlayer()->getCurrentZone() ) + session->update(); + } + } + + uint32_t currTime = static_cast< uint32_t >( time( nullptr ) ); + auto it = m_sessionMap.begin(); + for( ; it != m_sessionMap.end(); ) + { + uint32_t diff = currTime - it->second->getLastDataTime(); + + auto pPlayer = it->second->getPlayer(); + + if( diff > 20 ) + { + g_log.info( "[" + std::to_string( it->second->getId() ) + "] Session time out" ); + it->second->close(); + // if( it->second.unique() ) + { + it = m_sessionMap.erase( it ); + } + } + else + { + ++it; + } + + } + + } + + // currently never reached, need a "stopServer" variable to break out of the above while loop + /*for( auto& thread_entry : thread_list ) + { + thread_entry.join(); + }*/ + +} + +bool Core::ServerZone::createSession( uint32_t sessionId ) +{ + std::lock_guard< std::mutex > lock( m_sessionMutex ); + + const std::string session_id_str = std::to_string( sessionId ); + + auto it = m_sessionMap.find( sessionId ); + + if( it != m_sessionMap.end() ) + { + g_log.error( "[" + session_id_str + "] Error creating session" ); + return false; + } + + g_log.info( "[" + session_id_str + "] Creating new session" ); + + boost::shared_ptr newSession( new Session( sessionId ) ); + m_sessionMap[sessionId] = newSession; + + if( !newSession->loadPlayer() ) + { + g_log.error( "[" + session_id_str + "] Error loading player " + session_id_str ); + return false; + } + + m_playerSessionMap[newSession->getPlayer()->getName()] = newSession; + + return true; + +} + +void Core::ServerZone::removeSession( uint32_t sessionId ) +{ + m_sessionMap.erase( sessionId ); +} + +void Core::ServerZone::updateSession( uint32_t id ) +{ + std::lock_guard< std::mutex > lock( m_sessionMutex ); + auto it = m_sessionMap.find( id ); + + if( it != m_sessionMap.end() ) + it->second->loadPlayer(); +} + +Core::SessionPtr Core::ServerZone::getSession( uint32_t id ) +{ + //std::lock_guard lock( m_sessionMutex ); + + auto it = m_sessionMap.find( id ); + + if( it != m_sessionMap.end() ) + return ( it->second ); + + return nullptr; +} + +Core::SessionPtr Core::ServerZone::getSession( std::string playerName ) +{ + //std::lock_guard lock( m_sessionMutex ); + + auto it = m_playerSessionMap.find( playerName ); + + if (it != m_playerSessionMap.end()) + return (it->second); + + return nullptr; +} + +void Core::ServerZone::removeSession( std::string playerName ) +{ + m_playerSessionMap.erase( playerName ); +} + +void Core::ServerZone::updateSession( std::string playerName ) +{ + std::lock_guard< std::mutex > lock( m_sessionMutex ); + auto it = m_playerSessionMap.find( playerName ); + + if( it != m_playerSessionMap.end() ) + it->second->loadPlayer(); +} + +uint16_t Core::ServerZone::getServerId() const +{ + return m_serverId; +} + + diff --git a/src/servers/Server_Zone/ServerZone.h b/src/servers/Server_Zone/ServerZone.h new file mode 100644 index 00000000..6b615838 --- /dev/null +++ b/src/servers/Server_Zone/ServerZone.h @@ -0,0 +1,69 @@ +#ifndef __GAMESERVER_H +#define __GAMESERVER_H + +#include + +#include +#include +#include + +#include "Forwards.h" +#include "BattleNpcTemplate.h" + +namespace Core { + + class ServerZone + { + public: + ServerZone( const std::string& configPath, uint16_t serverId = 0 ); + ~ServerZone(); + + void run( int argc, char* argv[] ); + + void setServerId( uint16_t serverId ); + uint16_t getServerId() const; + + bool createSession( uint32_t sessionId ); + void removeSession( uint32_t sessionId ); + void removeSession( std::string playerName ); + + bool loadSettings( int argc, char* argv[] ); + + SessionPtr getSession( uint32_t id ); + SessionPtr getSession( std::string playerName ); + void updateSession( uint32_t id ); + void updateSession( std::string playerName ); + + XMLConfigPtr getConfig() const; + + bool registerBnpcTemplate( std::string templateName, uint32_t bnpcBaseId, + uint32_t bnpcNameId, uint32_t modelId, std::string aiName ); + + Entity::BattleNpcTemplatePtr getBnpcTemplate( std::string templateName ); + + + private: + + uint16_t m_serverId; + uint16_t m_port; + std::string m_ip; + + std::string m_configPath; + + XMLConfigPtr m_pConfig; + + std::mutex m_sessionMutex; + + std::map< uint32_t, SessionPtr > m_sessionMap; + std::map< std::string, SessionPtr > m_playerSessionMap; + + std::map< uint32_t, uint32_t > m_zones; + + std::map< std::string, Entity::BattleNpcTemplatePtr > m_bnpcTemplates; + + }; + +} + +#endif + diff --git a/src/servers/Server_Zone/Session.cpp b/src/servers/Server_Zone/Session.cpp new file mode 100644 index 00000000..e67b5fc5 --- /dev/null +++ b/src/servers/Server_Zone/Session.cpp @@ -0,0 +1,93 @@ +#include + +#include +#include +#include "GameConnection.h" +#include "Session.h" + +#include "Player.h" + +Core::Session::Session( uint32_t sessionId ) + : m_sessionId( sessionId ) + , m_lastDataTime( static_cast< uint32_t >( time( nullptr ) ) ) +{ + + // boost::posix_time::ptime now = boost::date_time::not_a_date_time; + // now = boost::posix_time::microsec_clock::universal_time(); + +} + +Core::Session::~Session() +{ +} + +void Core::Session::setZoneConnection( Core::Network::GameConnectionPtr pZoneCon ) +{ + pZoneCon->m_conType = Network::ConnectionType::Zone; + m_pZoneConnection = pZoneCon; +} + +Core::Network::GameConnectionPtr Core::Session::getZoneConnection() const +{ + return m_pZoneConnection; +} + +bool Core::Session::loadPlayer() +{ + + m_pPlayer = Entity::PlayerPtr( new Entity::Player() ); + + if( !m_pPlayer->load( m_sessionId, shared_from_this() ) ) + return false; + + return true; + +} + +void Core::Session::close() +{ + if( m_pZoneConnection ) + m_pZoneConnection->Disconnect(); + + // remove the session from the player + if( m_pPlayer ) + // reset the zone, so the zone handler knows to remove the actor + m_pPlayer->setCurrentZone( nullptr ); +} + +uint32_t Core::Session::getId() const +{ + return m_sessionId; +} + +uint32_t Core::Session::getLastDataTime() const +{ + return m_lastDataTime; +} + +void Core::Session::updateLastDataTime() +{ + m_lastDataTime = static_cast< uint32_t >( time( nullptr ) ); +} + +void Core::Session::update() +{ + if( m_pZoneConnection ) + { + m_pZoneConnection->processInQueue(); + + // SESSION LOGIC + m_pPlayer->update( Util::getTimeMs() ); + + m_pPlayer->createUpdateSql(); + + m_pZoneConnection->processOutQueue(); + } + +} + +Core::Entity::PlayerPtr Core::Session::getPlayer() const +{ + return m_pPlayer; +} + diff --git a/src/servers/Server_Zone/Session.h b/src/servers/Server_Zone/Session.h new file mode 100644 index 00000000..f6b9eac8 --- /dev/null +++ b/src/servers/Server_Zone/Session.h @@ -0,0 +1,51 @@ +#ifndef _SESSION_H_ +#define _SESSION_H_ +#include +#include + +#include "Forwards.h" + + + +namespace Core { + + + class Session : public boost::enable_shared_from_this< Session > + { + public: + Session( uint32_t sessionId ); + ~Session(); + + void setZoneConnection( Network::GameConnectionPtr zoneCon ); + + Network::GameConnectionPtr getZoneConnection() const; + + uint32_t getLastDataTime() const; + + void updateLastDataTime(); + + void close(); + + uint32_t getId() const; + + bool loadPlayer(); + + void update(); + + Entity::PlayerPtr getPlayer() const; + + private: + uint32_t m_sessionId; + + Entity::PlayerPtr m_pPlayer; + + uint32_t m_lastDataTime; + + Network::GameConnectionPtr m_pZoneConnection; + + }; + +} + +#endif + diff --git a/src/servers/Server_Zone/StatusEffect.cpp b/src/servers/Server_Zone/StatusEffect.cpp new file mode 100644 index 00000000..33576896 --- /dev/null +++ b/src/servers/Server_Zone/StatusEffect.cpp @@ -0,0 +1,129 @@ +#include +#include +#include +#include +#include + +#include +#include + +#include "Actor.h" + +#include "StatusEffect.h" + +extern Core::Logger g_log; +extern Core::Data::ExdData g_exdData; + +using namespace Core::Common; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +Core::StatusEffect::StatusEffect::StatusEffect( uint32_t id, Entity::ActorPtr sourceActor, Entity::ActorPtr targetActor, + uint32_t duration, uint32_t tickRate ) + : m_id( id ) + , m_sourceActor( sourceActor ) + , m_targetActor( targetActor ) + , m_duration( duration ) + , m_startTime( 0 ) + , m_tickRate( tickRate ) + , m_lastTick( 0 ) +{ + auto& entry = g_exdData.m_statusEffectInfoMap[id]; + m_name = entry.name; + + std::replace( m_name.begin(), m_name.end(), ' ', '_' ); + std::replace( m_name.begin(), m_name.end(), ':', '_' ); + std::replace( m_name.begin(), m_name.end(), '&', '_' ); + std::replace( m_name.begin(), m_name.end(), '+', 'p' ); + boost::erase_all( m_name, "\'" ); + boost::erase_all( m_name, "&" ); + boost::erase_all( m_name, "-" ); + boost::erase_all( m_name, "(" ); + boost::erase_all( m_name, ")" ); +} + + +Core::StatusEffect::StatusEffect::~StatusEffect() +{ +} + + +void Core::StatusEffect::StatusEffect::onTick() +{ + m_lastTick = Util::getTimeMs(); +} + +uint32_t Core::StatusEffect::StatusEffect::getSrcActorId() const +{ + return m_sourceActor->getId(); +} + +uint32_t Core::StatusEffect::StatusEffect::getTargetActorId() const +{ + return m_targetActor->getId(); +} + +void Core::StatusEffect::StatusEffect::applyStatus() +{ + m_startTime = Util::getTimeMs(); + + // this is only right when an action is being used by the player + // else you probably need to use an actorcontrol + + //GamePacketNew< FFXIVIpcEffect > effectPacket( m_sourceActor->getId() ); + //effectPacket.data().targetId = m_sourceActor->getId(); + //effectPacket.data().actionAnimationId = 3; + //effectPacket.data().unknown_3 = 1; + //effectPacket.data().actionTextId = 3; + //effectPacket.data().unknown_5 = 1; + //effectPacket.data().unknown_6 = 321; + //effectPacket.data().rotation = ( uint16_t ) ( 0x8000 * ( ( m_sourceActor->getPos().getR() + 3.1415926 ) ) / 3.1415926 ); + //effectPacket.data().effectTargetId = m_sourceActor->getId(); + //effectPacket.data().effects[4].unknown_1 = 17; + //effectPacket.data().effects[4].bonusPercent = 30; + //effectPacket.data().effects[4].param1 = m_id; + //effectPacket.data().effects[4].unknown_5 = 0x80; + //m_sourceActor->sendToInRangeSet( effectPacket, true ); + + g_log.debug( "StatusEffect applied: " + m_name ); +} + +void Core::StatusEffect::StatusEffect::removeStatus() +{ + g_log.debug( "StatusEffect removed: " + m_name ); +} + +uint32_t Core::StatusEffect::StatusEffect::getId() const +{ + return m_id; +} + +uint32_t Core::StatusEffect::StatusEffect::getDuration() const +{ + return m_duration; +} + +uint32_t Core::StatusEffect::StatusEffect::getTickRate() const +{ + return m_tickRate; +} + +uint64_t Core::StatusEffect::StatusEffect::getLastTickMs() const +{ + return m_lastTick; +} + +uint64_t Core::StatusEffect::StatusEffect::getStartTimeMs() const +{ + return m_startTime; +} + +void Core::StatusEffect::StatusEffect::setLastTick( uint64_t lastTick ) +{ + m_lastTick = lastTick; +} + +const std::string& Core::StatusEffect::StatusEffect::getName() const +{ + return m_name; +} diff --git a/src/servers/Server_Zone/StatusEffect.h b/src/servers/Server_Zone/StatusEffect.h new file mode 100644 index 00000000..7b9d88f7 --- /dev/null +++ b/src/servers/Server_Zone/StatusEffect.h @@ -0,0 +1,51 @@ +#ifndef _STATUSEFFECT_H_ +#define _STATUSEFFECT_H_ + +#include + +#include "Forwards.h" + +namespace Core +{ +namespace StatusEffect +{ + + +class StatusEffect +{ +public: + StatusEffect( uint32_t id, Entity::ActorPtr sourceActor, Entity::ActorPtr targetActor, + uint32_t duration, uint32_t tickRate ); + + ~StatusEffect(); + + void onTick(); + void applyStatus(); + void removeStatus(); + + uint32_t getId() const; + uint32_t getDuration() const; + uint32_t getTickRate() const; + uint32_t getSrcActorId() const; + uint32_t getTargetActorId() const; + uint64_t getLastTickMs() const; + uint64_t getStartTimeMs() const; + void setLastTick( uint64_t lastTick ); + const std::string& getName() const; + +private: + uint32_t m_id; + Entity::ActorPtr m_sourceActor; + Entity::ActorPtr m_targetActor; + uint32_t m_duration; + uint64_t m_startTime; + uint32_t m_tickRate; + uint64_t m_lastTick; + std::string m_name; + +}; + +} +} + +#endif diff --git a/src/servers/Server_Zone/StatusEffectContainer.cpp b/src/servers/Server_Zone/StatusEffectContainer.cpp new file mode 100644 index 00000000..25799233 --- /dev/null +++ b/src/servers/Server_Zone/StatusEffectContainer.cpp @@ -0,0 +1,151 @@ +#include +#include + +#include "Actor.h" +#include "StatusEffect.h" +#include "StatusEffectContainer.h" +#include "ActorControlPacket142.h" +#include "ActorControlPacket143.h" + + +using namespace Core::Common; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +Core::StatusEffect::StatusEffectContainer::StatusEffectContainer( Entity::ActorPtr pOwner ) + : m_pOwner( pOwner ) +{ + // initialize the free slot queue + for( uint8_t i = 0; i < MAX_EFFECTS; i++ ) + { + m_freeEffectSlotQueue.push( i ); + } +} + +int8_t Core::StatusEffect::StatusEffectContainer::getFreeSlot() +{ + int8_t freeEffectSlot = -1; + + if( m_freeEffectSlotQueue.empty() ) + return freeEffectSlot; + + freeEffectSlot = m_freeEffectSlotQueue.front(); + m_freeEffectSlotQueue.pop(); + + return freeEffectSlot; +} + +void Core::StatusEffect::StatusEffectContainer::freeSlot( uint8_t slotId ) +{ + m_freeEffectSlotQueue.push( slotId ); +} + + +Core::StatusEffect::StatusEffectContainer::~StatusEffectContainer() +{ +} + + +void Core::StatusEffect::StatusEffectContainer::addStatusEffect( StatusEffectPtr pEffect ) +{ + uint8_t nextSlot = getFreeSlot(); + // if there is no slot left, do not add the effect + if( nextSlot == -1 ) + return; + + pEffect->applyStatus(); + m_effectMap[nextSlot] = pEffect; + + GamePacketNew< Server::FFXIVIpcAddStatusEffect > statusEffectAdd( m_pOwner->getId() ); + statusEffectAdd.data().actor_id = m_pOwner->getId(); + statusEffectAdd.data().actor_id1 = m_pOwner->getId(); + statusEffectAdd.data().current_hp = m_pOwner->getHp(); + statusEffectAdd.data().current_mp = m_pOwner->getMp(); + statusEffectAdd.data().current_tp = m_pOwner->getTp(); + statusEffectAdd.data().duration = static_cast< float >( pEffect->getDuration() ) / 1000; + statusEffectAdd.data().effect_id = pEffect->getId(); + statusEffectAdd.data().effect_index = nextSlot; + statusEffectAdd.data().max_hp = m_pOwner->getMaxHp(); + statusEffectAdd.data().max_mp = m_pOwner->getMaxMp(); + statusEffectAdd.data().max_something = 1; + + bool sendToSelf = m_pOwner->isPlayer() ? true : false; + m_pOwner->sendToInRangeSet( statusEffectAdd, sendToSelf ); + +} + +void Core::StatusEffect::StatusEffectContainer::removeStatusEffect( uint8_t effectSlotId ) +{ + auto pEffectIt = m_effectMap.find( effectSlotId ); + if( pEffectIt == m_effectMap.end() ) + return; + + freeSlot( effectSlotId ); + + auto pEffect = pEffectIt->second; + pEffect->removeStatus(); + + bool sendToSelf = m_pOwner->isPlayer() ? true : false; + m_pOwner->sendToInRangeSet( ActorControlPacket142( m_pOwner->getId(), StatusEffectLose, pEffect->getId() ), sendToSelf ); + + m_effectMap.erase( effectSlotId ); + + sendUpdate(); +} + +void Core::StatusEffect::StatusEffectContainer::sendUpdate() +{ + uint64_t currentTimeMs = Util::getTimeMs(); + + GamePacketNew< Server::FFXIVIpcStatusEffectList > statusEffectList( m_pOwner->getId() ); + + statusEffectList.data().current_hp = m_pOwner->getHp(); + statusEffectList.data().current_mp = m_pOwner->getMp(); + statusEffectList.data().currentTp = m_pOwner->getTp(); + statusEffectList.data().max_hp = m_pOwner->getMaxHp(); + statusEffectList.data().max_mp = m_pOwner->getMaxMp(); + uint8_t slot = 0; + for( auto effectIt : m_effectMap ) + { + float timeLeft = static_cast< float >( effectIt.second->getDuration() - ( currentTimeMs - effectIt.second->getStartTimeMs() ) ) / 1000; + statusEffectList.data().effect[slot].duration = timeLeft; + statusEffectList.data().effect[slot].effect_id = effectIt.second->getId(); + statusEffectList.data().effect[slot].sourceActorId = effectIt.second->getSrcActorId(); + slot++; + } + + bool sendToSelf = m_pOwner->isPlayer() ? true : false; + m_pOwner->sendToInRangeSet( statusEffectList, sendToSelf ); + +} + +void Core::StatusEffect::StatusEffectContainer::update() +{ + uint64_t currentTimeMs = Util::getTimeMs(); + + for( auto effectIt : m_effectMap ) + { + uint8_t effectIndex = effectIt.first; + auto effect = effectIt.second; + + uint64_t lastTick = effect->getLastTickMs(); + uint64_t startTime = effect->getStartTimeMs(); + uint32_t duration = effect->getDuration(); + uint32_t tickRate = effect->getTickRate(); + + if( ( currentTimeMs - startTime ) > duration ) + { + // remove status effect + removeStatusEffect( effectIndex ); + // break because removing invalidates iterators + break; + } + + if( ( currentTimeMs - lastTick ) > tickRate ) + { + effect->setLastTick( currentTimeMs ); + effect->onTick(); + } + + } +} diff --git a/src/servers/Server_Zone/StatusEffectContainer.h b/src/servers/Server_Zone/StatusEffectContainer.h new file mode 100644 index 00000000..5dd20550 --- /dev/null +++ b/src/servers/Server_Zone/StatusEffectContainer.h @@ -0,0 +1,44 @@ +#ifndef _STATUSEFFECTCONTAINER_H_ +#define _STATUSEFFECTCONTAINER_H_ + +#include + +#include +#include + +#include "Forwards.h" + +namespace Core +{ +namespace StatusEffect +{ + +class StatusEffectContainer +{ +public: + StatusEffectContainer( Entity::ActorPtr pOwner ); + ~StatusEffectContainer(); + + void addStatusEffect( StatusEffectPtr pEffect ); + void removeStatusEffect( uint8_t effectSlotId ); + void update(); + + int8_t getFreeSlot(); + void freeSlot( uint8_t slotId ); + + void sendUpdate(); + + +private: + const uint8_t MAX_EFFECTS = 30; + + Entity::ActorPtr m_pOwner; + std::queue< uint8_t > m_freeEffectSlotQueue; + + std::vector< StatusEffectPtr > m_effectList; + std::map< uint8_t, StatusEffectPtr > m_effectMap; +}; + +} +} +#endif diff --git a/src/servers/Server_Zone/UpdateHpMpTpPacket.h b/src/servers/Server_Zone/UpdateHpMpTpPacket.h new file mode 100644 index 00000000..745dbccc --- /dev/null +++ b/src/servers/Server_Zone/UpdateHpMpTpPacket.h @@ -0,0 +1,39 @@ +#ifndef _UPDATEHPMPTP_H +#define _UPDATEHPMPTP_H + +#include +#include "Forwards.h" + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +/** +* @brief The Ping response packet. +*/ +class UpdateHpMpTpPacket : + public GamePacketNew< FFXIVIpcUpdateHpMpTp > +{ +public: + UpdateHpMpTpPacket( Entity::ActorPtr pActor ) : + GamePacketNew< FFXIVIpcUpdateHpMpTp >( pActor->getId(), pActor->getId() ) + { + initialize( pActor ); + }; + +private: + void initialize( Entity::ActorPtr pActor ) + { + m_data.hp = pActor->getHp(); + m_data.mp = pActor->getMp(); + m_data.tp = pActor->getTp(); + }; +}; + +} +} +} +} + +#endif /*_UPDATEHPMPTP_H*/ \ No newline at end of file diff --git a/src/servers/Server_Zone/Zone.cpp b/src/servers/Server_Zone/Zone.cpp new file mode 100644 index 00000000..0b670779 --- /dev/null +++ b/src/servers/Server_Zone/Zone.cpp @@ -0,0 +1,800 @@ +#include +#include + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Session.h" + +#include "Actor.h" +#include "Player.h" +#include "BattleNpc.h" +#include "Forwards.h" + +#include "GameConnection.h" + +#include "Zone.h" +#include "ZoneMgr.h" +#include "ServerZone.h" +#include "ScriptManager.h" + +#include "CellHandler.h" + +#include + +extern Core::Logger g_log; +extern Core::Db::Database g_database; +extern Core::ServerZone g_serverZone; +extern Core::Data::ExdData g_exdData; +extern Core::Scripting::ScriptManager g_scriptMgr; + +namespace Core { + +/** +* \brief +*/ +Zone::Zone() + : m_zoneId( 0 ) + , m_layoutId( 0 ) + , m_bPrivate( false ) + , m_type( Common::RegionType::normal ) + , m_currentWeather( static_cast( Common::Weather::Fair ) ) + , m_weatherOverride( 0 ) + , m_lastMobUpdate( 0 ) +{ +} + +Zone::Zone( uint16_t zoneId, uint32_t layoutId, std::string name, std::string interName, bool bPrivate = false ) + : m_type( Common::RegionType::normal ) + , m_currentWeather( static_cast( Common::Weather::Fair ) ) +{ + m_layoutId = layoutId; + + m_zoneId = zoneId; + m_zoneCode = name; + m_zoneName = interName; + m_bPrivate = bPrivate; + m_lastMobUpdate = 0; + + m_currentWeather = getNextWeather(); + m_weatherOverride = 0; +} + +Zone::~Zone() +{ +} + +bool Zone::init() +{ + memset( m_pCellCache, 0, sizeof( CellCache* ) * _sizeX ); + + if( g_scriptMgr.onZoneInit( shared_from_this() ) ) + { + // all good + } + + loadCellCache(); + + return true; +} + +bool Zone::isPrivateZone() const +{ + return m_bPrivate; +} + +void Zone::setWeatherOverride( uint8_t weather ) +{ + m_weatherOverride = weather; +} + +uint8_t Zone::getCurrentWeather() const +{ + return m_currentWeather; +} + +CellCache* Zone::getCellCacheList( uint32_t cellx, uint32_t celly ) +{ + assert( cellx < _sizeX ); + assert( celly < _sizeY ); + if( m_pCellCache[cellx] == nullptr ) + return nullptr; + + return m_pCellCache[cellx][celly]; +} + +CellCache* Zone::getCellCacheAndCreate( uint32_t cellx, uint32_t celly ) +{ + assert( cellx < _sizeX ); + assert( celly < _sizeY ); + if( m_pCellCache[cellx] == nullptr ) + { + m_pCellCache[cellx] = new CellCache*[_sizeY]; + memset(m_pCellCache[cellx], 0, sizeof( CellCache* ) * _sizeY); + } + + if( m_pCellCache[cellx][celly] == nullptr ) + { + //m_pCellCache[cellx][celly] = new CellCache; + } + + return m_pCellCache[cellx][celly]; +} + +void Zone::loadCellCache() +{ + auto pQR = g_database.query( "SELECT Id," + "Zoneid," + "NameId," + "SizeId," + "ClassJob," + "DisplayFlags1," + "DisplayFlags2," + "Level," + "Pos_0_0," + "Pos_0_1," + "Pos_0_2," + "Rotation," + "MobType," + "Behaviour," + "ModelMainWeapon," + "ModelSubWeapon," + "ModelId," + "Look," + "Models," + "type " + "FROM battlenpc WHERE ZoneId = " + std::to_string( getId() ) + ";" ); + + if( !pQR ) + return; + + std::vector< Entity::BattleNpcPtr > cache; + + do + { + Db::Field *field = pQR->fetch(); + uint32_t id = field[0].getUInt32(); + uint32_t targetZoneId = field[1].getUInt32(); + uint32_t nameId = field[2].getUInt32(); + uint32_t sizeId = field[3].getUInt32(); + uint32_t classJob = field[4].getUInt32(); + uint32_t displayFlags1 = field[5].getUInt32(); + uint32_t displayFlags2 = field[6].getUInt32(); + uint32_t level = field[7].getUInt32(); + float posX = field[8].getFloat(); + float posY = field[9].getFloat(); + float posZ = field[10].getFloat(); + uint32_t rotation = field[11].getUInt32(); + uint32_t mobType = field[12].getUInt32(); + uint32_t behaviour = field[13].getUInt32(); + uint64_t modelMainWeapon = field[14].getUInt32(); + uint64_t modelSubWeapon = field[15].getUInt32(); + uint32_t modelId = field[16].getUInt32(); + uint32_t type = field[17].getUInt32(); + + + Common::FFXIVARR_POSITION3 pos; + pos.x = posX; + pos.y = posY; + pos.z = posZ; + Entity::BattleNpcPtr pBNpc( new Entity::BattleNpc( modelId, nameId, + pos, + sizeId, type, level, behaviour, mobType ) ); + pBNpc->setRotation( rotation ); + cache.push_back( pBNpc ); + + //pushActor( pBNpc ); + + //m_zonePositionMap[id] = ZonePositionPtr( new ZonePosition( id, targetZoneId, Position( posX, posY, posZ, posO ), radius ) ); + + } while( pQR->nextRow() ); + + + + for( auto entry : cache ) + { + // get cell position + uint32_t cellX = CellHandler::getPosX( entry->getPos().x ); + uint32_t cellY = CellHandler::getPosY( entry->getPos().z ); + + // find the right cell, create it if not existing yet + if( m_pCellCache[cellX] == nullptr ) + { + m_pCellCache[cellX] = new CellCache*[_sizeY]; + memset( m_pCellCache[cellX], 0, sizeof( CellCache* ) * _sizeY ); + } + + if( !m_pCellCache[cellX][cellY] ) + m_pCellCache[cellX][cellY] = new CellCache; + + // add the populace cache object to the cells list + m_pCellCache[cellX][cellY]->battleNpcCache.push_back( entry ); + } + +} + +uint8_t Zone::getNextWeather() +{ + auto zoneInfo = g_exdData.m_zoneInfoMap[ getLayoutId() ]; + + uint32_t unix = static_cast< uint32_t >( time( nullptr ) ); + // Get Eorzea hour for weather start + uint32_t bell = unix / 175; + // Do the magic 'cause for calculations 16:00 is 0, 00:00 is 8 and 08:00 is 16 + int32_t increment = ( ( bell + 8 - ( bell % 8 ) ) ) % 24; + + // Take Eorzea days since unix epoch + uint32_t totalDays = ( unix / 4200 ); + + uint32_t calcBase = ( totalDays * 0x64 ) + increment; + + uint32_t step1 = ( calcBase << 0xB ) ^ calcBase; + uint32_t step2 = ( step1 >> 8 ) ^ step1; + + uint8_t rate = static_cast< uint8_t >(step2 % 0x64); + + for( auto entry : zoneInfo.weather_rate_map ) + { + uint8_t sRate = entry.first; + int32_t weatherId = entry.second; + + if( rate <= sRate ) + return weatherId; + } + + return 1; +} + +void Zone::pushActor( Entity::ActorPtr pActor ) +{ + float mx = pActor->getPos().x; + float my = pActor->getPos().z; + uint32_t cx = getPosX( mx ); + uint32_t cy = getPosY( my ); + + Cell* pCell = getCell( cx, cy ); + if( !pCell ) + { + pCell = create( cx, cy ); + pCell->init( cx, cy, shared_from_this() ); + } + + pCell->addActor( pActor ); + + pActor->setCell( pCell ); + + uint32_t cellX = getPosX( pActor->getPos().x ); + uint32_t cellY = getPosY( pActor->getPos().z ); + + uint32_t endX = cellX <= _sizeX ? cellX + 1 : ( _sizeX - 1 ); + uint32_t endY = cellY <= _sizeY ? cellY + 1 : ( _sizeY - 1 ); + uint32_t startX = cellX > 0 ? cellX - 1 : 0; + uint32_t startY = cellY > 0 ? cellY - 1 : 0; + uint32_t posX, posY; + + for( posX = startX; posX <= endX; ++posX ) + { + for( posY = startY; posY <= endY; ++posY ) + { + pCell = getCell( posX, posY ); + if( pCell ) + updateInRangeSet( pActor, pCell ); + } + } + + if( pActor->isPlayer() ) + { + g_log.debug( "[Zone:" + m_zoneCode + "] Adding player [" + std::to_string( pActor->getId() ) + "]" ); + auto pPlayer = pActor->getAsPlayer(); + + // fire the onEnter Lua event + //LuaManager->onRegionEnter(this, pPlayer); + + auto pSession = g_serverZone.getSession( pPlayer->getId() ); + if( pSession ) + m_sessionSet.insert( pSession ); + m_playerMap[pPlayer->getId()] = pPlayer; + updateCellActivity( cx, cy, 2 ); + + } + else if( pActor->isMob() ) + { + + Entity::BattleNpcPtr pBNpc = pActor->getAsBattleNpc(); + m_BattleNpcMap[pBNpc->getId()] = pBNpc; + pBNpc->setPosition( pBNpc->getPos() ); + + } + +} + +void Zone::removeActor( Entity::ActorPtr pActor ) +{ + + + if( pActor->m_pCell ) + { + pActor->m_pCell->removeActor( pActor ); + pActor->m_pCell = nullptr; + } + + if( pActor->isPlayer() ) + { + + g_log.debug( "[Zone:" + m_zoneCode + "] Removing player [" + std::to_string( pActor->getId() ) + "]" ); + // If it's a player and he's inside boundaries - update his nearby cells + if( pActor->getPos().x <= _maxX && pActor->getPos().x >= _minX && + pActor->getPos().z <= _maxY && pActor->getPos().z >= _minY ) + { + uint32_t x = getPosX( pActor->getPos().x ); + uint32_t y = getPosY( pActor->getPos().z ); + updateCellActivity( x, y, 3 ); + } + m_playerMap.erase( pActor->getId() ); + + } + else if( pActor->isMob() ) + m_BattleNpcMap.erase( pActor->getId() ); + + // remove from lists of other actors + if( pActor->hasInRangeActor() ) + { + Entity::ActorPtr pCurAct; + + for( auto iter = pActor->m_inRangeActors.begin(); iter != pActor->m_inRangeActors.end();) + { + pCurAct = *iter; + auto iter2 = iter++; + pCurAct->removeInRangeActor( pActor ); + } + } + pActor->clearInRangeSet(); + +} + +void Zone::queueOutPacketForRange( Entity::PlayerPtr pSourcePlayer, uint32_t range, Network::Packets::GamePacketPtr pPacketEntry ) +{ + for( auto it = m_playerMap.begin(); it != m_playerMap.end(); ++it ) + { + float distance = Math::Util::distance( pSourcePlayer->getPos().x, + pSourcePlayer->getPos().y, + pSourcePlayer->getPos().z, + ( *it ).second->getPos().x, + ( *it ).second->getPos().y, + ( *it ).second->getPos().z ); + + if( ( distance < range ) && pSourcePlayer->getId() != ( *it ).second->getId() ) + { + auto pSession = g_serverZone.getSession( ( *it ).second->getId() ); + pPacketEntry->setValAt( 0x08, ( *it ).second->getId() ); + if( pSession ) + pSession->getZoneConnection()->queueOutPacket( pPacketEntry ); + } + } +} + +uint32_t Zone::getId() +{ + return m_zoneId; +} + +Common::RegionType Zone::getType() const +{ + return m_type; +} + +uint16_t Zone::getLayoutId() const +{ + return m_layoutId; +} + +bool Zone::isInstance() const +{ + return m_type == Common::RegionType::instance; +} + +const std::string& Zone::getName() const +{ + return m_zoneName; +} + +const std::string& Zone::getInternalName() const +{ + return m_zoneCode; +} + +std::size_t Zone::getPopCount() const +{ + return m_playerMap.size(); +} + +bool Zone::checkWeather() +{ + if ( m_weatherOverride != 0 ) + { + if ( m_weatherOverride != m_currentWeather ) + { + m_currentWeather = m_weatherOverride; + g_log.debug( "[Zone:" + m_zoneCode + "] overriding weather to : " + std::to_string( m_weatherOverride ) ); + return true; + } + } + else + { + auto nextWeather = getNextWeather(); + if ( nextWeather != m_currentWeather ) + { + m_currentWeather = nextWeather; + g_log.debug( "[Zone:" + m_zoneCode + "] changing weather to : " + std::to_string( nextWeather ) ); + return true; + } + } + return false; +} + +void Zone::updateBnpcs( int64_t tickCount ) +{ + if( ( tickCount - m_lastMobUpdate ) > 250 ) + { + + m_lastMobUpdate = tickCount; + uint32_t currTime = static_cast< uint32_t >( time( nullptr ) ); + + for( auto it3 = m_BattleNpcDeadMap.begin(); it3 != m_BattleNpcDeadMap.end(); ++it3 ) + { + + Entity::BattleNpcPtr pBNpc = *it3; + + if( ( currTime - pBNpc->getTimeOfDeath() ) > 60 ) + { + + pBNpc->resetHp(); + pBNpc->resetMp(); + pBNpc->resetPos(); + pushActor( pBNpc ); + + m_BattleNpcDeadMap.erase( it3 ); + + break; + } + } + + + for( auto entry : m_BattleNpcMap ) + { + Entity::BattleNpcPtr pBNpc = entry.second; + + if( !pBNpc ) + continue; + + if( !pBNpc->isAlive() && currTime - pBNpc->getTimeOfDeath() > ( 10 ) ) + { + removeActor( pBNpc ); + m_BattleNpcDeadMap.insert( pBNpc ); + break; + } + + pBNpc->update( tickCount ); + + } + } +} + +bool Zone::runZoneLogic() +{ + int64_t tickCount = Util::getTimeMs(); + + bool changedWeather = checkWeather(); + + auto it = m_sessionSet.begin(); + + // update sessions in this zone + for( ; it != m_sessionSet.end(); ) + { + + auto pSession = ( *it ); + + if( !pSession ) + { + it = m_sessionSet.erase( it ); + continue; + } + + // this session is not linked to this area anymore, remove it from zone session list + if( ( !pSession->getPlayer()->getCurrentZone() ) || ( pSession->getPlayer()->getCurrentZone() != shared_from_this() ) ) + { + g_log.debug( "[Zone:" + m_zoneCode + "] removing session " + std::to_string( pSession->getId() ) ); + + if( pSession->getPlayer()->getCell() ) + removeActor( pSession->getPlayer() ); + + it = m_sessionSet.erase( it ); + continue; + } + + if( changedWeather ) + { + Network::Packets::GamePacketNew< Network::Packets::Server::FFXIVIpcWeatherChange > weatherChangePacket( pSession->getPlayer()->getId() ); + weatherChangePacket.data().weatherId = m_currentWeather; + weatherChangePacket.data().delay = 5.0f; + pSession->getPlayer()->queuePacket( weatherChangePacket ); + } + + // perform session duties + pSession->update(); + ++it; + } + + updateBnpcs( tickCount ); + + return true; +} + +bool Zone::isCellActive( uint32_t x, uint32_t y ) +{ + uint32_t endX = ( ( x + 1 ) <= _sizeX ) ? x + 1 : ( _sizeX - 1 ); + uint32_t endY = ( ( y + 1 ) <= _sizeY ) ? y + 1 : ( _sizeY - 1 ); + uint32_t startX = x > 0 ? x - 1 : 0; + uint32_t startY = y > 0 ? y - 1 : 0; + uint32_t posX; + uint32_t posY; + + Cell* pCell; + + for( posX = startX; posX <= endX; posX++ ) + { + for( posY = startY; posY <= endY; posY++ ) + { + pCell = getCell( posX, posY ); + + if( pCell && ( pCell->hasPlayers() || pCell->isForcedActive() ) ) + return true; + } + } + + return false; +} + +void Zone::updateCellActivity( uint32_t x, uint32_t y, int radius ) +{ + + uint32_t endX = ( x + radius ) <= _sizeX ? x + radius : ( _sizeX - 1 ); + uint32_t endY = ( y + radius ) <= _sizeY ? y + radius : ( _sizeY - 1 ); + uint32_t startX = x - radius > 0 ? x - radius : 0; + uint32_t startY = y - radius > 0 ? y - radius : 0; + uint32_t posX, posY; + + Cell* pCell; + + for( posX = startX; posX <= endX; posX++ ) + { + for( posY = startY; posY <= endY; posY++ ) + { + pCell = getCell( posX, posY ); + + if( !pCell ) + { + if( isCellActive( posX, posY ) ) + { + pCell = create( posX, posY ); + pCell->init( posX, posY, shared_from_this() ); + + pCell->setActivity( true ); + + assert( !pCell->isLoaded() ); + + CellCache * pCC = getCellCacheAndCreate( posX, posY ); + if( pCC ) + pCell->loadActors( pCC ); + } + } + else + { + //Cell is now active + if( isCellActive( posX, posY ) && !pCell->isActive() ) + { + pCell->setActivity( true ); + + if( !pCell->isLoaded() ) + { + CellCache * pCC = getCellCacheAndCreate( posX, posY ); + if( pCC ) + pCell->loadActors( pCC ); + } + } + else if( !isCellActive( posX, posY ) && pCell->isActive() ) + pCell->setActivity( false ); + } + } + } +} + +void Zone::changeActorPosition( Entity::ActorPtr pActor ) +{ + + if( pActor->getCurrentZone() != shared_from_this() ) + return; + + if( pActor->hasInRangeActor() ) + { + Entity::ActorPtr pCurAct; + + float fRange = 70.0f; + for( auto iter = pActor->m_inRangeActors.begin(); iter != pActor->m_inRangeActors.end();) + { + pCurAct = *iter; + auto iter2 = iter++; + + float distance = Math::Util::distance( pCurAct->getPos().x, + pCurAct->getPos().y, + pCurAct->getPos().z, + pActor->getPos().x, + pActor->getPos().y, + pActor->getPos().z ); + + if( fRange > 0.0f && distance > fRange ) + { + pCurAct->removeInRangeActor( pActor ); + + if( pActor->getCurrentZone() != shared_from_this() ) + return; + + pActor->removeInRangeActor( *iter2 ); + + // @TODO FIXME! + // this break is more or less a hack, iteration will break otherwise after removing + break; + } + } + } + + uint32_t cellX = getPosX( pActor->getPos().x ); + uint32_t cellY = getPosY( pActor->getPos().z ); + + if( cellX >= _sizeX || cellY >= _sizeY ) + { + return; + } + + Cell* pCell = getCell( cellX, cellY ); + Cell* pOldCell = pActor->m_pCell; + if( !pCell ) + { + pCell = create( cellX, cellY ); + pCell->init( cellX, cellY, shared_from_this() ); + } + + // If object moved cell + if( pCell != pOldCell ) + { + + if( pOldCell ) + pOldCell->removeActor( pActor ); + + pCell->addActor( pActor ); + pActor->m_pCell = pCell; + + // if player we need to update cell activity + // radius = 2 is used in order to update both + // old and new cells + if( pActor->isPlayer() ) + { + updateCellActivity( cellX, cellY, 2 ); + if( pOldCell != nullptr ) + { + // only do the second check if theres -/+ 2 difference + if( abs( ( int ) cellX - ( int ) pOldCell->m_posX ) > 2 || + abs( ( int ) cellY - ( int ) pOldCell->m_posY ) > 2 ) + updateCellActivity( pOldCell->m_posX, pOldCell->m_posY, 2 ); + } + } + } + + // update in range actor set + uint32_t endX = cellX <= _sizeX ? cellX + 1 : ( _sizeX - 1 ); + uint32_t endY = cellY <= _sizeY ? cellY + 1 : ( _sizeY - 1 ); + uint32_t startX = cellX > 0 ? cellX - 1 : 0; + uint32_t startY = cellY > 0 ? cellY - 1 : 0; + uint32_t posX, posY; + + for( posX = startX; posX <= endX; ++posX ) + { + for( posY = startY; posY <= endY; ++posY ) + { + pCell = getCell( posX, posY ); + if( pCell ) + updateInRangeSet( pActor, pCell ); + } + } +} + + +void Zone::updateInRangeSet( Entity::ActorPtr pActor, Cell* pCell ) +{ + if( pCell == nullptr ) + return; + + Entity::ActorPtr pCurAct; + + auto iter = pCell->m_actors.begin(); + + float fRange = 70.0f; + int count = 0; + while( iter != pCell->m_actors.end() ) + { + pCurAct = *iter; + ++iter; + + if( !pCurAct ) + continue; + + float distance = Math::Util::distance( pCurAct->getPos().x, + pCurAct->getPos().y, + pCurAct->getPos().z, + pActor->getPos().x, + pActor->getPos().y, + pActor->getPos().z ); + + // Add if we are not ourself and range == 0 or distance is withing range. + if( pCurAct != pActor && ( fRange == 0.0f || distance <= fRange ) ) + { + + if( pActor->isInRangeSet( pCurAct ) ) + // Actor already in range set, skip + continue; + + if( pActor->isPlayer() ) + { + auto pOwnPlayer = pActor->getAsPlayer(); + + if( !pOwnPlayer->isLoadingComplete() ) + continue; + + count++; + if( count > 15 ) + break; + + pActor->addInRangeActor( pCurAct ); + pCurAct->addInRangeActor( pActor ); + // spawn the actor for the player + pCurAct->spawn( pOwnPlayer ); + + if( pCurAct->isPlayer() ) + { + auto pPlayer = pCurAct->getAsPlayer(); + if( !pPlayer->isLoadingComplete() ) + continue; + + pActor->spawn( pPlayer ); + } + + } + else if( pActor->isMob() && pCurAct->isPlayer() && pActor->isAlive() ) + { + auto pPlayer = pCurAct->getAsPlayer(); + if( pPlayer->isLoadingComplete() ) + { + pActor->spawn( pPlayer ); + pCurAct->addInRangeActor( pActor ); + pActor->addInRangeActor( pCurAct ); + } + } + else + { + pActor->addInRangeActor( pCurAct ); + pCurAct->addInRangeActor( pActor ); + } + } + } +} + +} diff --git a/src/servers/Server_Zone/Zone.h b/src/servers/Server_Zone/Zone.h new file mode 100644 index 00000000..a1f6a599 --- /dev/null +++ b/src/servers/Server_Zone/Zone.h @@ -0,0 +1,117 @@ +#ifndef _ZONE_H +#define _ZONE_H + +#include +#include + +#include "Cell.h" +#include "CellHandler.h" + +#include "Forwards.h" + +#include +#include + +#include +#include +namespace Core { + +namespace Entity +{ +class Actor; +class Player; +} + +class Session; + +class ZonePosition; + +typedef std::set< SessionPtr > SessionSet; + +class Zone : public CellHandler< Cell >, public boost::enable_shared_from_this< Zone > +{ +protected: + uint32_t m_zoneId; + uint32_t m_layoutId; + + std::string m_zoneName; + std::string m_zoneCode; + + bool m_bPrivate; + + std::unordered_map m_playerMap; + std::unordered_map m_BattleNpcMap; + + std::set< Entity::BattleNpcPtr > m_BattleNpcDeadMap; + + SessionSet m_sessionSet; + + CellCache** m_pCellCache[_sizeX]; + + Common::RegionType m_type; + + uint8_t m_currentWeather; + uint8_t m_weatherOverride; + + uint64_t m_lastMobUpdate; + +public: + Zone(); + + Zone( uint16_t zoneId, uint32_t layoutId, std::string name, std::string interName, bool bPrivate ); + virtual ~Zone(); + + bool init(); + + bool isPrivateZone() const; + + /*! overrides the zone's weather, set to 0 to unlock */ + void setWeatherOverride( uint8_t weather ); + + uint8_t getCurrentWeather() const; + + CellCache* getCellCacheList( uint32_t cellx, uint32_t celly ); + + CellCache* getCellCacheAndCreate( uint32_t cellx, uint32_t celly ); + + virtual void loadCellCache(); + + uint8_t getNextWeather(); + + void pushActor( Entity::ActorPtr pActor ); + + void removeActor( Entity::ActorPtr pActor ); + + void changeActorPosition( Entity::ActorPtr pActor ); + + bool isCellActive( uint32_t x, uint32_t y ); + + void updateCellActivity( uint32_t x, uint32_t y, int radius ); + + void updateInRangeSet( Entity::ActorPtr pActor, Cell* pCell ); + + void queueOutPacketForRange( Entity::PlayerPtr pSourcePlayer, uint32_t range, Network::Packets::GamePacketPtr pPacketEntry ); + + virtual uint32_t getId(); + + Common::RegionType getType() const; + + uint16_t getLayoutId() const; + + bool isInstance() const; + + const std::string& getName() const; + + const std::string& getInternalName() const; + + std::size_t getPopCount() const; + bool checkWeather(); + void updateBnpcs( int64_t tickCount ); + + bool runZoneLogic(); + +}; + +} + +#endif diff --git a/src/servers/Server_Zone/ZoneMgr.cpp b/src/servers/Server_Zone/ZoneMgr.cpp new file mode 100644 index 00000000..eeb610f5 --- /dev/null +++ b/src/servers/Server_Zone/ZoneMgr.cpp @@ -0,0 +1,146 @@ +#include +#include +#include +#include + +#include "ZoneMgr.h" +#include "Zone.h" + +#include "ZonePosition.h" + + +extern Core::Logger g_log; +extern Core::Db::Database g_database; +extern Core::Data::ExdData g_exdData; + +namespace Core { + + ZoneMgr::ZoneMgr() + { + } + + ZoneMgr::~ZoneMgr() + { + } + + void ZoneMgr::loadZonePositionMap() + { + auto pQR = g_database.query( "SELECT id, target_zone_id, pos_x, pos_y, pos_z, pos_o, radius " \ + "FROM dbzonepositions;" ); + + if( !pQR ) + return; + + do + { + Db::Field *field = pQR->fetch(); + uint32_t id = field[0].getUInt32(); + uint32_t targetZoneId = field[1].getUInt32(); + Common::FFXIVARR_POSITION3 pos; + pos.x = field[2].getFloat(); + pos.y = field[3].getFloat(); + pos.z = field[4].getFloat(); + float posO = field[5].getFloat(); + uint32_t radius = field[6].getUInt32(); + + m_zonePositionMap[id] = ZonePositionPtr( new ZonePosition( id, targetZoneId, pos, radius, posO ) ); + + } while( pQR->nextRow() ); + } + + ZonePositionPtr ZoneMgr::getZonePosition( uint32_t zonePositionId ) + { + auto it = m_zonePositionMap.find( zonePositionId ); + + if( it != m_zonePositionMap.end() ) + return it->second; + + return nullptr; + } + + bool ZoneMgr::createZones() + { + loadZonePositionMap(); + + // find zone info from exd + for( auto zone : g_exdData.m_zoneInfoMap ) + { + uint32_t zoneId = zone.first; + + + auto info = zone.second; + g_log.Log( LoggingSeverity::info, std::to_string( info.id ) + "\t" + info.zone_str ); + + ZonePtr pZone( new Zone( info.id, info.layout_id, info.zone_name, info.zone_str, false ) ); + pZone->init(); + m_zoneMap[info.id] = pZone; + } + + //do + //{ + // Db::Field *field = pQR->fetch(); + // uint16_t id = field[0].getUInt16(); + // std::string inName = field[1].getString(); + // std::string name = field[2].getString(); + // uint32_t layoutId = field[3].getUInt32(); + // bool isPrivate = field[4].getBool(); + + // if(!isPrivate) + // { + // g_log.Log(LoggingSeverity::info, std::to_string(id) + "\t" + inName + " - " + name); + + // ZonePtr pZone( new Zone( id, layoutId, name, inName, isPrivate ) ); + + // m_zoneMap[id] = pZone; + + // // start the region worker + // // ThreadPool->executeTask(pRegion); + // } + // else + // { + // //Console->outTime(" --> %s", inName.c_str()); + // //Console->outTime("\tCached private instance...", name.c_str()); + + // //// write the instance data into the instance cache for later use + // //InstanceCacheEntry * pICE = new InstanceCacheEntry(); + // //pICE->id = id; + // //pICE->inName = inName; + // //pICE->minX = minX; + // //pICE->maxX = maxX; + // //pICE->minY = minY; + // //pICE->maxY = maxY; + // //pICE->name = name; + // //pICE->layoutId = layoutId; + // //pICE->isPrivate = isPrivate; + + // //m_instanceCache[pICE->id] = pICE; + // //m_instanceCacheName[inName] = pICE; + + // //createInstance(pICE); + // } + + //} while(pQR->nextRow()); + + return true; + } + + void ZoneMgr::updateZones() + { + for( auto zone : m_zoneMap ) + { + zone.second->runZoneLogic(); + } + } + + ZonePtr ZoneMgr::getZone( uint32_t zoneId ) + { + ZoneMap::iterator it; + it = m_zoneMap.find( zoneId ); + + if( it != m_zoneMap.end() ) + return it->second; + + return nullptr; + } + +} diff --git a/src/servers/Server_Zone/ZoneMgr.h b/src/servers/Server_Zone/ZoneMgr.h new file mode 100644 index 00000000..6be7e5ce --- /dev/null +++ b/src/servers/Server_Zone/ZoneMgr.h @@ -0,0 +1,39 @@ +#ifndef _ZONEMGR_H +#define _ZONEMGR_H + + +#include +#include +#include "Forwards.h" + +namespace Core { + + typedef std::unordered_map ZoneMap; + + class ZoneMgr + { + public: + ZoneMgr(); + ~ZoneMgr(); + + bool createZones(); + + ZonePtr getZone( uint32_t zoneId ); + + void loadZonePositionMap(); + + ZonePositionPtr getZonePosition( uint32_t zonePositionId ); + + void updateZones(); + + private: + ZoneMap m_zoneMap; + + std::unordered_map m_zonePositionMap; + + }; + +} + +#endif + diff --git a/src/servers/Server_Zone/ZonePosition.cpp b/src/servers/Server_Zone/ZonePosition.cpp new file mode 100644 index 00000000..a5eb7c08 --- /dev/null +++ b/src/servers/Server_Zone/ZonePosition.cpp @@ -0,0 +1,43 @@ +#include "ZonePosition.h" + +Core::ZonePosition::ZonePosition() + : m_id(0) + , m_targetZoneId(0) + , m_radius(0) +{ +} + +Core::ZonePosition::ZonePosition( uint32_t id, uint32_t targetZoneId, const Core::Common::FFXIVARR_POSITION3& targetPosition, uint32_t radius, float rotation ) +{ + m_id = id; + m_targetZoneId = targetZoneId; + m_targetPos = targetPosition; + m_radius = radius; + m_rotation = rotation; +} + +Core::ZonePosition::~ZonePosition() +{ +} + +uint32_t Core::ZonePosition::getId() const +{ + return m_id; +} + +uint32_t Core::ZonePosition::getTargetZoneId() const +{ + return m_targetZoneId; +} + +const Core::Common::FFXIVARR_POSITION3 & Core::ZonePosition::getTargetPosition() const +{ + return m_targetPos; +} + +float Core::ZonePosition::getTargetRotation() const +{ + return m_rotation; +} + + diff --git a/src/servers/Server_Zone/ZonePosition.h b/src/servers/Server_Zone/ZonePosition.h new file mode 100644 index 00000000..0b4cad7c --- /dev/null +++ b/src/servers/Server_Zone/ZonePosition.h @@ -0,0 +1,33 @@ +#ifndef _ZONELINE_H +#define _ZONELINE_H + +#include + +namespace Core { + +class ZonePosition +{ +protected: + uint32_t m_id; + uint32_t m_targetZoneId; + Common::FFXIVARR_POSITION3 m_targetPos; + float m_rotation; + uint32_t m_radius; + +public: + ZonePosition(); + ZonePosition( uint32_t id, uint32_t targetZoneId, const Common::FFXIVARR_POSITION3& targetPosition, uint32_t radius, float rotation ); + virtual ~ZonePosition(); + + uint32_t getId() const; + + uint32_t getTargetZoneId() const; + + const Common::FFXIVARR_POSITION3& getTargetPosition() const; + + float getTargetRotation() const; + +}; + +} +#endif diff --git a/src/servers/Server_Zone/mainGameServer.cpp b/src/servers/Server_Zone/mainGameServer.cpp new file mode 100644 index 00000000..6a9bcdfc --- /dev/null +++ b/src/servers/Server_Zone/mainGameServer.cpp @@ -0,0 +1,24 @@ +#include + +#include "ServerZone.h" + +Core::ServerZone g_serverZone( "config/settings_zone.xml" ); + +int main( int argc, char* argv[] ) +{ + // i hate to do this, but we need to set this first... + for(auto i = 1; i < argc; ++i ) + { + std::string arg( argv[i] ); + + // trim '-' from start of arg + arg = arg.erase( 0, arg.find_first_not_of( '-' ) ); + if( arg == "sId" && argc > i + 1 ) + { + g_serverZone.setServerId( std::atol( argv[i + 1] ) ); + break; + } + } + g_serverZone.run( argc, argv ); + return 0; +} \ No newline at end of file diff --git a/src/tools/Script/ce_dump_vfs_path_357.lua b/src/tools/Script/ce_dump_vfs_path_357.lua new file mode 100644 index 00000000..3764d4c6 --- /dev/null +++ b/src/tools/Script/ce_dump_vfs_path_357.lua @@ -0,0 +1,231 @@ +-- init global variable +g_dump = io.open(os.date("dump_%Y-%m-%d-%H-%M-%S.txt"), "a") +g_dump:write("ptr, name\n") +g_count = 0 + +-- relative virtual address(rva) to register_whatever function +-- this assume ffxiv sb benchmark +-- YOU MUST EDIT THIS TO RIGHT VALUE TO WORK +-- check http://imgur.com/a/nJCef for disasm +g_addr = {} + +g_override_path = { + -- {"01_roc_r2", "01_gyr_g3"}, + -- {} + -- {"ex1/01_roc_r2/twn/r2t2/level/r2t2", "ex2/01_gyr_g3/twn/g3t2/level/g3t2"}, + -- {"ex1/01_roc_r2/twn/r2t2", "ex2/01_gyr_g3/twn/g3t2"}, + + -- + -- {"ffxiv/wil_w1/twn/w1t1/level/w1t1", "ex2/02_est_e3/fld/e3f1/level/e3f1"}, + -- {"ffxiv/wil_w1/twn/w1t1", "ex2/02_est_e3/fld/e3f1"}, + + -- kugane + {"ffxiv/wil_w1/twn/w1t1/level/w1t1", "ex2/02_est_e3/twn/e3t1/level/e3t1"}, + {"ffxiv/wil_w1/twn/w1t1", "ex2/02_est_e3/twn/e3t1"}, + + -- last cutscene dungeon ex2/02_est_e3/dun/e3d1 + --{"ffxiv/wil_w1/twn/w1t1/level/w1t1", "ex2/02_est_e3/dun/e3d1/level/e3d1"}, + --{"ffxiv/wil_w1/twn/w1t1", "ex2/02_est_e3/dun/e3d1"}, + +} + +-- g_addr.load_master = 0x162210 -- looks like below function is called from this +g_addr.load1 = 0x186BB0 -- mostly loads gfx stuff but does calc in it? +g_addr.load2 = 0x186CE0 -- mostly loads gfx stuff +g_addr.load3 = 0x1868A0 -- mostly loads exd data +g_addr.load4 = 0x186E00 -- from this on found it because there are next to each other +g_addr.load5 = 0x186EE0 -- umm, vfx? +g_addr.kugane_workaround = 0xE61416 + +g_loadseen = {} + +g_xiv = {} +g_xiv.proc_name = "ffxiv_dx11.exe" +g_xiv.path = "C:\\Users\\Mino\\Games\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\" .. g_xiv.proc_name +-- because I don't want to login and out every single try +g_xiv.arg = "DEV.TestSID=3a3f77cc5f7c88136d4a66e36bd27f8535d773d0378b521275468785 DEV.UseSqPack=1 DEV.DataPathType=1 DEV.LobbyHost01=127.0.0.1 DEV.LobbyPort01=54994 DEV.LobbyHost02=127.0.0.1 DEV.LobbyPort02=54994 DEV.LobbyHost03=127.0.0.1 DEV.LobbyPort03=54994 DEV.LobbyHost04=127.0.0.1 DEV.LobbyPort04=54994 DEV.LobbyHost05=127.0.0.1 DEV.LobbyPort05=54994 DEV.LobbyHost06=127.0.0.1 DEV.LobbyPort06=54994 SYS.Region=0 language=1 version=1.0.0.0 DEV.MaxEntitledExpansionID=1 DEV.GMServerHost=localhost" +g_mode = "attach" + +function init() + -- attach debugger + if g_mode == "create" then + print(string.format("Launching ffxiv.exe w/ arg %s", g_xiv.arg)) + createProcess(g_xiv.path, g_xiv.arg, true, true) + elseif g_mode == "attach" then + print("Looking for "..g_xiv.proc_name) + while not openProcess(g_xiv.proc_name) do sleep(1) end + print("Attaching...") + debugProcess() + while not getAddress(g_xiv.proc_name) do sleep(1) end + print("Module loaded") + else + print("Unsupported mode!") + return + end + + for k, v in pairs(g_addr) do + -- k = name + -- v = rva + print(string.format("Attaching %s breakpoint on 0x%X", k, v)) + debug_setBreakpoint(get_va(v)) + end + + print("Now waiting for breakpoints..") +end + +function debugger_onBreakpoint() + if RIP == get_va(g_addr.load1) then + -- dump_message("1>>") + local new_addr = dump_addr(R8) + if new_addr then + R8 = new_addr + end + elseif RIP == get_va(g_addr.load2) then + -- dump_message("2>>") + local new_addr = dump_addr(R8) + if new_addr then + R8 = new_addr + end + elseif RIP == get_va(g_addr.load3) then + local new_addr = dump_addr(RSP + 28) + if new_addr then + writeQword(RSP + 28, new_addr) + end + elseif RIP == get_va(g_addr.load4) then + -- dump_message("4>>") + local new_addr = dump_addr(RCX) + if new_addr then + RCX = new_addr + end + elseif RIP == get_va(g_addr.load5) then + -- dump_message("5>>") + local new_addr = dump_addr(RCX) + if new_addr then + RCX = new_addr + end + elseif RIP == get_va(g_addr.kugane_workaround) then + if RAX == 0 then + -- jump and hope it doesn't cause a UB + print("Workaround hack triggered") + RIP = get_va(0xE61432) + end + else + -- user bp, update gui on ce, but who gives a shit? + -- continue execution anyway + debug_continueFromBreakpoint("co_run") + return 0 + end + + -- something is missing on the text file because it takes ageeeeeeeeees to write to file + -- let just wait it + + + -- continue execution + debug_continueFromBreakpoint("co_run") + --return 0 -- update gui + return 1 +end + +function dump_addr(addr) + local vfspath = readString(addr, 256) + + if not g_loadseen[vfspath] then + g_loadseen[vfspath] = true -- set seen flag + + local message = string.format("%X, %s", addr, vfspath) + dump_line(message) + end + + if vfspath then + return replace_map_string(addr, vfspath) + end + + return nil +end + +function dump_line(message) + dump_message(message .. "\n") +end + +function dump_message(message) + g_dump:write(message) + g_dump:flush() + print(message) +end + +-- mod_base + rva = va +function get_va(rva) + return getAddress(g_xiv.proc_name) + rva +end + +-- rva = va - mod_base +function get_rva(va) + return va - getAddress(g_xiv.proc_name) +end + +-- check mod_base <= va <= mod_base + mod_size +function is_mmod_addr(va) + local mod_base = getAddress(g_xiv.proc_name) + local mod_size = getModuleSize(g_xiv.proc_name) + + if mod_base <= va and va <= mod_base + mod_size then + return true + end + + return false +end + +function replace_map_string(addr, source) + -- try to replace map strnig + for _, v in ipairs(g_override_path) do + local match_pat = v[1] + local replace_pat = v[2] + + if string.find(source, match_pat) then + local path_override = string.gsub(source, match_pat, replace_pat) + dump_line(string.format("OVERRIDE>> %s => %s (w/ %s => %s)", source , path_override, match_pat, replace_pat)) + + -- check str len if + if string.len(source) < string.len(path_override) then + local new_addr = alloc(256) -- alloc 256 bytes + writeCString(new_addr, path_override) + print(string.format("Replaced string is longer than original, allocating it to 0x%X", new_addr)) + return new_addr + else + -- original string len is longer or same + writeCString(addr, path_override) + return nil + end + end + end + + -- can't find it + return nil +end + +-- write a string with null +function writeCString(addr, content) + writeString(addr, content) + writeBytes(addr + string.len(content), 0) -- put null byte, this assume content is only ASCII char +end + +-- no way to free, have fun +function alloc(size) + -- taken from http://forum.cheatengine.org/viewtopic.php?t=560739&sid=73dc5a565393a034ba16d1d468bb1eeb + autoAssemble([[ +alloc(luatemp, ]]..size..[[) +registersymbol(luatemp) +]]) + return getAddress("luatemp") +end + +function split(str) + local result = {} + for token in string.gmatch(str..",", "([^,]+),%s*") do + table.insert(result, all_trim(token)) + end + + return result +end + +init() diff --git a/src/tools/Script/ce_dump_vfs_path_sbbench.lua b/src/tools/Script/ce_dump_vfs_path_sbbench.lua new file mode 100644 index 00000000..fc081884 --- /dev/null +++ b/src/tools/Script/ce_dump_vfs_path_sbbench.lua @@ -0,0 +1,141 @@ +-- init global variable +g_dump = io.open(os.date("dump_%Y-%m-%d-%H-%M-%S.txt"), "a") +g_dump:write("ptr, name\n") +g_count = 0 + +-- relative virtual address(rva) to register_whatever function +-- this assume ffxiv sb benchmark +-- YOU MUST EDIT THIS TO RIGHT VALUE TO WORK +-- check http://imgur.com/a/nJCef for disasm +g_addr = {} +g_addr.load_master = 0x162210 -- looks like below function is called from this +g_addr.load1 = 0x1624B0 -- mostly loads gfx stuff but does calc in it? +g_addr.load2 = 0x162410 -- mostly loads gfx stuff +g_addr.load3 = 0x1626B0 -- mostly loads exd data +g_addr.load4 = 0x162540 -- from this on found it because there are next to each other +g_addr.load5 = 0x162360 -- umm, vfx? + +g_loadseen = {} + +g_xiv = {} +g_xiv.proc_name = "ffxiv_dx11.exe" +g_xiv.path = "C:\\Users\\Mino\\Desktop\\FFXIV-SB\\game\\" .. g_xiv.proc_name +-- because I don't want to login and out every single try +g_xiv.arg = "SYS.Language=1 SYS.Fps=0 SYS.MainAdapter=\"AMD_Radeon_HD_7800_Series(\\\\.\\DISPLAY1)\" SYS.ScreenMode=0 SYS.ScreenWidth=1280 SYS.ScreenHeight=720 SYS.FullScreenWidth=1280 SYS.FullScreenHeight=720 SYS.Gamma=50 SYS.IsSoundAlways=0 SYS.SoundMaster=100 SYS.SoundBgm=100 SYS.SoundSe=100 SYS.SoundVoice=100 SYS.SoundSystem=100 SYS.SoundEnv=100 SYS.IsSndMaster=0 SYS.IsSndBgm=0 SYS.IsSndSe=0 SYS.IsSndVoice=0 SYS.IsSndSystem=0 SYS.IsSndEnv=0 SYS.WaterWet_DX11=1 SYS.OcclusionCulling_DX11=1 SYS.LodType_DX11=1 SYS.ReflectionType_DX11=0 SYS.AntiAliasing_DX11=0 SYS.TranslucentQuality_DX11=0 SYS.GrassQuality_DX11=2 SYS.ShadowLOD_DX11=1 SYS.ShadowVisibilityTypeSelf_DX11=1 SYS.ShadowVisibilityTypeOther_DX11=0 SYS.ShadowTextureSizeType_DX11=1 SYS.ShadowCascadeCountType_DX11=2 SYS.ShadowSoftShadowType_DX11=1 SYS.PhysicsTypeSelf_DX11=2 SYS.PhysicsTypeOther_DX11=2 SYS.TextureFilterQuality_DX11=2 SYS.TextureAnisotropicQuality_DX11=0 SYS.Vignetting_DX11=1 SYS.RadialBlur_DX11=1 SYS.SSAO_DX11=1 SYS.Glare_DX11=2 SYS.DepthOfField_DX11=1 SYS.ParallaxOcclusion_DX11=0 SYS.Tessellation_DX11=0 SYS.GlareRepresentation_DX11=0" +g_mode = "create" + +function init() + -- attach debugger + if g_mode == "create" then + print(string.format("Launching ffxiv.exe w/ arg %s", g_xiv.arg)) + createProcess(g_xiv.path, g_xiv.arg, true, true) + elseif g_mode == "attach" then + print("Looking for ffxiv.exe..") + while not openProcess("ffxiv.exe") do sleep(1) end + print("Attaching...") + debugProcess() + while not getAddress(g_xiv.proc_name) do sleep(1) end + print("Module loaded") + else + print("Unsupported mode!") + return + end + + for k, v in pairs(g_addr) do + -- k = name + -- v = rva + print(string.format("Attaching %s breakpoint on 0x%X", k, v)) + debug_setBreakpoint(get_va(v)) + end + + print("Now waiting for breakpoints..") +end + +function debugger_onBreakpoint() + if RIP == get_va(g_addr.load1) then + -- dump_message("1>>") + dump_addr(R8) + elseif RIP == get_va(g_addr.load2) then + -- dump_message("2>>") + dump_addr(R8) + elseif RIP == get_va(g_addr.load3) then + -- dump_message("3>>") + dump_addr(RCX) + elseif RIP == get_va(g_addr.load4) then + -- dump_message("4>>") + dump_addr(RCX) + elseif RIP == get_va(g_addr.load5) then + -- dump_message("5>>") + dump_addr(RDX) + elseif RIP == get_va(g_addr.load_master) then + -- dump_message("master>>") + dump_addr(RDX) + else + -- user bp, update gui on ce, but who gives a shit? + -- continue execution anyway + debug_continueFromBreakpoint("co_run") + return 0 + end + + -- something is missing on the text file because it takes ageeeeeeeeees to write to file + -- let just wait it + + + -- continue execution + debug_continueFromBreakpoint("co_run") + --return 0 -- update gui + return 1 +end + +function dump_addr(addr) + local vfspath = readString(addr, 256) + if not g_loadseen[vfspath] then + g_loadseen[vfspath] = true -- set seen flag + + local message = string.format("%X, %s", addr, vfspath) + dump_line(message) + end +end + +function dump_line(message) + dump_message(message .. "\n") +end + +function dump_message(message) + g_dump:write(message) + g_dump:flush() + print(message) +end + +-- mod_base + rva = va +function get_va(rva) + return getAddress(g_xiv.proc_name) + rva +end + +-- rva = va - mod_base +function get_rva(va) + return va - getAddress(g_xiv.proc_name) +end + +-- check mod_base <= va <= mod_base + mod_size +function is_mmod_addr(va) + local mod_base = getAddress(g_xiv.proc_name) + local mod_size = getModuleSize(g_xiv.proc_name) + + if mod_base <= va and va <= mod_base + mod_size then + return true + end + + return false +end + +function split(str) + local result = {} + for token in string.gmatch(str..",", "([^,]+),%s*") do + table.insert(result, all_trim(token)) + end + + return result +end + +init() diff --git a/src/tools/pcb_reader/CMakeLists.txt b/src/tools/pcb_reader/CMakeLists.txt new file mode 100644 index 00000000..9bd07e39 --- /dev/null +++ b/src/tools/pcb_reader/CMakeLists.txt @@ -0,0 +1,23 @@ +set( CMAKE_CXX_FLAGS "-std=c++11 -m32") + +include_directories("../../") +include_directories("../") + +file(GLOB SERVER_PUBLIC_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*") +file(GLOB SERVER_SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}*.cpp") + +SET(Boost_USE_STATIC_LIBS ON) +set(Boost_INCLUDE_DIR /opt/build_libs/boost_1_60_0) +set(Boost_LIBRARY_DIR /opt/build_libs/boost_1_60_0/stage/lib) +set(SERVER_COMMON_DIR ../../servers/Server_Common) +find_package(Boost COMPONENTS log log_setup thread date_time filesystem system REQUIRED) +include_directories(${Boost_INCLUDE_DIR}) + +link_directories(${Boost_LIBRARY_DIR}) +link_directories(${SERVER_COMMON_DIR}) +#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ".") +add_executable(pcb_parser2 ${SERVER_PUBLIC_INCLUDE_FILES} ${SERVER_SOURCE_FILES}) + +target_link_libraries (pcb_parser2 server_common.a pthread mysqlclient dl z) +target_link_libraries(pcb_parser2 ${Boost_LIBRARIES} ${Boost_LIBRARIES}) + diff --git a/src/tools/pcb_reader/main.cpp b/src/tools/pcb_reader/main.cpp new file mode 100644 index 00000000..6da22cd5 --- /dev/null +++ b/src/tools/pcb_reader/main.cpp @@ -0,0 +1,258 @@ +#include +#include +#include + +#include "pcb.h" + +#include + +int parseBlockEntry( char* data, std::vector& entries, int gOff ) +{ + int offset = 0; + bool isgroup = true; + while( isgroup ) + { + PCB_BLOCK_ENTRY block_entry; + memcpy( &block_entry.header, data + offset, sizeof( block_entry.header ) ); + isgroup = block_entry.header.type == 0x30 ? true : false; + + //printf( " BLOCKHEADER_%X: type: %i, group_size: %i\n", gOff + offset, block_entry.header.type, block_entry.header.group_size ); + + if( isgroup ) + { + parseBlockEntry( data + offset + 0x30, entries, gOff + offset ); + offset += block_entry.header.group_size; + + } + else + { + printf( "\tnum_v16: %i, num_indices: %i, num_vertices: %i\n\n", + block_entry.header.num_v16, block_entry.header.num_indices, block_entry.header.num_vertices ); + int doffset = sizeof( block_entry.header ) + offset; + uint16_t block_size = sizeof( block_entry.header ) + + block_entry.header.num_vertices * 3 * 4 + + block_entry.header.num_v16 * 6 + + block_entry.header.num_indices * 6; + + if( block_entry.header.num_vertices != 0 ) + { + block_entry.data.vertices.resize( block_entry.header.num_vertices ); + + int32_t size_vertexbuffer = block_entry.header.num_vertices * 3; + memcpy( &block_entry.data.vertices[0], data + doffset, size_vertexbuffer * 4 ); + doffset += size_vertexbuffer * 4; + } + if( block_entry.header.num_v16 != 0 ) + { + block_entry.data.vertices_i16.resize( block_entry.header.num_v16 ); + int32_t size_unknownbuffer = block_entry.header.num_v16 * 6; + memcpy( &block_entry.data.vertices_i16[0], data + doffset, size_unknownbuffer ); + doffset += block_entry.header.num_v16 * 6; + } + if( block_entry.header.num_indices != 0 ) + { + block_entry.data.indices.resize( block_entry.header.num_indices ); + int32_t size_indexbuffer = block_entry.header.num_indices * 6; + memcpy( &block_entry.data.indices[0], data + doffset, size_indexbuffer ); + doffset += size_indexbuffer; + } + entries.push_back( block_entry ); + + /* printf( "Vertices: \n" ); + for( auto& entry1 : block_entry.data.vertices ) + { + printf( "\t %f, %f, %f \n", + entry1.x, entry1.y, entry1.z ); + } + + float x_base = abs( float( block_entry.header.x1 - block_entry.header.x ) ); + float y_base = abs( float( block_entry.header.y1 - block_entry.header.y ) ); + float z_base = abs( float( block_entry.header.z1 - block_entry.header.z ) ); + + printf( "Vertices I16: \n" ); + for( auto& entry1 : block_entry.data.vertices_i16 ) + { + uint16_t var1 = entry1.x; + uint16_t var2 = entry1.y; + uint16_t var3 = entry1.z; + float x = ( var1 ); + float y = ( var2 ); + float z = ( var3 ); + printf( "\t%f, ", ( x / 0xFFFF ) * x_base + block_entry.header.x ); + printf( "%f, ", ( y / 0xFFFF ) * y_base + block_entry.header.y ); + printf( "%f ", ( z / 0xFFFF ) * z_base + block_entry.header.z ); + printf( "\n" ); + + }*/ + } + } + + return 0; +} + +int main() +{ + char *data; + + uint32_t offset = 0; + //r1f1_b1_dor00.pcb + + //std::string filename( "f1h0_s_rof0003.pcb" ); + std::string filename( "tr0924.pcb" ); + FILE *fp = nullptr; + fp = fopen( filename.c_str(), "rb" ); + if( fp == nullptr ) + { + return 0; + } + + fseek( fp, 0, SEEK_END ); + int32_t size = ftell( fp ); + data = new char[size]; + rewind( fp ); + fread( data, sizeof( char ), size, fp ); + fclose( fp ); + + PCB_FILE pcb_file; + memcpy( &pcb_file.header, data, sizeof( pcb_file.header ) ); + offset += sizeof( pcb_file.header ); + + + + std::vector entries; + + bool isgroup = true; + while( isgroup ) + { + PCB_BLOCK_ENTRY block_entry; + memcpy( &block_entry.header, data + offset, sizeof( block_entry.header ) ); + isgroup = block_entry.header.type == 0x30 ? true : false; + + //printf( "BLOCKHEADER_%X: type: %i, group_size: %i\n", offset, block_entry.header.type, block_entry.header.group_size ); + + if( isgroup ) + { + std::vector data_block( block_entry.header.group_size ); + memcpy( &data_block[0], data + offset, block_entry.header.group_size ); + parseBlockEntry( (char*)&data_block[0] + 0x30, entries, offset ); + offset += block_entry.header.group_size; + } + else + { + parseBlockEntry( data + offset, entries, offset ); + } + + + + } + + for( uint16_t i = 0; i <= pcb_file.header.num_entries; i++ ) + { + PCB_BLOCK_ENTRY block_entry; + memcpy( &block_entry.header, data + offset, sizeof( block_entry.header ) ); + offset += sizeof( block_entry.header ); + + uint16_t block_size = sizeof( block_entry.header ) + + block_entry.header.num_vertices * 3 * 4 + + block_entry.header.num_v16 * 6 + + block_entry.header.num_indices * 6; + + if( block_entry.header.num_vertices != 0 ) + { + block_entry.data.vertices.resize( block_entry.header.num_vertices ); + + int32_t size_vertexbuffer = block_entry.header.num_vertices * 3; + memcpy( &block_entry.data.vertices[0], data + offset, size_vertexbuffer * 4 ); + offset += size_vertexbuffer * 4; + } + if( block_entry.header.num_v16 != 0 ) + { + block_entry.data.vertices_i16.resize( block_entry.header.num_v16 ); + int32_t size_unknownbuffer = block_entry.header.num_v16 * 6; + memcpy( &block_entry.data.vertices_i16[0], data + offset, size_unknownbuffer ); + offset += block_entry.header.num_v16 * 6; + } + if( block_entry.header.num_indices != 0 ) + { + block_entry.data.indices.resize( block_entry.header.num_indices ); + int32_t size_indexbuffer = block_entry.header.num_indices * 6; + memcpy( &block_entry.data.indices[0], data + offset, size_indexbuffer ); + offset += size_indexbuffer; + } + + // blocks always align to 16 bytes + 8 bytes padding till the next block + int rest = ( offset % 16 ); + if( rest > 0 ) + { + rest = 0x10 - rest; + } + offset += rest ; + + + pcb_file.entries.push_back( block_entry ); + } + + FILE* fp_out1 = fopen( std::string( filename + ".plain" ).c_str(), "w" ); + fprintf( fp_out1, ""); + fclose( fp_out1 ); + + FILE* fp_out = fopen( std::string( filename + ".plain" ).c_str(), "w+" ); + + fprintf( fp_out, "HEADER: num_entries: %i, total_indices: %i, unknown_1: %i\n\n", pcb_file.header.num_entries, pcb_file.header.total_indices, pcb_file.header.unknown_1 ); + + int block_cnt = 0; + for( auto& entry : pcb_file.entries ) + { + + fprintf( fp_out, "BLOCKHEADER_%i: type: %i, group_size: %i\n ", + block_cnt, entry.header.type, entry.header.group_size ); + fprintf( fp_out, "\tAABB: x: %f, y: %f, z: %f\n ", + entry.header.x, entry.header.y, entry.header.z ); + fprintf( fp_out, "\t\t x1: %f, y1: %f, z1: %f\n ", + entry.header.x1, entry.header.y1, entry.header.z1 ); + fprintf( fp_out, "\tnum_v16: %i, num_indices: %i, num_vertices: %i\n\n", + entry.header.num_v16, entry.header.num_indices, entry.header.num_vertices ); + + fprintf( fp_out, "Vertices: \n"); + for( auto& entry1 : entry.data.vertices ) + { + fprintf( fp_out, "\t %f, %f, %f \n", + entry1.x, entry1.y, entry1.z ); + } + + float x_base = abs( float( entry.header.x1 - entry.header.x ) ); + float y_base = abs( float( entry.header.y1 - entry.header.y ) ); + float z_base = abs( float( entry.header.z1 - entry.header.z ) ); + + fprintf( fp_out, "Vertices I16: \n" ); + for( auto& entry1 : entry.data.vertices_i16 ) + { + uint16_t var1 = entry1.x; + uint16_t var2 = entry1.y; + uint16_t var3 = entry1.z; + float x = ( var1 ); + float y = ( var2 ); + float z = ( var3 ); + fprintf( fp_out, "\t%f, ", (x / 0xFFFF) * x_base + entry.header.x ); + fprintf( fp_out, "%f, ", (y / 0xFFFF) * y_base + entry.header.y ); + fprintf( fp_out, "%f ", (z / 0xFFFF) * z_base + entry.header.z ); + fprintf( fp_out, "\n"); + + } + + + + + fprintf( fp_out, "Indices: \n" ); + for( auto& entry1 : entry.data.indices ) + { + fprintf( fp_out, "\t %i, %i, %i - %x,%x,%x \n", + entry1.index[0], entry1.index[1], entry1.index[2], entry1.unknown[0], entry1.unknown[1], entry1.unknown[2] ); + } + fprintf( fp_out, "\n" ); + } + + fclose( fp_out ); + + return 0; +} diff --git a/src/tools/pcb_reader/pcb.h b/src/tools/pcb_reader/pcb.h new file mode 100644 index 00000000..a9c65e2e --- /dev/null +++ b/src/tools/pcb_reader/pcb.h @@ -0,0 +1,69 @@ +#include +#include + +struct PCB_HEADER +{ + uint32_t unknown_1; + uint32_t unknown_2; + uint32_t num_entries; // count starts at 0 + uint32_t total_indices; + uint64_t padding; +}; + +struct PCB_BLOCK_HEADER +{ + uint32_t type; // 0 for entry, 0x30 for group + uint32_t group_size; // when group size in bytes for the group block + // bounding box + float x; + float y; + float z; + float x1; + float y1; + float z1; + // number of vertices packed into 16 bit + uint16_t num_v16; + // number of indices + uint16_t num_indices; + // number of normal floar vertices + uint32_t num_vertices; +}; + +struct PCB_VERTEXDATA +{ + float x; + float y; + float z; +}; + +struct PCB_INDEXDATA +{ + uint8_t index[3]; + uint8_t unknown[3]; +}; + +struct PCB_VERTEXDATAI16 +{ + uint16_t x; + uint16_t y; + uint16_t z; +}; + +struct PCB_BLOCK_DATA +{ + std::vector< PCB_VERTEXDATA > vertices; + std::vector< PCB_VERTEXDATAI16 > vertices_i16; + std::vector< PCB_INDEXDATA > indices; +}; + +struct PCB_BLOCK_ENTRY +{ + PCB_BLOCK_HEADER header; + PCB_BLOCK_DATA data; +}; + +struct PCB_FILE +{ + PCB_HEADER header; + std::vector< PCB_BLOCK_ENTRY > entries; +}; diff --git a/src/tools/quest_parser/CMakeLists.txt b/src/tools/quest_parser/CMakeLists.txt new file mode 100644 index 00000000..1a314ae9 --- /dev/null +++ b/src/tools/quest_parser/CMakeLists.txt @@ -0,0 +1,91 @@ +cmake_minimum_required(VERSION 2.6) +cmake_policy(SET CMP0015 NEW) +project(Tool_QuestParser) + +set(SAPPHIRE_BOOST_VER 1.63.0) +set(SAPPHIRE_BOOST_FOLDER_NAME boost_1_63_0) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../bin/") + +include_directories("../../lib/ChaiScript-6.0.0/include/") + +include_directories("../../sapphire/datReader/") +include_directories("../../sapphire/") +include_directories("../") + +file(GLOB SERVER_PUBLIC_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*") +file(GLOB SERVER_SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}*.c*") + +set(SERVER_COMMON_DIR ../../sapphire/Server_Common) +set(Boost_USE_STATIC_LIBS ON) + +if(UNIX) + include_directories("/usr/include/mysql/") + message(STATUS "Setting GCC flags") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -m32") + + find_package(Boost ${SAPPHIRE_BOOST_VER} COMPONENTS log log_setup thread date_time filesystem system) + if(Boost_FOUND) + set(BOOST_LIBRARY_DIR ${Boost_LIBRARY_DIR}) + else() + if (EXISTS /opt/build_libs/${SAPPHIRE_BOOST_FOLDER_NAME}) + set(Boost_INCLUDE_DIR /opt/build_libs/${SAPPHIRE_BOOST_FOLDER_NAME}) + set(BOOST_LIBRARYDIR /opt/build_libs/${SAPPHIRE_BOOST_FOLDER_NAME}/stage/lib) + find_package(Boost ${SAPPHIRE_BOOST_VER} COMPONENTS log log_setup thread date_time filesystem system) + else() + message(FATAL_ERROR "Unable to find boost ${SAPPHIRE_BOOST_VER} package!") + endif() + endif() +else() + add_definitions(-D_WIN32_WINNT=0x601) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) + include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../lib/MySQL/") + message(STATUS "Setting MSVC flags") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHc") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") + + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../../lib/${SAPPHIRE_BOOST_FOLDER_NAME}) + message(STATUS "Using boost in /src/lib") + set(Boost_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../lib/${SAPPHIRE_BOOST_FOLDER_NAME}) + set(BOOST_LIBRARYDIR ${CMAKE_CURRENT_SOURCE_DIR}/../../lib/${SAPPHIRE_BOOST_FOLDER_NAME}/lib32-msvc-14.0) + else() + find_package(Boost ${SAPPHIRE_BOOST_VER} COMPONENTS log log_setup thread date_time filesystem system) + if(Boost_FOUND) + set(BOOST_LIBRARY_DIR ${Boost_LIBRARY_DIR}) + elseif ((EXISTS $ENV{BOOST_ROOT_DIR}) AND (EXISTS $ENV{BOOST_LIB_DIR})) + set(Boost_INCLUDE_DIR $ENV{BOOST_ROOT_DIR}) + set(BOOST_LIBRARYDIR $ENV{BOOST_LIB_DIR}) + else() + message(FATAL_ERROR "SapphireError: Unable to find boost ${SAPPHIRE_BOOST_VER} package and environment variables BOOST_ROOT_DIR and BOOST_LIB_DIR not set!") + endif() + endif() +endif() + +include_directories(${Boost_INCLUDE_DIR}) + +link_directories(${BOOST_LIBRARYDIR}) +link_directories(${SERVER_COMMON_DIR}) +link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../sapphire/datReader/) +link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../lib/MySQL) +link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../lib/zlib) + +#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../bin/") +add_executable(quest_parse ${SERVER_PUBLIC_INCLUDE_FILES} ${SERVER_SOURCE_FILES}) + +set_target_properties(quest_parse PROPERTIES + CXX_STANDARD 14 + CXX_STANDARD_REQUIRED ON + CXX_EXTENSIONS ON + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/../bin/" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/../bin/" + RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_CURRENT_SOURCE_DIR}/../bin/" + RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_CURRENT_SOURCE_DIR}/../bin/" +) + +if (UNIX) + target_link_libraries (quest_parse Common xivdat pthread mysqlclient dl z) +else() + target_link_libraries (quest_parse Common xivdat libmysql zlib1) +endif() + +target_link_libraries(quest_parse ${Boost_LIBRARIES} ${Boost_LIBRARIES}) + diff --git a/src/tools/quest_parser/main.cpp b/src/tools/quest_parser/main.cpp new file mode 100644 index 00000000..7c76b2ce --- /dev/null +++ b/src/tools/quest_parser/main.cpp @@ -0,0 +1,337 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +Core::Logger g_log; +Core::Data::ExdData g_exdData; + + +void createScript( boost::shared_ptr< Core::Data::QuestInfo > pQuestData, std::set< std::string > additionalList ) +{ + std::string header( + "// This is an automatically generated chai script template\n" + "// Content needs to be added by hand to make it function\n" + "// In order for this script to be loaded, change its extension to .chai\n" + "// and move it to the correct folder in bin/scripts/chai/quest\n" + "\n" + ); + + std::size_t splitPos = pQuestData->name_intern.find( "_" ); + std::string className = pQuestData->name_intern.substr( 0, splitPos ); + + std::string sceneStr = " //////////////////////////////////////////////////////////////////////\n // Available Scenes in this quest, not necessarly all are used\n"; + std::string seqStr = " // Steps in this quest ( 0 is before accepting, \n // 1 is first, 255 means ready for turning it in\n"; + std::string questVarStr = " // Quest vars / flags used\n"; + for( auto &entry : additionalList ) + { + if( entry.find( "OnScene" ) != std::string::npos ) + { + std::string sceneName = entry.substr( 2 ); + std::string sceneId = entry.substr( 7 ); + + std::size_t numOff = sceneId.find_first_not_of( "0" ); + sceneId = numOff != std::string::npos ? sceneId.substr( numOff ) : "0"; + + sceneStr += " def " + sceneName + "( player )\n"; + sceneStr += " {\n"; + sceneStr += " player.eventPlay( this.id, " + sceneId + ", NONE,\n"; + sceneStr += " fun( player, eventId, param1, param2, param3 )\n"; + sceneStr += " {} );\n"; + sceneStr += " }\n\n"; + } + else if( entry.find( "Flag" ) != std::string::npos || + entry.find( "QuestUI" ) != std::string::npos ) + { + questVarStr += " // " + entry + "\n"; + } + else if( entry.find( "SEQ" ) != std::string::npos ) + { + if( entry.find( "SEQ_FINISH" ) != std::string::npos ) + { + seqStr += " this.SEQ_FINISH = 255;\n"; + } + else if( entry.find( "SEQ_OFFER" ) != std::string::npos ) + { + } + else + { + std::string seqName = entry; + std::string seqId = entry.substr( 4 ); + seqStr += " this." + seqName + " = " + seqId + ";\n"; + } + } + + + } + std::string rewards = " // Quest rewards \n"; + rewards += ( pQuestData->reward_exp_factor != 0 ) ? " this.RewardExpFactor = " + std::to_string( pQuestData->reward_exp_factor ) + ";\n" : ""; + rewards += ( pQuestData->reward_gil != 0 ) ? " this.RewardGil = " + std::to_string( pQuestData->reward_gil ) + ";\n" : ""; + rewards += ( pQuestData->reward_emote != 0 ) ? " this.RewardEmote = " + std::to_string( pQuestData->reward_emote ) + ";\n" : ""; + rewards += ( pQuestData->reward_action != 0 ) ? " this.RewardAction = " + std::to_string( pQuestData->reward_action ) + ";\n" : ""; + rewards += ( pQuestData->reward_action_general1 != 0 ) ? " this.RewardGeneralAction1 = " + std::to_string( pQuestData->reward_action_general1 ) + ";\n" : ""; + rewards += ( pQuestData->reward_action_general2 != 0 ) ? " this.RewardGeneralAction2 = " + std::to_string( pQuestData->reward_action_general2 ) + ";\n" : ""; + rewards += ( pQuestData->reward_gc_seals != 0 ) ? " this.RewardGCSeals = " + std::to_string( pQuestData->reward_gc_seals ) + ";\n" : ""; + rewards += ( pQuestData->reward_other != 0 ) ? " this.RewardOther = " + std::to_string( pQuestData->reward_other ) + ";\n" : ""; + rewards += ( pQuestData->reward_reputation != 0 ) ? " this.RewardReputation = " + std::to_string( pQuestData->reward_reputation ) + ";\n" : ""; + rewards += ( pQuestData->reward_tome_type != 0 ) ? " this.RewardTomeType = " + std::to_string( pQuestData->reward_tome_type ) + ";\n" : ""; + rewards += ( pQuestData->reward_tome_count != 0 ) ? " this.RewardTomeCount = " + std::to_string( pQuestData->reward_tome_count ) + ";\n" : ""; + rewards += ( pQuestData->instanced_content_unlock != 0 ) ? " this.InstancedContentUnlock = " + std::to_string( pQuestData->instanced_content_unlock ) + ";\n" : ""; + + if( pQuestData->reward_item.size() > 0 ) + { + rewards += " this.RewardItem = ["; + for( int ca = 0; ca < pQuestData->reward_item.size(); ca++ ) + { + rewards += std::to_string( pQuestData->reward_item.at( ca ) ); + if( ca != pQuestData->reward_item.size() - 1 ) + { + rewards += ", "; + } + } + rewards += "];\n"; + } + + if( pQuestData->reward_item.size() > 0 ) + { + rewards += " this.RewardItemCount = ["; + for( int ca = 0; ca < pQuestData->reward_item_count.size(); ca++ ) + { + rewards += std::to_string( pQuestData->reward_item_count.at( ca ) ); + if( ca != pQuestData->reward_item_count.size() - 1 ) + { + rewards += ", "; + } + } + rewards += "];\n"; + } + + if( pQuestData->reward_item_optional.size() > 0 ) + { + rewards += " this.RewardItemOptional = ["; + for( int ca = 0; ca < pQuestData->reward_item_optional.size(); ca++ ) + { + rewards += std::to_string( pQuestData->reward_item_optional.at( ca ) ); + if( ca != pQuestData->reward_item_optional.size() - 1 ) + { + rewards += ", "; + } + } + rewards += "];\n"; + } + + if( pQuestData->reward_item_optional_count.size() > 0 ) + { + rewards += " this.RewardItemOptionalCount = ["; + for( int ca = 0; ca < pQuestData->reward_item_optional_count.size(); ca++ ) + { + rewards += std::to_string( pQuestData->reward_item_optional_count.at( ca ) ); + if( ca != pQuestData->reward_item_optional_count.size() - 1 ) + { + rewards += ", "; + } + } + rewards += "];\n"; + } + + bool hasERange = false; + bool hasEmote = false; + bool hasEnemies = false; + std::vector< uint32_t > enemy_ids; + std::vector< std::string > script_entities; + std::string sentities = " // Entities found in the script data of the quest\n"; + + for( int ca = 0; ca < pQuestData->script_entity.size(); ca ++ ) + { + if( ( pQuestData->script_entity.at( ca ).find( "HOWTO" ) != std::string::npos ) || ( pQuestData->script_entity.at( ca ).find( "HOW_TO" ) != std::string::npos ) ) + continue; + + if( (pQuestData->script_entity.at( ca ).find( "EMOTENO" ) != std::string::npos ) || (pQuestData->script_entity.at( ca ).find( "EMOTEOK" ) != std::string::npos ) ) + hasEmote = true; + + if(pQuestData->script_entity.at(ca).find("ENEMY") != std::string::npos) + { + hasEnemies = true; + enemy_ids.push_back(pQuestData->script_value.at(ca)); + } + + script_entities.push_back( pQuestData->script_entity.at( ca ) + " = " + std::to_string( pQuestData->script_value.at( ca ) ) ); + } + std::sort( script_entities.begin(), script_entities.end() ); + + for( auto& entity : script_entities ) + { + sentities += " this." + entity + ";\n"; + } + + std::string additional = "// Quest Script: " + pQuestData->name_intern + "\n"; + additional += "// Quest Name: " + pQuestData->name + "\n"; + additional += "// Quest ID: " + std::to_string( pQuestData->id ) + "\n"; + additional += "// Start NPC: " + std::to_string( pQuestData->enpc_resident_start ) + "\n"; + additional += "// End NPC: " + std::to_string( pQuestData->enpc_resident_end ) + "\n\n"; + + std::string scriptEntry = " //////////////////////////////////////////////////////////////////////\n"; + scriptEntry += " // Event Handlers\n"; + scriptEntry += " def onTalk( eventId, player, actorId )\n"; + scriptEntry += " {\n"; + scriptEntry += " var actor = mapActor( actorId );\n"; + scriptEntry += " }\n\n"; + + if( hasERange ) + { + scriptEntry += " def onWithinRange( eventId, player, eRangeId, x, y, z )\n"; + scriptEntry += " {\n"; + scriptEntry += " }\n\n"; + } + + if( hasEmote ) + { + scriptEntry += " def onEmote( eventId, player, actorId, emoteId )\n"; + scriptEntry += " {\n"; + scriptEntry += " }\n\n"; + } + + for( auto enemy : enemy_ids ) + { + scriptEntry += " def onMobKill_" + std::to_string(enemy) + "( player )\n"; + scriptEntry += " {\n"; + scriptEntry += " }\n\n"; + } + + std::string constructor; + constructor += " def " + className + "Def()\n"; + constructor += " {\n"; + constructor += " // Basic quest information \n"; + constructor += " this.name = \"" + pQuestData->name + "\";\n"; + constructor += " this.id = " + std::to_string( pQuestData->id ) + ";\n\n"; + constructor += questVarStr + "\n"; + constructor += seqStr + "\n"; + constructor += rewards + "\n"; + constructor += sentities + "\n"; + constructor += " }\n"; + + + std::string classString( + "class " + className + "Def \n" + "{\n" + + constructor + + "\n" + + sceneStr + + scriptEntry + + "};\n\n" + ); + + std::string objName = className; + std::string initObj = "GLOBAL " + objName + " = " + className + "Def();\n"; + + std::ofstream outputFile; + outputFile.open( "generated/" + className + ".chai_generated" ); + outputFile << header << additional << classString << initObj; + outputFile.close(); +} + +int main() +{ + + g_log.init(); + + // std::string datLocation( "/opt/sapphire_3_15_0/bin/sqpack" ); + std::string datLocation( "C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack\\ffxiv" ); + + g_log.info( "Setting up EXD data" ); + if( !g_exdData.init( datLocation ) ) + { + g_log.fatal( "Error setting up EXD data " ); + return 0; + } + + xiv::dat::GameData data( datLocation ); + xiv::exd::ExdData eData( data ); + + auto QuestDat = g_exdData.setupDatAccess( "Quest", xiv::exd::Language::en ); + auto rows = QuestDat.get_rows(); + + for( auto row : rows ) + { + + auto questInfo = g_exdData.getQuestInfo( row.first ); + + if( questInfo->name.empty() || questInfo->name_intern.empty() ) + { + continue; + } + + size_t pos_seperator = questInfo->name_intern.find_first_of( "_" ); + + std::string folder; + + if( pos_seperator != std::string::npos ) + { + folder = questInfo->name_intern.substr( pos_seperator + 1, 3 ); + } + else + { + return 0; + } + + + + const xiv::dat::Cat& test = data.get_category( "game_script" ); + + const std::string questPath = "game_script/quest/" + folder + "/" + questInfo->name_intern + ".luab"; + + const auto &test_file = data.get_file( questPath ); + auto §ion = test_file->access_data_sections().at( 0 ); + int32_t size = *( uint32_t* ) §ion[4]; + + std::set stringList; + + uint32_t offset = 0; + + std::ofstream outputFile1; + outputFile1.open("generated/" + questInfo->name_intern + ".luab", std::ios::binary); + outputFile1.write(§ion[0], section.size()); + outputFile1.close(); + std::string command= std::string("java -jar unluac_2015_06_13.jar ") + "generated/" + questInfo->name_intern + ".luab" + ">> " + "generated/" + questInfo->name_intern + ".lua"; + system(command.c_str()); + for( ; ; ) + { + + std::string entry( §ion[offset] ); + offset += entry.size() + 1; + + if( entry.size() > 3 + && entry.find_first_not_of( "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_" ) == std::string::npos ) + { + if( entry.find( "SEQ" ) != std::string::npos + || entry.find( "QuestUI" ) != std::string::npos + || entry.find( "OnScene" ) != std::string::npos + || entry.find( "Flag" ) != std::string::npos + || entry.find( "ACTOR" ) != std::string::npos + && entry.find( "_ACTOR" ) == std::string::npos ) + if( entry.find( "HOWTO" ) == std::string::npos ) + stringList.insert( entry ); + } + + if( offset >= section.size() ) + break; + } + + + createScript( questInfo, stringList ); +//break; + } + + return 0; +} diff --git a/src/tools/quest_parser/unluac_2015_06_13.jar b/src/tools/quest_parser/unluac_2015_06_13.jar new file mode 100644 index 0000000000000000000000000000000000000000..a29884fa8c4baed6b4e5a19953a17b6e6ca870aa GIT binary patch literal 325159 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

jve~zv%chVyNi6vnc_2>fG;(uBd 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 REO@18#GdPePe6Z({|30fM6v(? literal 0 HcmV?d00001

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%0D&cN6?ro|Y@3`a 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