public void LockNearestTargetToHit() { CObject_Character pNearestTarget = LockNearestEnemy(); //下边为挂机增加自动攻击 if (AutoReleaseSkill.Instance.isAutoSkill()) { if (AutoReleaseSkill.Instance.CanUseNextSkill()) { CObject_Character target = mMainTarget as CObject_Character; if (target != null && !target.CannotBeAttack()) { mNearestTargetOLD = target; } if (mNearestTargetOLD == null || mNearestTargetOLD.IsDie()) { mNearestTargetOLD = pNearestTarget; } bool needSend = false; if (mNeedWaitSkillSend) { uint curTime = GameProcedure.s_pTimeSystem.GetTimeNow(); if (curTime - mWaitSkillSend >= 1000) { needSend = true; mWaitSkillSend = curTime; } } else { needSend = true; } if (needSend) { tActionItem suitAbleItem = AutoReleaseSkill.Instance.getSuitAbleSkill(mNearestTargetOLD); if (suitAbleItem == null) { suitAbleItem = CActionSystem.Instance.GetDefaultAction(); } CActionItem_Skill curSkill = suitAbleItem as CActionItem_Skill; mNeedWaitSkillSend = !curSkill.AutoKeepOn(); Vector3 fvMouseHitPlan = Vector3.zero; if (mNearestTargetOLD != null) { fvMouseHitPlan = mNearestTargetOLD.GetPosition(); } CursorMng.Instance.MouseCommand_Set(false, mNearestTargetOLD, fvMouseHitPlan, suitAbleItem); GameProcedure.s_pGameInterface.AutoHitState = 1; CursorMng.Instance.MouseCommand_Active(CursorMng.Instance.MouseCommand_GetLeft()); GameProcedure.s_pGameInterface.AutoHitState = 0; } } else { AutoReleaseSkill.Instance.waitNextSkill(); } } else { CObject_Character target = mMainTarget as CObject_Character; if (target != pNearestTarget) { if (target != null && !target.CannotBeAttack()) { mNearestTargetOLD = target; } } if (mNearestTargetOLD != pNearestTarget && (mNearestTargetOLD == null || mNearestTargetOLD.IsDie())) { mNearestTargetOLD = pNearestTarget; Vector3 fvMouseHitPlan = Vector3.zero; bool needSend = false; if (mNeedWaitSkillSend) { uint curTime = GameProcedure.s_pTimeSystem.GetTimeNow(); if (curTime - mWaitSkillSend >= 1000) { needSend = true; mWaitSkillSend = curTime; } } else { needSend = true; } if (needSend) { tActionItem suitAbleItem = null; if (AutoReleaseSkill.Instance.isAutoSkill()) { if (AutoReleaseSkill.Instance.CanUseNextSkill()) { suitAbleItem = AutoReleaseSkill.Instance.getSuitAbleSkill(pNearestTarget); } else { AutoReleaseSkill.Instance.waitNextSkill(); } } if (suitAbleItem == null) { suitAbleItem = CActionSystem.Instance.GetDefaultAction(); } CActionItem_Skill curSkill = suitAbleItem as CActionItem_Skill; mNeedWaitSkillSend = !curSkill.AutoKeepOn(); if (mNearestTargetOLD != null) { fvMouseHitPlan = mNearestTargetOLD.GetPosition(); } CursorMng.Instance.MouseCommand_Set(false, mNearestTargetOLD, fvMouseHitPlan, suitAbleItem); GameProcedure.s_pGameInterface.AutoHitState = 1; CursorMng.Instance.MouseCommand_Active(CursorMng.Instance.MouseCommand_GetLeft()); GameProcedure.s_pGameInterface.AutoHitState = 0; } //if (suitAbleItem == null) //{ // suitAbleItem = CActionSystem.Instance.GetDefaultAction(); //} //CursorMng.Instance.MouseCommand_Set(false, pNearestTarget, fvMouseHitPlan, suitAbleItem); //// CAI_MySelf aiSelf = (CAI_MySelf)(CObjectManager.Instance.getPlayerMySelf().CharacterLogic_GetAI()); //// if (aiSelf.GetMySelfAI() == ENUM_MYSELF_AI.MYSELF_AI_GUAJI) ////无需判定,一定是挂机状态 //{ // GameProcedure.s_pGameInterface.AutoHitState = 1; //} //CursorMng.Instance.MouseCommand_Active(CursorMng.Instance.MouseCommand_GetLeft()); //GameProcedure.s_pGameInterface.AutoHitState = 0; //mNearestTargetOLD = pNearestTarget; } } }
public void Update() { if (!execute_) { return; } if (targetID_ == MacroDefine.INVALID_ID) { return; } if (CObjectManager.Instance.getPlayerMySelf().IsAutoFight()) { return; } CObject_Character pChar = CObjectManager.Instance.FindServerObject(targetID_) as CObject_Character; if (pChar == null || pChar.IsDie()) { enterFightStat_ = false; waitSendSkillTime_ = 0; return; } if (!enterFightStat_) { return; } if (pChar.CannotBeAttack()) { return; } if (!canUseNextSkill_) { waitNextSkill(); return; } bool needSend = false; if (needWaitSendSkill_) { uint curTime = GameProcedure.s_pTimeSystem.GetTimeNow(); if (curTime - waitSendSkillTime_ >= MIN_ACTION_TIME) { needSend = true; waitSendSkillTime_ = curTime; } } else { needSend = true; } if (needSend) { tActionItem curSkill = getSuitAbleSkill(pChar); if (curSkill == null) { curSkill = CActionSystem.Instance.GetDefaultAction(); } CActionItem_Skill skill = curSkill as CActionItem_Skill; needWaitSendSkill_ = !skill.AutoKeepOn(); Vector3 fvMouseHitPlan = pChar.GetPosition(); CursorMng.Instance.MouseCommand_Set(false, pChar, fvMouseHitPlan, curSkill); CursorMng.Instance.MouseCommand_Active(CursorMng.Instance.MouseCommand_GetLeft()); } }
public override NET_RESULT_DEFINE.PACKET_EXE Execute(PacketBase packet, ref Peer pPlayer) { GCNewItemBox pPacket = (GCNewItemBox)packet; //当前流程是主流程 if (GameProcedure.GetActiveProcedure() == (GameProcedure)GameProcedure.s_ProcMain) { CObjectManager pObjectManager = CObjectManager.Instance; //检查位置是否合法 fVector2 pos = new fVector2(pPacket.Position.m_fX, pPacket.Position.m_fZ); if (!WorldManager.Instance.ActiveScene.IsValidPosition(ref pos)) { LogManager.LogError("Valid Position @GCNewItemBoxHandler.Execute"); return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_ERROR); } if ((int)ITEMBOX_TYPE.ITYPE_DROPBOX == pPacket.ObjectType) { bool bMustCreater = true; CObject pObj = (CObject)(pObjectManager.FindServerObject((int)pPacket.MonsterID)); if (pObj != null && pObj is CObject_Character) { CObject_Character pCharacter = (CObject_Character)pObj; if (!pCharacter.IsDie()) { uint idItemBox = (uint)pPacket.ObjectID; uint idOwner = (uint)pPacket.OwnerID; WORLD_POS posCreate = pPacket.Position; pCharacter.AddDropBoxEvent(idItemBox, idOwner, ref posCreate); bMustCreater = false; } } if (bMustCreater) { //创建ItemBox CTripperObject_ItemBox pBox = (CTripperObject_ItemBox)CObjectManager.Instance.NewTripperItemBox((int)pPacket.ObjectID); pBox.Initial(null); //设置位置 pBox.SetMapPosition(pPacket.Position.m_fX, pPacket.Position.m_fZ); //设置掉落箱的归属 pBox.SetOwnerGUID((uint)pPacket.OwnerID); CEventSystem.Instance.PushEvent(GAME_EVENT_ID.GE_DROP_ITEMBOX); } } else { //创建矿物生长点 CTripperObject_Resource pResource = (CTripperObject_Resource)CObjectManager.Instance.NewTripperResource((int)pPacket.ObjectID); if (!(pResource.SetResourceID((int)pPacket.ObjectType))) { //非法的资源ID CObjectManager.Instance.DestroyObject(pResource); return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE); } pResource.Initial(null); //设置位置 pResource.SetMapPosition(pPacket.Position.m_fX, pPacket.Position.m_fZ); jhCount++; } } return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE); }
bool CanUseSkill(CActionItem skillItem, CObject_Character target) { if (skillItem == null) { return(false); } if (target == null) { return(false); } if (target.IsDie()) { return(false); } switch (skillItem.GetType()) { case ACTION_OPTYPE.AOT_SKILL: { SCLIENT_SKILL pSkill = skillItem.GetImpl() as SCLIENT_SKILL; if (pSkill == null) { break; } Vector3 avatarPos = CObjectManager.Instance.getPlayerMySelf().GetPosition(); Vector3 avatarPosOnPlane = new Vector3(avatarPos.x, 0, avatarPos.z); Vector3 targetPos = new Vector3(-1, 0, -1); int ServerID = -1; targetPos = new Vector3(target.GetPosition().x, 0, target.GetPosition().z); ServerID = target.ServerID; Vector3 PosOnPlane = new Vector3(targetPos.x, 0, targetPos.z); float dir = Vector3.Angle(avatarPosOnPlane, PosOnPlane); OPERATE_RESULT result = pSkill.IsCanUse(CObjectManager.Instance.getPlayerMySelf().ID, pSkill.m_nLevel, ServerID, targetPos.x, targetPos.z, dir); if (result == OPERATE_RESULT.OR_OK) { return(true); } } break; case ACTION_OPTYPE.AOT_PET_SKILL: { PET_SKILL pPetSkill = skillItem.GetImpl() as PET_SKILL; if (pPetSkill == null) { break; } if (Interface.Pet.Instance.IsFighting(pPetSkill.m_nPetNum)) { return(true); } } break; } return(false); }
public OPERATE_RESULT IsCanUse_CheckTarget(int idUser, int idTargetObj, float fTargetX, float fTargetZ, float fDir) { switch ((ENUM_SELECT_TYPE)m_pDefine.m_nSelectType) { case ENUM_SELECT_TYPE.SELECT_TYPE_NONE: break; case ENUM_SELECT_TYPE.SELECT_TYPE_CHARACTER: { if (idTargetObj == MacroDefine.INVALID_ID) { CEventSystem.Instance.PushEvent(GAME_EVENT_ID.GE_INFO_FIGHT, "没有目标"); return(OPERATE_RESULT.OR_NO_TARGET); } // m_nTargetMustInSpecialState--> 0:活的;1:死的; -1:没有要求 bool TargetMustAliveFlag = (m_pDefine.m_nTargetMustInSpecialState == 0); CObject_Character pTargetObj = (CObject_Character)CObjectManager.Instance.FindServerObject(idTargetObj); if (pTargetObj == null) { return(OPERATE_RESULT.OR_ERROR); } else if (pTargetObj.CannotBeAttack()) // 敌对状态时,也要判断npc是否可以被攻击 [9/26/2011 Ivan edit] { CEventSystem.Instance.PushEvent(GAME_EVENT_ID.GE_INFO_FIGHT, "无效目标"); return(OPERATE_RESULT.OR_INVALID_TARGET); } CObject_Character pThisObj = (CObject_Character)CObjectManager.Instance.FindObject(idUser); if (pThisObj == null) { return(OPERATE_RESULT.OR_ERROR); } //阵营判断 _CAMP_DATA cap_a = pThisObj.GetCampData(); _CAMP_DATA cap_b = pTargetObj.GetCampData(); ENUM_RELATION eCampType = CampStand.Instance.CalcRelationType(cap_a.m_nCampID, cap_b.m_nCampID); // 通过PK模式判断是否为敌人 [8/19/2011 edit by ZL] if (eCampType != ENUM_RELATION.RELATION_ENEMY) { int tempRelation = CObjectManager.Instance.getPlayerMySelf().GetRelationOther(pTargetObj); if (tempRelation != -1) { eCampType = (ENUM_RELATION)tempRelation; } } if (m_pDefine.m_nFriendness < 0 && eCampType == ENUM_RELATION.RELATION_ENEMY) { } else if (m_pDefine.m_nFriendness > 0 && eCampType == ENUM_RELATION.RELATION_FRIEND) { } else if (m_pDefine.m_nFriendness == 0) { } else { return(OPERATE_RESULT.OR_INVALID_TARGET); } if (!pTargetObj.IsDie() && TargetMustAliveFlag) { // 该技能只对活目标有效 } else if (pTargetObj.IsDie() && !TargetMustAliveFlag) { // 该技能只对死目标有效 } else { CEventSystem.Instance.PushEvent(GAME_EVENT_ID.GE_INFO_FIGHT, "无效目标"); return(OPERATE_RESULT.OR_INVALID_TARGET); } } break; case ENUM_SELECT_TYPE.SELECT_TYPE_POS: { if (!(fTargetX >= 0.0f && fTargetZ >= 0.0f)) { CEventSystem.Instance.PushEvent(GAME_EVENT_ID.GE_INFO_FIGHT, "无效目标"); return(OPERATE_RESULT.OR_INVALID_TARGET_POS); } } break; case ENUM_SELECT_TYPE.SELECT_TYPE_DIR: break; case ENUM_SELECT_TYPE.SELECT_TYPE_SELF: break; } return(OPERATE_RESULT.OR_OK); }