mirror of
https://github.com/OpenFusionProject/OpenFusion.git
synced 2024-11-22 21:40:05 +00:00
added basic player buffs implementation
This commit is contained in:
parent
2744ed64e3
commit
f2ff4c7f4d
@ -436,6 +436,25 @@ void tasksCommand(std::string full, std::vector<std::string>& args, CNSocket* so
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void buffCommand(std::string full, std::vector<std::string>& args, CNSocket* sock) {
|
||||||
|
if (args.size() < 3) {
|
||||||
|
ChatManager::sendServerMessage(sock, "/buff: no skill Id and duration time specified");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* tmp;
|
||||||
|
int skillId = std::strtol(args[1].c_str(), &tmp, 10);
|
||||||
|
if (*tmp)
|
||||||
|
return;
|
||||||
|
int duration = std::strtol(args[2].c_str(), &tmp, 10);
|
||||||
|
if (*tmp)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (NPCManager::eggBuffPlayer(sock, skillId, duration)<0)
|
||||||
|
ChatManager::sendServerMessage(sock, "/buff: unknown skill Id");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void notifyCommand(std::string full, std::vector<std::string>& args, CNSocket* sock) {
|
void notifyCommand(std::string full, std::vector<std::string>& args, CNSocket* sock) {
|
||||||
Player *plr = PlayerManager::getPlayer(sock);
|
Player *plr = PlayerManager::getPlayer(sock);
|
||||||
|
|
||||||
@ -478,6 +497,7 @@ void ChatManager::init() {
|
|||||||
registerCommand("population", 100, populationCommand, "check how many players are online");
|
registerCommand("population", 100, populationCommand, "check how many players are online");
|
||||||
registerCommand("refresh", 100, refreshCommand, "teleport yourself to your current location");
|
registerCommand("refresh", 100, refreshCommand, "teleport yourself to your current location");
|
||||||
registerCommand("minfo", 30, minfoCommand, "show details of the current mission and task.");
|
registerCommand("minfo", 30, minfoCommand, "show details of the current mission and task.");
|
||||||
|
registerCommand("buff", 50, buffCommand, "give yourself a buff effect");
|
||||||
registerCommand("tasks", 30, tasksCommand, "list all active missions and their respective task ids.");
|
registerCommand("tasks", 30, tasksCommand, "list all active missions and their respective task ids.");
|
||||||
registerCommand("notify", 30, notifyCommand, "receive a message whenever a player joins the server");
|
registerCommand("notify", 30, notifyCommand, "receive a message whenever a player joins the server");
|
||||||
registerCommand("players", 30, playersCommand, "print all players on the server");
|
registerCommand("players", 30, playersCommand, "print all players on the server");
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include "MobManager.hpp"
|
#include "MobManager.hpp"
|
||||||
#include "MissionManager.hpp"
|
#include "MissionManager.hpp"
|
||||||
#include "ChunkManager.hpp"
|
#include "ChunkManager.hpp"
|
||||||
|
#include "NanoManager.hpp"
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -18,6 +19,8 @@
|
|||||||
std::map<int32_t, BaseNPC*> NPCManager::NPCs;
|
std::map<int32_t, BaseNPC*> NPCManager::NPCs;
|
||||||
std::map<int32_t, WarpLocation> NPCManager::Warps;
|
std::map<int32_t, WarpLocation> NPCManager::Warps;
|
||||||
std::vector<WarpLocation> NPCManager::RespawnPoints;
|
std::vector<WarpLocation> NPCManager::RespawnPoints;
|
||||||
|
/// Player Id, CBFlag -> remaining time
|
||||||
|
std::map<std::pair<int32_t, int32_t>, time_t> NPCManager::EggBuffs;
|
||||||
nlohmann::json NPCManager::NPCData;
|
nlohmann::json NPCManager::NPCData;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -648,3 +651,49 @@ BaseNPC* NPCManager::getNearestNPC(std::vector<Chunk*> chunks, int X, int Y, int
|
|||||||
}
|
}
|
||||||
return npc;
|
return npc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int NPCManager::eggBuffPlayer(CNSocket* sock, int skillId, int duration) {
|
||||||
|
|
||||||
|
Player* plr = PlayerManager::getPlayer(sock);
|
||||||
|
if (plr == nullptr)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
int32_t CBFlag = -1, iValue, CSTB;
|
||||||
|
|
||||||
|
// find the right passive power data
|
||||||
|
for (auto& pwr : NanoManager::PassivePowers)
|
||||||
|
if (pwr.powers.count(skillId)) {
|
||||||
|
CBFlag = pwr.iCBFlag;
|
||||||
|
CSTB = pwr.eCharStatusTimeBuffID;
|
||||||
|
iValue = pwr.iValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CBFlag < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
std::pair<int32_t, int32_t> key = std::make_pair(plr->iID, CBFlag);
|
||||||
|
|
||||||
|
// if player doesn't have this buff yet
|
||||||
|
if (EggBuffs.find(key) == EggBuffs.end())
|
||||||
|
{
|
||||||
|
// save new cbflag serverside
|
||||||
|
plr->iEggConditionBitFlag |= CBFlag;
|
||||||
|
|
||||||
|
// send buff update package
|
||||||
|
INITSTRUCT(sP_FE2CL_PC_BUFF_UPDATE, updatePacket);
|
||||||
|
updatePacket.eCSTB = CSTB; // eCharStatusTimeBuffID
|
||||||
|
updatePacket.eTBU = 1; // eTimeBuffUpdate 1 means Add
|
||||||
|
updatePacket.eTBT = 3; // eTimeBuffType 3 means egg
|
||||||
|
updatePacket.TimeBuff.iValue = iValue;
|
||||||
|
int32_t updatedFlag = plr->iConditionBitFlag | plr->iGroupConditionBitFlag | plr->iEggConditionBitFlag;
|
||||||
|
updatePacket.iConditionBitFlag = updatedFlag;
|
||||||
|
|
||||||
|
sock->sendPacket((void*)&updatePacket, P_FE2CL_PC_BUFF_UPDATE, sizeof(sP_FE2CL_PC_BUFF_UPDATE));
|
||||||
|
}
|
||||||
|
|
||||||
|
// save the buff serverside;
|
||||||
|
EggBuffs[key] = duration;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -19,7 +19,8 @@ struct WarpLocation {
|
|||||||
namespace NPCManager {
|
namespace NPCManager {
|
||||||
extern std::map<int32_t, BaseNPC*> NPCs;
|
extern std::map<int32_t, BaseNPC*> NPCs;
|
||||||
extern std::map<int32_t, WarpLocation> Warps;
|
extern std::map<int32_t, WarpLocation> Warps;
|
||||||
extern std::vector<WarpLocation> RespawnPoints;
|
extern std::vector<WarpLocation> RespawnPoints;
|
||||||
|
extern std::map<std::pair<int32_t, int32_t>, time_t> EggBuffs;
|
||||||
extern nlohmann::json NPCData;
|
extern nlohmann::json NPCData;
|
||||||
extern int32_t nextId;
|
extern int32_t nextId;
|
||||||
void init();
|
void init();
|
||||||
@ -50,4 +51,7 @@ namespace NPCManager {
|
|||||||
void handleWarp(CNSocket* sock, int32_t warpId);
|
void handleWarp(CNSocket* sock, int32_t warpId);
|
||||||
|
|
||||||
BaseNPC* getNearestNPC(std::vector<Chunk*> chunks, int X, int Y, int Z);
|
BaseNPC* getNearestNPC(std::vector<Chunk*> chunks, int X, int Y, int Z);
|
||||||
|
|
||||||
|
/// returns -1 on fail
|
||||||
|
int eggBuffPlayer(CNSocket* sock, int skillId, int duration);
|
||||||
}
|
}
|
||||||
|
@ -800,7 +800,7 @@ void NanoManager::nanoBuff(CNSocket* sock, int16_t nanoId, int skillId, int16_t
|
|||||||
pkt1.eCSTB = eCharStatusTimeBuffID; // eCharStatusTimeBuffID
|
pkt1.eCSTB = eCharStatusTimeBuffID; // eCharStatusTimeBuffID
|
||||||
pkt1.eTBU = 1; // eTimeBuffUpdate
|
pkt1.eTBU = 1; // eTimeBuffUpdate
|
||||||
pkt1.eTBT = 1; // eTimeBuffType 1 means nano
|
pkt1.eTBT = 1; // eTimeBuffType 1 means nano
|
||||||
pkt1.iConditionBitFlag = bitFlag | varPlr->iConditionBitFlag;
|
pkt1.iConditionBitFlag = bitFlag | varPlr->iConditionBitFlag | varPlr->iEggConditionBitFlag;
|
||||||
|
|
||||||
if (iValue > 0)
|
if (iValue > 0)
|
||||||
pkt1.TimeBuff.iValue = iValue;
|
pkt1.TimeBuff.iValue = iValue;
|
||||||
@ -852,7 +852,7 @@ void NanoManager::nanoUnbuff(CNSocket* sock, int32_t iCBFlag, int16_t eCharStatu
|
|||||||
resp1.eCSTB = eCharStatusTimeBuffID; // eCharStatusTimeBuffID
|
resp1.eCSTB = eCharStatusTimeBuffID; // eCharStatusTimeBuffID
|
||||||
resp1.eTBU = 2; // eTimeBuffUpdate
|
resp1.eTBU = 2; // eTimeBuffUpdate
|
||||||
resp1.eTBT = 1; // eTimeBuffType 1 means nano
|
resp1.eTBT = 1; // eTimeBuffType 1 means nano
|
||||||
resp1.iConditionBitFlag = bitFlag | varPlr->iConditionBitFlag;
|
resp1.iConditionBitFlag = bitFlag | varPlr->iConditionBitFlag | varPlr->iEggConditionBitFlag;
|
||||||
|
|
||||||
if (iValue > 0)
|
if (iValue > 0)
|
||||||
resp1.TimeBuff.iValue = iValue;
|
resp1.TimeBuff.iValue = iValue;
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
#include "CNProtocol.hpp"
|
#include "CNProtocol.hpp"
|
||||||
#include "CNStructs.hpp"
|
#include "CNStructs.hpp"
|
||||||
@ -69,6 +70,8 @@ struct Player {
|
|||||||
int32_t groupIDs[4];
|
int32_t groupIDs[4];
|
||||||
int32_t iGroupConditionBitFlag;
|
int32_t iGroupConditionBitFlag;
|
||||||
|
|
||||||
|
int32_t iEggConditionBitFlag;
|
||||||
|
|
||||||
bool notify;
|
bool notify;
|
||||||
|
|
||||||
bool buddiesSynced;
|
bool buddiesSynced;
|
||||||
|
Loading…
Reference in New Issue
Block a user