mirror of
https://github.com/OpenFusionProject/OpenFusion.git
synced 2024-11-26 06:50:06 +00:00
dongresource
57c9f139a2
In our original implementation, quest item drops were rolled on the spot, so the chances of getting two quest items for different missions in a single kill (where both missions have you kill the same mob) were independent of each other. When we made quest item drop chances shared between group members so players doing missions together would progress at the same rate, we accidentally linked the quest item odds of different missions together. This change makes it so that the odds are per-task, so they're shared between different group members doing the same tasks, but distinct for different tasks being done by the same player.
56 lines
1.4 KiB
C++
56 lines
1.4 KiB
C++
#pragma once
|
|
|
|
#include "servers/CNShardServer.hpp"
|
|
#include "Player.hpp"
|
|
|
|
#include "JSON.hpp"
|
|
|
|
struct Reward {
|
|
int32_t id;
|
|
int32_t itemTypes[4];
|
|
int32_t itemIds[4];
|
|
int32_t money;
|
|
int32_t fusionmatter;
|
|
|
|
Reward(int32_t id, nlohmann::json types, nlohmann::json ids, int32_t m, int32_t fm) :
|
|
id(id), money(m), fusionmatter(fm) {
|
|
for (int i = 0; i < 4; i++) {
|
|
itemTypes[i] = types[i];
|
|
itemIds[i] = ids[i];
|
|
}
|
|
};
|
|
};
|
|
|
|
struct TaskData {
|
|
/*
|
|
* TODO: We'll probably want to keep only the data the server actually needs,
|
|
* but for now RE/development is much easier if we have everything at
|
|
* our fingertips.
|
|
*/
|
|
nlohmann::json task;
|
|
|
|
TaskData(nlohmann::json t) : task(t) {}
|
|
|
|
// convenience
|
|
auto operator[](std::string s) { return task[s]; }
|
|
};
|
|
|
|
namespace Missions {
|
|
extern std::map<int32_t, Reward*> Rewards;
|
|
extern std::map<int32_t, TaskData*> Tasks;
|
|
extern nlohmann::json AvatarGrowth[37];
|
|
void init();
|
|
int findQSlot(Player *plr, int id);
|
|
|
|
bool startTask(Player* plr, int TaskID);
|
|
|
|
// checks if player doesn't have n/n quest items
|
|
void updateFusionMatter(CNSocket* sock, int fusion);
|
|
|
|
void mobKilled(CNSocket *sock, int mobid, std::map<int, int>& rolls);
|
|
|
|
void quitTask(CNSocket* sock, int32_t taskNum, bool manual);
|
|
|
|
void failInstancedMissions(CNSocket* sock);
|
|
}
|