mirror of
https://github.com/OpenFusionProject/OpenFusion.git
synced 2024-11-24 22:11:04 +00:00
Compare commits
1 Commits
0d26ff5370
...
b1613639f5
Author | SHA1 | Date | |
---|---|---|---|
|
b1613639f5 |
@ -359,19 +359,23 @@ static void npcRotateCommand(std::string full, std::vector<std::string>& args, C
|
|||||||
int angle = (plr->angle + 180) % 360;
|
int angle = (plr->angle + 180) % 360;
|
||||||
NPCManager::updateNPCPosition(npc->id, npc->x, npc->y, npc->z, npc->instanceID, angle);
|
NPCManager::updateNPCPosition(npc->id, npc->x, npc->y, npc->z, npc->instanceID, angle);
|
||||||
|
|
||||||
bool isGruntworkNpc = true;
|
// if it's a gruntwork NPC, rotate in-place
|
||||||
|
if (TableData::RunningMobs.find(npc->id) != TableData::RunningMobs.end()) {
|
||||||
|
NPCManager::updateNPCPosition(npc->id, npc->x, npc->y, npc->z, npc->instanceID, angle);
|
||||||
|
|
||||||
// add a rotation entry to the gruntwork file, unless it's already a gruntwork NPC
|
Chat::sendServerMessage(sock, "[NPCR] Successfully set angle to " + std::to_string(angle) + " for gruntwork NPC "
|
||||||
if (TableData::RunningMobs.find(npc->id) == TableData::RunningMobs.end()) {
|
+ std::to_string(npc->id));
|
||||||
|
} else {
|
||||||
TableData::RunningNPCRotations[npc->id] = angle;
|
TableData::RunningNPCRotations[npc->id] = angle;
|
||||||
isGruntworkNpc = false;
|
|
||||||
|
Chat::sendServerMessage(sock, "[NPCR] Successfully set angle to " + std::to_string(angle) + " for NPC "
|
||||||
|
+ std::to_string(npc->id));
|
||||||
}
|
}
|
||||||
|
|
||||||
Chat::sendServerMessage(sock, "[NPCR] Successfully set angle to " + std::to_string(angle) +
|
// update rotation clientside
|
||||||
" for " + (isGruntworkNpc ? "gruntwork " : "") + "NPC " + std::to_string(npc->id));
|
INITSTRUCT(sP_FE2CL_NPC_ENTER, pkt);
|
||||||
|
pkt.NPCAppearanceData = npc->getAppearanceData();
|
||||||
// update rotation clientside by refreshing the player's chunks (same as the /refresh command)
|
sock->sendPacket(pkt, P_FE2CL_NPC_ENTER);
|
||||||
PlayerManager::updatePlayerPositionForWarp(sock, plr->x, plr->y, plr->z, plr->instanceID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void refreshCommand(std::string full, std::vector<std::string>& args, CNSocket* sock) {
|
static void refreshCommand(std::string full, std::vector<std::string>& args, CNSocket* sock) {
|
||||||
|
54
src/Eggs.cpp
54
src/Eggs.cpp
@ -26,7 +26,6 @@ void Eggs::eggBuffPlayer(CNSocket* sock, int skillId, int eggId, int duration) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SkillResult result = SkillResult();
|
|
||||||
SkillData* skill = &Abilities::SkillTable[skillId];
|
SkillData* skill = &Abilities::SkillTable[skillId];
|
||||||
if(skill->drainType == SkillDrainType::PASSIVE) {
|
if(skill->drainType == SkillDrainType::PASSIVE) {
|
||||||
// apply buff
|
// apply buff
|
||||||
@ -51,57 +50,12 @@ void Eggs::eggBuffPlayer(CNSocket* sock, int skillId, int eggId, int duration) {
|
|||||||
// no-op
|
// no-op
|
||||||
},
|
},
|
||||||
&eggBuff);
|
&eggBuff);
|
||||||
|
|
||||||
sSkillResult_Buff resultBuff{};
|
|
||||||
resultBuff.eCT = plr->getCharType();
|
|
||||||
resultBuff.iID = plr->getID();
|
|
||||||
resultBuff.bProtected = false;
|
|
||||||
resultBuff.iConditionBitFlag = plr->getCompositeCondition();
|
|
||||||
result = SkillResult(sizeof(sSkillResult_Buff), &resultBuff);
|
|
||||||
} else {
|
|
||||||
int value = plr->getMaxHP() * skill->values[0][0] / 1000;
|
|
||||||
sSkillResult_Damage resultDamage{};
|
|
||||||
sSkillResult_Heal_HP resultHeal{};
|
|
||||||
switch(skill->skillType)
|
|
||||||
{
|
|
||||||
case SkillType::DAMAGE:
|
|
||||||
resultDamage.bProtected = false;
|
|
||||||
resultDamage.eCT = plr->getCharType();
|
|
||||||
resultDamage.iID = plr->getID();
|
|
||||||
resultDamage.iDamage = plr->takeDamage(src, value);
|
|
||||||
resultDamage.iHP = plr->getCurrentHP();
|
|
||||||
result = SkillResult(sizeof(sSkillResult_Damage), &resultDamage);
|
|
||||||
break;
|
|
||||||
case SkillType::HEAL_HP:
|
|
||||||
resultHeal.eCT = plr->getCharType();
|
|
||||||
resultHeal.iID = plr->getID();
|
|
||||||
resultHeal.iHealHP = plr->heal(src, value);
|
|
||||||
resultHeal.iHP = plr->getCurrentHP();
|
|
||||||
result = SkillResult(sizeof(sSkillResult_Heal_HP), &resultHeal);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
std::cout << "[WARN] oops, egg with active skill type " << (int)skill->skillType << " unhandled";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// initialize response struct
|
// use skill
|
||||||
size_t resplen = sizeof(sP_FE2CL_NPC_SKILL_HIT) + result.size;
|
std::vector<ICombatant*> targets;
|
||||||
uint8_t respbuf[CN_PACKET_BUFFER_SIZE];
|
targets.push_back(dynamic_cast<ICombatant*>(plr));
|
||||||
memset(respbuf, 0, resplen);
|
Abilities::useNPCSkill(src, skillId, targets);
|
||||||
|
|
||||||
sP_FE2CL_NPC_SKILL_HIT* pkt = (sP_FE2CL_NPC_SKILL_HIT*)respbuf;
|
|
||||||
pkt->iNPC_ID = eggId;
|
|
||||||
pkt->iSkillID = skillId;
|
|
||||||
pkt->eST = (int32_t)skill->skillType;
|
|
||||||
pkt->iTargetCnt = 1;
|
|
||||||
|
|
||||||
if(result.size > 0) {
|
|
||||||
void* attached = (void*)(pkt + 1);
|
|
||||||
memcpy(attached, result.payload, result.size);
|
|
||||||
}
|
|
||||||
|
|
||||||
NPCManager::sendToViewable(src.getEntity(), pkt, P_FE2CL_NPC_SKILL_HIT, resplen);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void eggStep(CNServer* serv, time_t currTime) {
|
static void eggStep(CNServer* serv, time_t currTime) {
|
||||||
|
@ -416,7 +416,6 @@ static void revivePlayer(CNSocket* sock, CNPacketData* data) {
|
|||||||
|
|
||||||
default: // plain respawn
|
default: // plain respawn
|
||||||
plr->HP = PC_MAXHEALTH(plr->level) / 2;
|
plr->HP = PC_MAXHEALTH(plr->level) / 2;
|
||||||
plr->clearBuffs(false);
|
|
||||||
// fallthrough
|
// fallthrough
|
||||||
case ePCRegenType::Unstick: // warp away
|
case ePCRegenType::Unstick: // warp away
|
||||||
move = true;
|
move = true;
|
||||||
|
Loading…
Reference in New Issue
Block a user