Files
mir_server/server/LogicServer/skill/SkillCondition.h

422 lines
18 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
class CAnimal;
//这个类是技能的目标选择条件的类,为了不把技能的类扩大很多,把目标选择方面的
//代码放在这里,主要是判断技能是否生效
class CSkillCondition
{
public:
//目标选择的条件
typedef bool (CSkillCondition::*TargetSelCondition)(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value );
//技能的训练和使用的条件
typedef INT_PTR (CSkillCondition::*SkillUseTrainCondition)(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
/*
* Comments:
* Param CAnimal * pSrcEntity:
* Param CAnimal * pTargetEntity:
* Param TARGETSELCONDITION & value:
* bool needConsume:
* @Return bool: true,false
*/
bool Check( CAnimal * pSrcEntity,CAnimal *pTargetEntity,TARGETSELCONDITION &value);
/*
* Comments:使
* Param CActor * pActor:
* Param SKILLTRAINSPELLCONDITION & contition:
* @Return INT_PTR:
*/
INT_PTR CheckUseTrainContion(CAnimal * pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
/*
* Comments:
* Param CActor * pActor:
* Param SKILLTRAINSPELLCONDITION & contition:
* @Return INT_PTR:
*/
INT_PTR CheckSpellContion(CAnimal * pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
/*
* Comments:
* Param CActor * pActor:
* Param SKILLTRAINSPELLCONDITION & contition:
* @Return INT_PTR:
*/
INT_PTR CheckUpGradeContion(CAnimal * pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//错误的id
inline bool IsError(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value)
{
return false;
}
//目标为敌人
inline bool IsEnermy(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//目标为友方
inline bool IsFriendly(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//目标为自己
inline bool IsSelf(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//目标为队伍成员
inline bool IsTeammate(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//目标为怪物
inline bool IsMonster(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//目标为玩家
inline bool IsActor(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//标等级 >= value,
inline bool LevelAbove(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//目标等级 <= value
inline bool LevelBelow(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//pk值低于数值,整数
inline bool PkBelow(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//pk值高于数值 ,整数
inline bool PkAbove(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//随机概率,5000表示百分之50概率单位万分之1
inline bool Probalility(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//死亡
inline bool IsDeath(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//可攻击
inline bool CanAttack(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//就是自己的等级减目标的等级小于等于这个数值
inline bool LevelDisBelow(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
bool CircleDisBelow(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
bool RevertCircleDisBelow(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//就是目标的等级减自己的等级小于等于这个数值
inline bool RevertLevelDisBelow (CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//和目标的距离大于这个值
inline bool DistanceLarge(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//目标存在buff
// value1=buff类型 , value2 =buff的组
inline bool WithBuff(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//目标不存在buff
inline bool WithoutBuff(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
// 驯服成功
inline bool TrainOk(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//体力高于百分比,整数,用万分数表示,6000表示60%
inline bool HpAbove(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//体力低于百分比,整数,用万分数表示,6000表示60%
inline bool HpBelow(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//活力高于百分比,整数,用万分数表示,6000表示60%
inline bool MpAbove(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
// 活力低于百分比 ,整数,用万分数表示,6000表示60%
inline bool MpBelow (CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
// 帮派相同,value as bool
inline bool SameGuild (CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//需要面向目标
inline bool FaceTarget(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//和目标的方向一致
inline bool TargetOneDir(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//是特定id的怪物
inline bool IsSpecialMonster(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//自身的hp比率高于一定的比率
inline bool SelfHpRateAbove(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//自身的hp比率低于一定的比例
inline bool SelfHpRateBelow(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//阵营相同
inline bool SelSameCamp(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//和自己是结拜的关系
inline bool SelfIsBrother(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//是自己的主人
inline bool IsMaster(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//是特定种类的怪物
inline bool IsSpecialTypeMonster(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//最大魔法攻击>= 一个值
inline bool IsMagicAttackMaxAbove(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//最大魔法攻击< 一个值
inline bool IsMagicAttackMaxBelow(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//最大道术攻击>= 一个值
inline bool IsWizardAttackMaxAbove(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//最大道术攻击< 一个值
inline bool IsWizardAttackMaxBelow(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//自身的材料的id
inline bool IsSelfMetiralItemId(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//是否装备了指定的武器
inline bool IsSpeciaWeapon(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//目标是否是沙巴克成员
inline bool IsSbkMember(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//在副本里并且副本id为
inline bool FbId(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//自身是怪物并且怪物的id=value
inline bool SelfSpecialMonster(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//模型的id=value
inline bool IsModelId(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//场景里是否存在怪物
inline bool SceneHasMonster(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//场景不存在怪物
inline bool SceneWithoutMonster(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//自己的等级 <= value
inline bool SelfLevelBelow(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//己的等级 > value
inline bool SelfLevelAbove(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//自身的场景的id
inline bool SelfSceneId(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//场景怪物数目<=value
inline bool SceneMonsterCount(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//已经召唤出来的宠物的数目
inline bool MobPetCount(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//实体类型
inline bool EntityType(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//实体类型
inline bool EntityVocation(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//是否有特定的装备
inline bool HasSpecialEquip(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//目标转数 > value,
inline bool CircleAbove(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//目标转数 <= value
inline bool CircleBelow(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//自己身上有buff
inline bool SelfWithBuff(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//自己身上没有buff
inline bool SelfWithoutBuff(CAnimal * pSrcEntity,CAnimal *pTargetEntity,GAMEATTRVALUE &value);
//自己的宠物
inline bool SelfJobPet(CAnimal * pSrcEntity, CAnimal * pTargetEntity, GAMEATTRVALUE & value);
//自己的转数比目标转数
inline bool SelfCircleBelow(CAnimal * pSrcEntity, CAnimal * pTargetEntity, GAMEATTRVALUE & value);
//目标转数比自己的转数
inline bool RevertCircleBelow(CAnimal * pSrcEntity, CAnimal * pTargetEntity, GAMEATTRVALUE & value);
//判断怪物升级的等级数
inline bool MonsterLevelUpCheck(CAnimal * pSrcEntity, CAnimal * pTargetEntity, GAMEATTRVALUE & value);
//判断场景是否有归属于自己的宠物
inline bool ScenceHasSelfPet(CAnimal * pSrcEntity, CAnimal * pTargetEntity, GAMEATTRVALUE & value);
//判断自己技能等级是否大于等于目标人物等级
inline bool SelfSkillLevelAndTargetLevelAbove(CAnimal * pSrcEntity, CAnimal * pTargetEntity, GAMEATTRVALUE & value);
//判断自己技能等级是否小于目标人物等级
inline bool SelfSkillLevelAndTargetLevelBelow(CAnimal * pSrcEntity, CAnimal * pTargetEntity, GAMEATTRVALUE & value);
////////////////////////////////技能的升级和训练的条件
//没有条件
inline INT_PTR UtConditionNone(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//等级必须大于等于一定的级别
inline INT_PTR UtConditionLevel(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
//金钱
inline INT_PTR UtConditionCoin(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
inline INT_PTR UtConditionFlyShoes(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition ,bool needConsume);
//物品
inline INT_PTR UtConditionItem(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//经验
inline INT_PTR UtConditionExp(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//内功等级
inline INT_PTR UtConditionInternalWorkLevel(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//修为
inline INT_PTR UtConditionXiuwei(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
//职业
inline INT_PTR UtConditionVocation(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
//HP是否足够
inline INT_PTR UtConditionHp(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
//MP
inline INT_PTR UtConditionMp(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
//目标存在
inline INT_PTR UtConditionTargetExist(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
//宠物id=value的数量<param
inline INT_PTR UtConditionPetCount(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
//存在buff
inline INT_PTR UtConditionWithBuff(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//不存在buff
inline INT_PTR UtConditionWithoutBuff(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
//和目标的距离必须小于
inline INT_PTR UtConditionTargetDistance(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
//和目标能否重合
inline INT_PTR UtConditionTargetSamePosition(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
//需要面向目标
inline INT_PTR UtConditionFaceTarget(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//需要和目标的方向
inline INT_PTR UtConditionOneDirTarget(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
//自身的血的百分比必须低于一定的值
inline INT_PTR UtConditionHpRateBelow(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
//自身的血的百分比必须高于一定的值
inline INT_PTR UtConditionHpRateAbove(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
//需要特定的目标
inline INT_PTR UtConditionSpecialTarget (CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//目标可攻击
inline INT_PTR UtConditionTargetCanAttack (CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//体力
inline INT_PTR UtConditionJumpPower(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//绑定银两
inline INT_PTR UtConditionBindCoin(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//阵营的称号
inline INT_PTR UtConditionCampTitle(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//结拜的数目
inline INT_PTR UtConditionBrotherCount(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//与目标Y轴的绝对的距离
inline INT_PTR UtConditionYAbsDis(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//队伍里的在线的结拜好友的数量 >= value不包括自己
inline INT_PTR UtConditionTeamBrotherCount(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//消耗基础蓝的万分比 value表示基础蓝的万分比比如8500表示85%玩家的基础蓝表示等级带来的MaxMp,不包括buff装备等附加的
inline INT_PTR UtConditionBaseMaxMpRate(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//消耗基础血的万分比 value表示基础血的万分比比如8500表示85%玩家的基础血表示等级带来的MaxHp,不包括buff装备等附加的
inline INT_PTR UtConditionBaseMaxHpRate(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//在与玩家的战斗状态,value 1表示是 0表示否
inline INT_PTR UtConditionBattleState(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//需要帮派贡献
inline INT_PTR UtConditionGuildContr(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//需要帮派对应的技能等级达到
inline INT_PTR UtConditionGuildSkillLevel(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//Xp值的消耗
inline INT_PTR UtConditionXpValue(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//材料的耐久
inline INT_PTR UtConditionMatiralDura(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//消耗怒气值
inline INT_PTR UtConditionAngerValue(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//需要装备有挖矿工具
inline INT_PTR UtConditionDigTool(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//需要在特定区域才可以使用
inline INT_PTR UtConditionAreaProp(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume);
//至少需要转生才可学习
inline INT_PTR UtConditionCircle(CAnimal * pActor, INT_PTR nSkillID, SKILLTRAINSPELLCONDITION &condition, bool needConsume);
//与目标线距离
inline INT_PTR UtConditionLineDistance(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
//有目标并且目标的距离>=value
inline INT_PTR UtConditionTargetDistanceAbove(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
//需要当前职业宠物数量>=value
inline INT_PTR UtConditionHasJobPetCount(CAnimal *pActor,INT_PTR nSkillID,SKILLTRAINSPELLCONDITION &contition,bool needConsume );
//需要行会主殿等级
inline INT_PTR UtConditionGuildMainHall(CAnimal * pActor, INT_PTR nSkillId,SKILLTRAINSPELLCONDITION &contition ,bool needConsume);
//需要行会科技等级
inline INT_PTR UtConditionGuildTech(CAnimal * pActor, INT_PTR nSkillId,SKILLTRAINSPELLCONDITION &contition ,bool needConsume);
protected:
static const TargetSelCondition Handlers[]; //目标的选择条件
static const SkillUseTrainCondition UseTrainHandlers[]; //使用和升级的条件
static const SkillUseTrainCondition SpellHandlers[]; //施法条件
static const SkillUseTrainCondition UpgradeHandlers[]; //升级条件
};