mirror of
https://github.com/ErikasKontenis/SabrehavenServer.git
synced 2025-12-28 19:47:11 +01:00
commit newest tfs branch only for compare
This commit is contained in:
118
src/game.h
118
src/game.h
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
* Tibia GIMUD Server - a free and open-source MMORPG server emulator
|
||||
* Copyright (C) 2019 Sabrehaven and Mark Samman <mark.samman@gmail.com>
|
||||
* The Forgotten Server - a free and open-source MMORPG server emulator
|
||||
* Copyright (C) 2019 Mark Samman <mark.samman@gmail.com>
|
||||
*
|
||||
* 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
|
||||
@@ -31,6 +31,7 @@
|
||||
#include "raids.h"
|
||||
#include "npc.h"
|
||||
#include "wildcardtree.h"
|
||||
#include "quests.h"
|
||||
|
||||
class ServiceManager;
|
||||
class Creature;
|
||||
@@ -69,22 +70,6 @@ enum LightState_t {
|
||||
LIGHT_STATE_SUNRISE,
|
||||
};
|
||||
|
||||
struct RuleViolation {
|
||||
RuleViolation() = default;
|
||||
RuleViolation(uint32_t _reporterId, const std::string& _text) :
|
||||
reporterId(_reporterId),
|
||||
gamemasterId(0),
|
||||
text(_text),
|
||||
pending(true)
|
||||
{
|
||||
}
|
||||
|
||||
uint32_t reporterId;
|
||||
uint32_t gamemasterId;
|
||||
std::string text;
|
||||
bool pending;
|
||||
};
|
||||
|
||||
static constexpr int32_t EVENT_LIGHTINTERVAL = 10000;
|
||||
static constexpr int32_t EVENT_DECAYINTERVAL = 250;
|
||||
static constexpr int32_t EVENT_DECAY_BUCKETS = 4;
|
||||
@@ -97,7 +82,7 @@ static constexpr int32_t EVENT_DECAY_BUCKETS = 4;
|
||||
class Game
|
||||
{
|
||||
public:
|
||||
Game() = default;
|
||||
Game();
|
||||
~Game();
|
||||
|
||||
// non-copyable
|
||||
@@ -219,7 +204,7 @@ class Game
|
||||
* \param extendedPos If true, the creature will in first-hand be placed 2 tiles away
|
||||
* \param force If true, placing the creature will not fail because of obstacles (creatures/items)
|
||||
*/
|
||||
bool placeCreature(Creature* creature, const Position& pos, bool extendedPos = false, bool force = false);
|
||||
bool placeCreature(Creature* creature, const Position& pos, bool extendedPos = false, bool forced = false);
|
||||
|
||||
/**
|
||||
* Remove Creature from the map.
|
||||
@@ -244,7 +229,7 @@ class Game
|
||||
return playersRecord;
|
||||
}
|
||||
|
||||
void getWorldLightInfo(LightInfo& lightInfo) const;
|
||||
LightInfo getWorldLightInfo() const;
|
||||
|
||||
ReturnValue internalMoveCreature(Creature* creature, Direction direction, uint32_t flags = 0);
|
||||
ReturnValue internalMoveCreature(Creature& creature, Tile& toTile, uint32_t flags = 0);
|
||||
@@ -322,16 +307,19 @@ class Game
|
||||
* \param text The text to say
|
||||
*/
|
||||
bool internalCreatureSay(Creature* creature, SpeakClasses type, const std::string& text,
|
||||
bool ghostMode, SpectatorVec* listPtr = nullptr, const Position* pos = nullptr);
|
||||
bool ghostMode, SpectatorVec* spectatorsPtr = nullptr, const Position* pos = nullptr);
|
||||
|
||||
void loadPlayersRecord();
|
||||
void checkPlayersRecord();
|
||||
|
||||
void sendGuildMotd(uint32_t playerId);
|
||||
void kickPlayer(uint32_t playerId, bool displayEffect);
|
||||
void playerReportBug(uint32_t playerId, const std::string& message);
|
||||
void playerReportBug(uint32_t playerId, const std::string& message, const Position& position, uint8_t category);
|
||||
void playerDebugAssert(uint32_t playerId, const std::string& assertLine, const std::string& date, const std::string& description, const std::string& comment);
|
||||
void playerAnswerModalWindow(uint32_t playerId, uint32_t modalWindowId, uint8_t button, uint8_t choice);
|
||||
void playerReportRuleViolation(uint32_t playerId, const std::string& targetName, uint8_t reportType, uint8_t reportReason, const std::string& comment, const std::string& translation);
|
||||
|
||||
bool internalStartTrade(Player* player, Player* partner, Item* tradeItem);
|
||||
bool internalStartTrade(Player* player, Player* tradePartner, Item* tradeItem);
|
||||
void internalCloseTrade(Player* player);
|
||||
bool playerBroadcastMessage(Player* player, const std::string& text) const;
|
||||
void broadcastMessage(const std::string& text, MessageClasses type) const;
|
||||
@@ -340,10 +328,11 @@ class Game
|
||||
void playerMoveThing(uint32_t playerId, const Position& fromPos, uint16_t spriteId, uint8_t fromStackPos,
|
||||
const Position& toPos, uint8_t count);
|
||||
void playerMoveCreatureByID(uint32_t playerId, uint32_t movingCreatureId, const Position& movingCreatureOrigPos, const Position& toPos);
|
||||
void playerMoveCreature(Player* playerId, Creature* movingCreature, const Position& movingCreatureOrigPos, Tile* toTile);
|
||||
void playerMoveCreature(Player* player, Creature* movingCreature, const Position& movingCreatureOrigPos, Tile* toTile);
|
||||
void playerMoveItemByPlayerID(uint32_t playerId, const Position& fromPos, uint16_t spriteId, uint8_t fromStackPos, const Position& toPos, uint8_t count);
|
||||
void playerMoveItem(Player* player, const Position& fromPos,
|
||||
uint16_t spriteId, uint8_t fromStackPos, const Position& toPos, uint8_t count, Item* item, Cylinder* toCylinder);
|
||||
void playerEquipItem(uint32_t playerId, uint16_t spriteId);
|
||||
void playerMove(uint32_t playerId, Direction direction);
|
||||
void playerCreatePrivateChannel(uint32_t playerId);
|
||||
void playerChannelInvite(uint32_t playerId, const std::string& name);
|
||||
@@ -352,6 +341,7 @@ class Game
|
||||
void playerOpenChannel(uint32_t playerId, uint16_t channelId);
|
||||
void playerCloseChannel(uint32_t playerId, uint16_t channelId);
|
||||
void playerOpenPrivateChannel(uint32_t playerId, std::string& receiver);
|
||||
void playerCloseNpcChannel(uint32_t playerId);
|
||||
void playerReceivePing(uint32_t playerId);
|
||||
void playerReceivePingBack(uint32_t playerId);
|
||||
void playerAutoWalk(uint32_t playerId, const std::forward_list<Direction>& listDir);
|
||||
@@ -365,23 +355,33 @@ class Game
|
||||
void playerUpdateContainer(uint32_t playerId, uint8_t cid);
|
||||
void playerRotateItem(uint32_t playerId, const Position& pos, uint8_t stackPos, const uint16_t spriteId);
|
||||
void playerWriteItem(uint32_t playerId, uint32_t windowTextId, const std::string& text);
|
||||
void playerBrowseField(uint32_t playerId, const Position& pos);
|
||||
void playerSeekInContainer(uint32_t playerId, uint8_t containerId, uint16_t index);
|
||||
void playerUpdateHouseWindow(uint32_t playerId, uint8_t listId, uint32_t windowTextId, const std::string& text);
|
||||
void playerRequestTrade(uint32_t playerId, const Position& pos, uint8_t stackPos,
|
||||
uint32_t tradePlayerId, uint16_t spriteId);
|
||||
void playerAcceptTrade(uint32_t playerId);
|
||||
void playerLookInTrade(uint32_t playerId, bool lookAtCounterOffer, uint8_t index);
|
||||
void playerPurchaseItem(uint32_t playerId, uint16_t spriteId, uint8_t count, uint8_t amount,
|
||||
bool ignoreCap = false, bool inBackpacks = false);
|
||||
void playerSellItem(uint32_t playerId, uint16_t spriteId, uint8_t count,
|
||||
uint8_t amount, bool ignoreEquipped = false);
|
||||
void playerCloseShop(uint32_t playerId);
|
||||
void playerLookInShop(uint32_t playerId, uint16_t spriteId, uint8_t count);
|
||||
void playerCloseTrade(uint32_t playerId);
|
||||
void playerSetAttackedCreature(uint32_t playerId, uint32_t creatureId);
|
||||
void playerFollowCreature(uint32_t playerId, uint32_t creatureId);
|
||||
void playerCancelAttackAndFollow(uint32_t playerId);
|
||||
void playerSetFightModes(uint32_t playerId, fightMode_t fightMode, chaseMode_t chaseMode, bool secureMode);
|
||||
void playerSetFightModes(uint32_t playerId, fightMode_t fightMode, bool chaseMode, bool secureMode);
|
||||
void playerLookAt(uint32_t playerId, const Position& pos, uint8_t stackPos);
|
||||
void playerLookInBattleList(uint32_t playerId, uint32_t creatureId);
|
||||
void playerRequestAddVip(uint32_t playerId, const std::string& name);
|
||||
void playerRequestRemoveVip(uint32_t playerId, uint32_t guid);
|
||||
void playerRequestEditVip(uint32_t playerId, uint32_t guid, const std::string& description, uint32_t icon, bool notify);
|
||||
void playerTurn(uint32_t playerId, Direction dir);
|
||||
void playerRequestOutfit(uint32_t playerId);
|
||||
void playerShowQuestLog(uint32_t playerId);
|
||||
void playerShowQuestLine(uint32_t playerId, uint16_t questId);
|
||||
void playerSay(uint32_t playerId, uint16_t channelId, SpeakClasses type,
|
||||
const std::string& receiver, const std::string& text);
|
||||
void playerChangeOutfit(uint32_t playerId, Outfit_t outfit);
|
||||
@@ -391,15 +391,18 @@ class Game
|
||||
void playerPassPartyLeadership(uint32_t playerId, uint32_t newLeaderId);
|
||||
void playerLeaveParty(uint32_t playerId);
|
||||
void playerEnableSharedPartyExperience(uint32_t playerId, bool sharedExpActive);
|
||||
void playerProcessRuleViolationReport(uint32_t playerId, const std::string& name);
|
||||
void playerCloseRuleViolationReport(uint32_t playerId, const std::string& name);
|
||||
void playerCancelRuleViolationReport(uint32_t playerId);
|
||||
void playerReportRuleViolationReport(Player* player, const std::string& text);
|
||||
void playerContinueRuleViolationReport(Player* player, const std::string& text);
|
||||
void playerToggleMount(uint32_t playerId, bool mount);
|
||||
void playerLeaveMarket(uint32_t playerId);
|
||||
void playerBrowseMarket(uint32_t playerId, uint16_t spriteId);
|
||||
void playerBrowseMarketOwnOffers(uint32_t playerId);
|
||||
void playerBrowseMarketOwnHistory(uint32_t playerId);
|
||||
void playerCreateMarketOffer(uint32_t playerId, uint8_t type, uint16_t spriteId, uint16_t amount, uint32_t price, bool anonymous);
|
||||
void playerCancelMarketOffer(uint32_t playerId, uint32_t timestamp, uint16_t counter);
|
||||
void playerAcceptMarketOffer(uint32_t playerId, uint32_t timestamp, uint16_t counter, uint16_t amount);
|
||||
|
||||
void parsePlayerExtendedOpcode(uint32_t playerId, uint8_t opcode, const std::string& buffer);
|
||||
|
||||
void closeRuleViolationReport(Player* player);
|
||||
void cancelRuleViolationReport(Player* player);
|
||||
std::forward_list<Item*> getMarketItemList(uint16_t wareId, uint16_t sufficientCount, DepotChest* depotChest, Inbox* inbox);
|
||||
|
||||
static void updatePremium(Account& account);
|
||||
|
||||
@@ -410,14 +413,17 @@ class Game
|
||||
|
||||
bool canThrowObjectTo(const Position& fromPos, const Position& toPos, bool checkLineOfSight = true,
|
||||
int32_t rangex = Map::maxClientViewportX, int32_t rangey = Map::maxClientViewportY) const;
|
||||
bool isSightClear(const Position& fromPos, const Position& toPos, bool sameFloor) const;
|
||||
bool isSightClear(const Position& fromPos, const Position& toPos, bool floorCheck) const;
|
||||
|
||||
void changeSpeed(Creature* creature, int32_t varSpeedDelta);
|
||||
void internalCreatureChangeOutfit(Creature* creature, const Outfit_t& oufit);
|
||||
void internalCreatureChangeOutfit(Creature* creature, const Outfit_t& outfit);
|
||||
void internalCreatureChangeVisible(Creature* creature, bool visible);
|
||||
void changeLight(const Creature* creature);
|
||||
void updateCreatureSkull(const Creature* player);
|
||||
void updateCreatureSkull(const Creature* creature);
|
||||
void updatePlayerShield(Player* player);
|
||||
void updatePlayerHelpers(const Player& player);
|
||||
void updateCreatureType(Creature* creature);
|
||||
void updateCreatureWalkthrough(const Creature* creature);
|
||||
|
||||
GameState_t getGameState() const;
|
||||
void setGameState(GameState_t newState);
|
||||
@@ -439,14 +445,11 @@ class Game
|
||||
|
||||
//animation help functions
|
||||
void addCreatureHealth(const Creature* target);
|
||||
static void addCreatureHealth(const SpectatorVec& list, const Creature* target);
|
||||
static void addCreatureHealth(const SpectatorVec& spectators, const Creature* target);
|
||||
void addMagicEffect(const Position& pos, uint8_t effect);
|
||||
static void addMagicEffect(const SpectatorVec& list, const Position& pos, uint8_t effect);
|
||||
static void addMagicEffect(const SpectatorVec& spectators, const Position& pos, uint8_t effect);
|
||||
void addDistanceEffect(const Position& fromPos, const Position& toPos, uint8_t effect);
|
||||
static void addDistanceEffect(const SpectatorVec& list, const Position& fromPos, const Position& toPos, uint8_t effect);
|
||||
void addAnimatedText(const Position& pos, uint8_t color, const std::string& text);
|
||||
static void addAnimatedText(const SpectatorVec& list, const Position& pos, uint8_t color, const std::string& text);
|
||||
void addMonsterSayText(const Position& pos, const std::string& text);
|
||||
static void addDistanceEffect(const SpectatorVec& spectators, const Position& fromPos, const Position& toPos, uint8_t effect);
|
||||
|
||||
void startDecay(Item* item);
|
||||
int32_t getLightHour() const {
|
||||
@@ -462,7 +465,8 @@ class Game
|
||||
uint32_t getMotdNum() const { return motdNum; }
|
||||
void incrementMotdNum() { motdNum++; }
|
||||
|
||||
const std::unordered_map<uint32_t, RuleViolation>& getRuleViolationReports() const { return ruleViolations; }
|
||||
void sendOfflineTrainingDialog(Player* player);
|
||||
|
||||
const std::unordered_map<uint32_t, Player*>& getPlayers() const { return players; }
|
||||
const std::map<uint32_t, Npc*>& getNpcs() const { return npcs; }
|
||||
|
||||
@@ -472,45 +476,55 @@ class Game
|
||||
void addNpc(Npc* npc);
|
||||
void removeNpc(Npc* npc);
|
||||
|
||||
void addMonster(Monster* npc);
|
||||
void removeMonster(Monster* npc);
|
||||
void addMonster(Monster* monster);
|
||||
void removeMonster(Monster* monster);
|
||||
|
||||
Guild* getGuild(uint32_t id) const;
|
||||
void addGuild(Guild* guild);
|
||||
void removeGuild(uint32_t guildId);
|
||||
void decreaseBrowseFieldRef(const Position& pos);
|
||||
|
||||
std::unordered_map<Tile*, Container*> browseFields;
|
||||
|
||||
void internalRemoveItems(std::vector<Item*> itemList, uint32_t amount, bool stackable);
|
||||
|
||||
BedItem* getBedBySleeper(uint32_t guid) const;
|
||||
void setBedSleeper(BedItem* bed, uint32_t guid);
|
||||
void removeBedSleeper(uint32_t guid);
|
||||
|
||||
Item* getUniqueItem(uint16_t uniqueId);
|
||||
bool addUniqueItem(uint16_t uniqueId, Item* item);
|
||||
void removeUniqueItem(uint16_t uniqueId);
|
||||
|
||||
bool reload(ReloadTypes_t reloadType);
|
||||
|
||||
Groups groups;
|
||||
Map map;
|
||||
Mounts mounts;
|
||||
Raids raids;
|
||||
Quests quests;
|
||||
|
||||
protected:
|
||||
std::forward_list<Item*> toDecayItems;
|
||||
|
||||
private:
|
||||
bool playerSaySpell(Player* player, SpeakClasses type, const std::string& text);
|
||||
void playerWhisper(Player* player, const std::string& text);
|
||||
bool playerYell(Player* player, const std::string& text);
|
||||
bool playerSpeakTo(Player* player, SpeakClasses type, const std::string& receiver, const std::string& text);
|
||||
void playerSpeakToNpc(Player* player, const std::string& text);
|
||||
|
||||
void checkDecay();
|
||||
void internalDecayItem(Item* item);
|
||||
|
||||
//list of reported rule violations, for correct channel listing
|
||||
std::unordered_map<uint32_t, RuleViolation> ruleViolations;
|
||||
|
||||
std::unordered_map<uint32_t, Player*> players;
|
||||
std::unordered_map<std::string, Player*> mappedPlayerNames;
|
||||
std::unordered_map<uint32_t, Guild*> guilds;
|
||||
std::unordered_map<uint16_t, Item*> uniqueItems;
|
||||
std::map<uint32_t, uint32_t> stages;
|
||||
|
||||
std::list<Item*> decayItems[EVENT_DECAY_BUCKETS];
|
||||
std::list<Creature*> checkCreatureLists[EVENT_CREATURECOUNT];
|
||||
|
||||
std::forward_list<Item*> toDecayItems;
|
||||
|
||||
std::vector<Creature*> ToReleaseCreatures;
|
||||
std::vector<Item*> ToReleaseItems;
|
||||
|
||||
@@ -526,6 +540,8 @@ class Game
|
||||
|
||||
std::map<uint32_t, BedItem*> bedSleepersMap;
|
||||
|
||||
ModalWindow offlineTrainingWindow { std::numeric_limits<uint32_t>::max(), "Choose a Skill", "Please choose a skill:" };
|
||||
|
||||
static constexpr int32_t LIGHT_LEVEL_DAY = 250;
|
||||
static constexpr int32_t LIGHT_LEVEL_NIGHT = 40;
|
||||
static constexpr int32_t SUNSET = 1305;
|
||||
|
||||
Reference in New Issue
Block a user