1
This commit is contained in:
parent
7fbeb35d8e
commit
0dae85dd30
@ -5,6 +5,7 @@
|
|||||||
#include "human.h"
|
#include "human.h"
|
||||||
#include "room.h"
|
#include "room.h"
|
||||||
#include "collider.h"
|
#include "collider.h"
|
||||||
|
#include "skill.h"
|
||||||
|
|
||||||
int Buff::GetLeftTime()
|
int Buff::GetLeftTime()
|
||||||
{
|
{
|
||||||
@ -23,3 +24,96 @@ void Buff::FillMFBuff(cs::MFBuff* buff_pb)
|
|||||||
buff_pb->set_left_time(GetLeftTime());
|
buff_pb->set_left_time(GetLeftTime());
|
||||||
buff_pb->set_lasting_time(GetLastingTime());
|
buff_pb->set_lasting_time(GetLastingTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Buff::ProcDelayAddBuff(Creature* caster)
|
||||||
|
{
|
||||||
|
if (caster) {
|
||||||
|
SkillCasterState* caster_state = new SkillCasterState;
|
||||||
|
caster->FillSkillCasterState(caster_state);
|
||||||
|
owner->room->xtimer.AddDeadLineTimerAndAttach
|
||||||
|
(
|
||||||
|
SERVER_FRAME_RATE * meta->param1,
|
||||||
|
a8::XParams()
|
||||||
|
.SetSender(owner)
|
||||||
|
.SetParam1(caster_state)
|
||||||
|
.SetParam2(meta->param2)
|
||||||
|
.SetParam3(((Creature*)caster)->CurrentSkill()->meta),
|
||||||
|
[] (const a8::XParams& param)
|
||||||
|
{
|
||||||
|
Creature* receiver = (Creature*)param.sender.GetUserData();
|
||||||
|
SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData();
|
||||||
|
if (caster_state->caster.Get()) {
|
||||||
|
int buff_id = param.param2;
|
||||||
|
MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData();
|
||||||
|
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
|
||||||
|
if (buff_meta &&
|
||||||
|
caster_state->caster.Get()->CurrentSkill() &&
|
||||||
|
skill == caster_state->caster.Get()->CurrentSkill()->meta) {
|
||||||
|
SkillCasterState old_caster_state;
|
||||||
|
caster_state->caster.Get()->FillSkillCasterState(&old_caster_state);
|
||||||
|
caster_state->caster.Get()->RecoverSkillCasterState(caster_state);
|
||||||
|
receiver->AddBuff(caster_state->caster.Get(), buff_meta, 1, skill);
|
||||||
|
caster_state->caster.Get()->RecoverSkillCasterState(&old_caster_state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
&xtimer_attacher.timer_list_,
|
||||||
|
[] (const a8::XParams& param)
|
||||||
|
{
|
||||||
|
SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData();
|
||||||
|
delete caster_state;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Buff::ProcIntervalAddBuff(Creature* caster)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
if (caster) {
|
||||||
|
SkillCasterState* caster_state = new SkillCasterState;
|
||||||
|
caster->FillSkillCasterState(caster_state);
|
||||||
|
room->xtimer.AddRepeatTimerAndAttach
|
||||||
|
(
|
||||||
|
buff->meta->param1 / FRAME_RATE_MS,
|
||||||
|
a8::XParams()
|
||||||
|
.SetSender(this)
|
||||||
|
.SetParam1(caster_state)
|
||||||
|
.SetParam2(buff->meta)
|
||||||
|
.SetParam3(caster->CurrentSkill() ? caster->CurrentSkill()->meta : nullptr),
|
||||||
|
[] (const a8::XParams& param)
|
||||||
|
{
|
||||||
|
Creature* receiver = (Creature*)param.sender.GetUserData();
|
||||||
|
SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData();
|
||||||
|
if (caster_state->caster.Get()) {
|
||||||
|
int buff_id = param.param2;
|
||||||
|
MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData();
|
||||||
|
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
|
||||||
|
if (buff_meta &&
|
||||||
|
(!skill ||
|
||||||
|
(
|
||||||
|
caster_state->caster.Get()->CurrentSkill() &&
|
||||||
|
skill == caster_state->caster.Get()->CurrentSkill()->meta)
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
SkillCasterState old_caster_state;
|
||||||
|
caster_state->caster.Get()->FillSkillCasterState(&old_caster_state);
|
||||||
|
caster_state->caster.Get()->RecoverSkillCasterState(caster_state);
|
||||||
|
receiver->AddBuff(caster_state->caster.Get(), buff_meta, 1, skill);
|
||||||
|
caster_state->caster.Get()->RecoverSkillCasterState(&old_caster_state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
&buff->xtimer_attacher.timer_list_,
|
||||||
|
[] (const a8::XParams& param)
|
||||||
|
{
|
||||||
|
SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData();
|
||||||
|
delete caster_state;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void Buff::ProcBatchAddBuff(Creature* caster)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -29,4 +29,8 @@ class Buff
|
|||||||
int GetLeftTime();
|
int GetLeftTime();
|
||||||
int GetLastingTime();
|
int GetLastingTime();
|
||||||
void FillMFBuff(cs::MFBuff* buff_pb);
|
void FillMFBuff(cs::MFBuff* buff_pb);
|
||||||
|
|
||||||
|
void ProcDelayAddBuff(Creature* caster);
|
||||||
|
void ProcIntervalAddBuff(Creature* caster);
|
||||||
|
void ProcBatchAddBuff(Creature* caster);
|
||||||
};
|
};
|
||||||
|
@ -168,6 +168,7 @@ enum BuffEffectType_e
|
|||||||
kBET_InGrass = 56, //在草丛
|
kBET_InGrass = 56, //在草丛
|
||||||
kBET_InWater = 57, //在水里
|
kBET_InWater = 57, //在水里
|
||||||
kBET_InIce = 58, //在冰里
|
kBET_InIce = 58, //在冰里
|
||||||
|
kBET_BatchAddBuff = 60, //批量添加buff
|
||||||
|
|
||||||
kBET_End
|
kBET_End
|
||||||
};
|
};
|
||||||
|
@ -817,88 +817,12 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff)
|
|||||||
break;
|
break;
|
||||||
case kBET_DelayAddBuff:
|
case kBET_DelayAddBuff:
|
||||||
{
|
{
|
||||||
if (caster) {
|
buff->ProcDelayAddBuff(caster);
|
||||||
SkillCasterState* caster_state = new SkillCasterState;
|
|
||||||
caster->FillSkillCasterState(caster_state);
|
|
||||||
room->xtimer.AddDeadLineTimerAndAttach
|
|
||||||
(
|
|
||||||
SERVER_FRAME_RATE * buff->meta->param1,
|
|
||||||
a8::XParams()
|
|
||||||
.SetSender(this)
|
|
||||||
.SetParam1(caster_state)
|
|
||||||
.SetParam2(buff->meta->param2)
|
|
||||||
.SetParam3(((Creature*)caster)->CurrentSkill()->meta),
|
|
||||||
[] (const a8::XParams& param)
|
|
||||||
{
|
|
||||||
Creature* receiver = (Creature*)param.sender.GetUserData();
|
|
||||||
SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData();
|
|
||||||
if (caster_state->caster.Get()) {
|
|
||||||
int buff_id = param.param2;
|
|
||||||
MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData();
|
|
||||||
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
|
|
||||||
if (buff_meta &&
|
|
||||||
caster_state->caster.Get()->CurrentSkill() &&
|
|
||||||
skill == caster_state->caster.Get()->CurrentSkill()->meta) {
|
|
||||||
SkillCasterState old_caster_state;
|
|
||||||
caster_state->caster.Get()->FillSkillCasterState(&old_caster_state);
|
|
||||||
caster_state->caster.Get()->RecoverSkillCasterState(caster_state);
|
|
||||||
receiver->AddBuff(caster_state->caster.Get(), buff_meta, 1, skill);
|
|
||||||
caster_state->caster.Get()->RecoverSkillCasterState(&old_caster_state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
&buff->xtimer_attacher.timer_list_,
|
|
||||||
[] (const a8::XParams& param)
|
|
||||||
{
|
|
||||||
SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData();
|
|
||||||
delete caster_state;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case kBET_IntervalAddBuff:
|
case kBET_IntervalAddBuff:
|
||||||
{
|
{
|
||||||
if (caster) {
|
buff->ProcIntervalAddBuff(caster);
|
||||||
SkillCasterState* caster_state = new SkillCasterState;
|
|
||||||
caster->FillSkillCasterState(caster_state);
|
|
||||||
room->xtimer.AddRepeatTimerAndAttach
|
|
||||||
(
|
|
||||||
buff->meta->param1 / FRAME_RATE_MS,
|
|
||||||
a8::XParams()
|
|
||||||
.SetSender(this)
|
|
||||||
.SetParam1(caster_state)
|
|
||||||
.SetParam2(buff->meta)
|
|
||||||
.SetParam3(caster->CurrentSkill() ? caster->CurrentSkill()->meta : nullptr),
|
|
||||||
[] (const a8::XParams& param)
|
|
||||||
{
|
|
||||||
Creature* receiver = (Creature*)param.sender.GetUserData();
|
|
||||||
SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData();
|
|
||||||
if (caster_state->caster.Get()) {
|
|
||||||
int buff_id = param.param2;
|
|
||||||
MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData();
|
|
||||||
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
|
|
||||||
if (buff_meta &&
|
|
||||||
(!skill ||
|
|
||||||
(
|
|
||||||
caster_state->caster.Get()->CurrentSkill() &&
|
|
||||||
skill == caster_state->caster.Get()->CurrentSkill()->meta)
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
SkillCasterState old_caster_state;
|
|
||||||
caster_state->caster.Get()->FillSkillCasterState(&old_caster_state);
|
|
||||||
caster_state->caster.Get()->RecoverSkillCasterState(caster_state);
|
|
||||||
receiver->AddBuff(caster_state->caster.Get(), buff_meta, 1, skill);
|
|
||||||
caster_state->caster.Get()->RecoverSkillCasterState(&old_caster_state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
&buff->xtimer_attacher.timer_list_,
|
|
||||||
[] (const a8::XParams& param)
|
|
||||||
{
|
|
||||||
SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData();
|
|
||||||
delete caster_state;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case kBET_SummonHero:
|
case kBET_SummonHero:
|
||||||
@ -939,6 +863,11 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case kBET_BatchAddBuff:
|
||||||
|
{
|
||||||
|
buff->ProcBatchAddBuff(caster);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user