private void OnMemberReborn(PTeamMemberInfo memberData) { if (memberData == null) { return; } foreach (var item in m_teamMembers) { if (item.roleId == memberData.roleId && item.health == 0) { item.Revive(); if (item == player) { QuitState(BattleStates.Watch); } break; } } SetAllMonsterInvincible(false); FightRecordManager.RecordLog <LogUlong>(l => { l.tag = (byte)TagType.Reborn; l.value = memberData.roleId; }); }
private void OnMemberQuitEarlySettlement(FrameData d) { if (moduleTeam.members == null) { return; } var reason = (EnumTeamQuitState)d.parameters.GetValue <int>(0); if (reason != EnumTeamQuitState.EarlySettlement) { return; } var member = moduleTeam.members.GetValue <PTeamMemberInfo>(d.parameters.GetValue <int>(1)); if (member == null) { return; } FightRecordManager.RecordLog <LogTeamQuit>(log => { log.tag = (byte)TagType.TeamQuit; log.roleId = member.roleId; log.reason = (sbyte)reason; }); var c = m_teamMembers.Find(o => o.roleId == member.roleId); if (!c) { return; } //掉线,角色直接死亡 bool alive = c && c.health > 0; if (reason == EnumTeamQuitState.EarlySettlement && !isEndingState && !m_isPVEFinish && !m_recvOverMsg && alive) { c?.Kill(); } //切换队长 if (member.teamLeader > 0) { foreach (var item in moduleTeam.members) { item.teamLeader = (byte)(item.roleId == member.roleId ? 0 : 1); } if (c) { var temp = m_normalMember; m_normalMember = c; m_teamLeader = temp; Logger.LogInfo("OnMemberQuit... team leader change to {0}", m_teamLeader ? m_teamLeader.uiName : "null"); } } }
protected override void OnCreatureDead(Event_ e) { FightRecordManager.RecordLog <LogOnCreatureDied>(log => { log.tag = (byte)TagType.OnCreatureDied; log.isTeamMode = modulePVE.isTeamMode; log.onlineCount = moduleTeam.onlineMembers?.Count ?? 0; }); if (!modulePVE.isTeamMode) { base.OnCreatureDead(e); } var c = e.sender as Creature; if (c.creatureCamp == CreatureCamp.PlayerCamp) { bool allDead = m_teamMembers.Count > 0; foreach (var item in m_teamMembers) { if (item && !item.isDead) { allDead = false; } } //全部死亡之后,设置怪物为无敌状态 if (allDead) { SetAllMonsterInvincible(true); QuitState(BattleStates.Watch); } } }
private void IncreaseFrame(int count) { if (count < 1) { return; } for (var i = 0; i < count; ++i) { m_ended = ++m_currentFrame == frameCount; FightRecordManager.RecordLog <LogStateFrame>(l => { l.tag = (byte)TagType.StateFrame; l.frame = (ushort)m_currentFrame; }); stateMachine.SetParam(StateMachineParam.frame, m_currentFrame); stateMachine.SetParam(StateMachineParam.totalFrame, m_totalFrame++); if (ended) { if (!isLaydown && passive && !loop && info.layDownTime > 0) { m_waitToLayDown = true; stateMachine.SetParam(StateMachineParam.nextLayDownTime, info.layDownTime); } stateMachine.onStateEnded?.Invoke(this); break; } HandleFrameEvent(); // m_currentFrame starts with 1, Frame 0 already handled in Enter() } }
protected override void RecordLog() { FightRecordManager.RecordLog <LogEffectDestory>(log => { log.tag = (byte)TagType.LogEffectDestory; log.currentLife = m_time; log.life = lifeTime; }); }
public static int GetMonsterRoomIndex() { FightRecordManager.RecordLog <LogInt>(log => { log.tag = (byte)TagType.GetMonsterRoomIndex; log.value = m_originalRoomIndex; }); return(m_originalRoomIndex++); }
protected override void OnDestroy() { FightRecordManager.RecordLog <LogUlong>(p => { p.tag = (byte)TagType.MonsterDie; p.value = Identify; }); base.OnDestroy(); }
protected override void RecordLog2() { FightRecordManager.RecordLog <LogEffectDestory2>(log => { log.tag = (byte)TagType.LogEffectDestory; log.buffCheck = m_buffCheck; log.version = sourceBuff.version; log.isDestroyed = sourceBuff.destroyed; }); }
protected virtual void OnEnterState(int oldMask, BattleStates state) { if (state != BattleStates.Watch) { FightRecordManager.RecordLog <LogInt>(log => { log.tag = (byte)TagType.EnterState; log.value = (int)state; }); } moduleBattle.parseInput = m_stateMask.BitMask(Fighting); switch (state) { case BattleStates.Ended: { if (modulePlayer.isLevelUp) { Window.SetWindowParam <Window_Settlement>(oldLv, oldPoint, oldFatigue, oldMaxFatigue); } Window.ShowAsync(endWindow, w => { if (w) { w.animationSpeed = CombatConfig.sendWindowFadeInSpeed; } }); break; } case BattleStates.Winning: case BattleStates.Losing: { ObjectManager.Foreach <Creature>(c => { c.ClearBuffs(); c.moveState = 0; return(true); }); // Clear all buffs, reset movement state Window.Hide(combatWindow, true); Window.Hide(ultimateMaskWindow, true); AudioManager.PauseAll(AudioTypes.Music); m_victoryTime = (int)((CombatConfig.screenFadeInDuration + CombatConfig.screenFadeOutDuration) * 1000) - 500; if (state == BattleStates.Winning) { moduleGlobal.FadeIn(CombatConfig.screenFadeInAlpha, CombatConfig.screenFadeInDuration, false, YouAreLuckyBaby); AudioManager.PlayMusicMix(heavenMusic); } else { Camera_Combat.enableShotSystem = false; AudioManager.PlayMusicMix(hellMusic); } break; } default: break; } }
private void UpdateAnimMotion() { var idx = (int)m_motionFrame.x + m_currentFrame; var max = (int)m_motionFrame.y; if (!m_motion || m_falling || idx < 1 || idx > max && m_motionIndex >= max) { m_inMotion = false; return; } m_inMotion = true; if (idx > max) { idx = max; } m_motionIndex = idx; var next = m_motion.points[m_motionIndex]; var prev = m_motion.points[m_motionIndex - 1]; var prog = idx == max ? 1.0 : (m_time % 33) / 33.0; var tar = (Vector3_.Lerp(prev, next, prog) - m_motion.points[0]) * 0.01; var c = stateMachine.creature; currentMotionPos = new Vector3_(!c.isForward ? -tar.z : tar.z, tar.y, -tar.x) + c.motionOrigin; if (currentMotionPos.y < 0) { FightRecordManager.RecordLog <LogVector3>(l => { l.tag = (byte)TagType.motionOrigin; l.pos = new double[] { tar.x, tar.y, tar.z }; }); FightRecordManager.RecordLog <LogVector3>(l => { l.tag = (byte)TagType.motionOrigin; l.pos = new double[] { c.motionOrigin.x, c.motionOrigin.y, c.motionOrigin.z }; }); FightRecordManager.RecordLog <LogVector3>(l => { l.tag = (byte)TagType.currentMotionPos; l.pos = new double[3]; l.pos[0] = currentMotionPos.x; l.pos[1] = currentMotionPos.y; l.pos[2] = currentMotionPos.z; }); currentMotionPos.y = 0; } }
protected override void OnDestroy() { base.OnDestroy(); DispatchEvent(FOLLOW_EFFECT_DESTORY, Event_.Pop(conditionValue)); FightRecordManager.RecordLog <LogEmpty>(log => { log.tag = (byte)TagType.FollowEffectDestory; }); #if AI_LOG Module_AI.LogBattleMsg(source, "FollowTargetEffect[logId: {0}] destoryed with pos {0}", logId, position_); #endif }
public override void OnUpdate(int diff) { if (!enableUpdate) { return; } base.OnUpdate(diff); if (firstStep) { var direction = randomPosition - position_; direction.Normalize(); var p = position_ + direction * (velocity + acceleration * m_time * 0.001) * diff * 0.001; if (p.y < 0) { p.y = 0; } position = position_ = p;; if (Vector3_.Distance(position_, randomPosition) < 0.2 || Vector3_.Dot(startPos - randomPosition, position_ - randomPosition) <= 0) { enableUpdate = false; firstStep = false; } return; } var targetPos = (Vector3_)target.LogicPosition + offset; position = position_ = motion.Evaluate(diff * 0.001); var d = Vector3_.Distance(position_, targetPos); var a = Vector3_.Dot(startPos - targetPos, position_ - targetPos); FightRecordManager.RecordLog <LogEffectPos>(log => { log.tag = (byte)TagType.EffectPos; log.pos = new double[3]; log.pos[0] = position_.x; log.pos[1] = position_.y; log.pos[2] = position_.z; log.distance = d; log.angle = a; }); if (d < 0.2 || a <= 0) { Destroy(); } }
/// <summary> /// 下一个随机范围 介于 0 - 1 的一个随机浮点数 /// </summary> /// <returns></returns> private double NextRange() { ++m_count; UInt64 x = 0xfffffffffffffful; x += 1; m_nSeed *= 134775813; m_nSeed += 1; m_nSeed = m_nSeed % x; var result = m_nSeed / (double)0xffffffffffffff; FightRecordManager.RecordLog <LogDouble>(log => { log.tag = (byte)TagType.Random; log.value = result; }); return(result); }
void _Packet(ScTeamStartLoading p) { EventManager.RemoveEventListener(Events.SCENE_LOAD_PROGRESS, OnLoadingProgress); EventManager.AddEventListener(Events.SCENE_LOAD_PROGRESS, OnLoadingProgress); Logger.LogInfo("Team room start loading! Stage: [{0}]", p.stage); if (p.members.Length == 1) { FightRecordManager.EndRecord(false, false); } FightRecordManager.Set(p); loading = true; m_loadingType = EnumPVELoadingType.Initialize; m_progress = 0; m_lastProgress = 0; mode = (TeamMode)p.type; stage = p.stage; timeLimit = p.timeLimit; allowQuit = p.allowQuit; p.members.CopyTo(ref m_members); onlineMembers.Clear(); onlineMembers.AddRange(m_members); FightRecordManager.RecordLog <LogInt>(log => { log.tag = (byte)TagType.onlineMembersCount; log.value = onlineMembers?.Count ?? 0; }); m_playerIndex = m_members.FindIndex(mi => mi.roleId == modulePlayer.id_); Logger.LogDetail("Player roomIndex: {0}", m_playerIndex); DispatchModuleEvent(EventLoadingStart); modulePVE.StartTeamLevel(p); loading = true; }
public void OnHit(CreatureHitCollider hit) { FightRecordManager.RecordLog <LogEmpty>(log => { log.tag = (byte)TagType.FlyEffectOnHit; }); if (destroyed || !hit && m_groundHited) { return; } if (!hit) { m_groundHited = true; } if (!effectInfo.hitEffect.isEmpty) { Create(effectInfo.hitEffect, source, startForward ? 1 : -1, inverted, hitEffect, position_, eular_, m_root.eulerAngles); } if (effectInfo.removeOnHit == 1 || effectInfo.removeOnHit == 2 && !hit) { FightRecordManager.RecordLog <LogEffectDestoryOnHit>(l => { l.tag = (byte)TagType.FlyEffectOnHit; l.name = name; l.removeOnHit = effectInfo.removeOnHit; }); Destroy(); } #if AI_LOG Module_AI.LogBattleMsg(source, "flying effect[logId: {0}] OnHit,hit creature is {1} with effect pos = {2}, collider pos = {3} ", logId, hit == null ? "null" : hit.creature ? hit.creature.uiName : "null", position_, m_collider == null ? "null" : m_collider.position.ToString()); #endif }
private void CheckCollision(Collider_ trigger, Collider_ receiver) { var mask = trigger.targetMask; var touched = trigger.Touched(receiver); var test = (!trigger.ignoreSameGroup || trigger.transform.parent != receiver.transform.parent) && mask.BitMask(receiver.layer); if (test) { test = trigger.isActiveAndEnabled && receiver.isActiveAndEnabled && trigger.CollisionTest(receiver); } if (touched != test) { FightRecordManager.RecordLog <LogCheckCollider>(l => { l.tag = (byte)TagType.LogCheckCollider; l.test = test; l.ignoreSameGroup = trigger.ignoreSameGroup; l.mask = mask; l.layer = receiver.layer; }); } UpdateTouched(trigger, receiver, touched, test); }
public void LogColliders() { FightRecordManager.RecordLog <LogInt>(log => { log.tag = (byte)TagType.LogColliders; log.value = m_colliders.Count; }); foreach (var c in m_colliders) { FightRecordManager.RecordLog <LogString>(l => { l.tag = (byte)TagType.LogColliders; if (c && c.isActive) { l.value = Util.GetHierarchy(c.transform); } else { l.value = "collider disable"; } }); } }
public static FlyingEffect Create(StateMachineInfo.FlyingEffect effInfo, Creature source, int overrideForward, bool invert, StateMachineInfo.Effect hitEffect, Vector3_ root, Vector3_ rootEular, Vector3 rootRot) { var fe = ConfigManager.Get <FlyingEffectInfo>(effInfo.effect); if (!fe) { Logger.LogWarning("FlyingEffect::Create: Could not create flying effect [{0}], could not find effect config from config_flyingEffectInfos", effInfo.effect); return(null); } FightRecordManager.RecordLog <LogString>(log => { log.tag = (byte)TagType.CreateFlyEffect; log.value = fe.effect; }); var off = effInfo.offset * 0.1; if (invert) { off.x = -off.x; off.z = -off.z; } var direction = effInfo.direction; var rotation = effInfo.rotation; direction.Set(direction.z, direction.y, -direction.x); rotation.Set(-rotation.x, rotation.y, rotation.z); var eular = rootEular + direction; eular.z = Mathd.ClampAngle(eular.z); var z = Mathd.AngToRad(eular.z); var dir = new Vector3_(Mathd.Cos(z), -Mathd.Sin(z)); var pos = root + off; var eff = Create <FlyingEffect>(fe.effect, fe.effect, pos, rotation); eff.enableUpdate = true; if (invert) { dir.x = -dir.x; } eff.sourceBuff = null; eff.follow = false; eff.m_inherit = false; eff.m_time = 0; eff.m_originEular = eff.localEulerAngles; eff.lockForward = Vector3.zero; eff.startForward = overrideForward == 0 ? !source || source.isForward : overrideForward > 0; eff.m_curSectionIdx = 0; eff.m_curActivedSection = -1; eff.m_curSubEffectIdx = 0; eff.m_curSoundEffectIdx = 0; eff.m_curShakeIdx = 0; eff.m_groundHited = false; eff.m_renderTime = 0; eff.effectInfo = fe; eff.source = source; eff.position_ = pos; eff.velocity = effInfo.velocity * 0.0001; eff.acceleration = effInfo.acceleration * 0.0001; eff.lifeTime = fe.lifeTime; eff.hitEffect = hitEffect; eff.CreateCollider(rootRot, dir, eular); eff.m_inverted = invert; eff.UpdateInvert(); #if AI_LOG eff.logId = MonsterCreature.GetMonsterRoomIndex(); Module_AI.LogBattleMsg(source, "create a flying effect[logId:{0}] with pos {1}, lifeTime = {2} startForward is {3}", eff.logId, eff.position_, eff.lifeTime, eff.startForward); #endif return(eff); }
private bool TranslateTo(StateMachineState state, int type = 0, bool checkCooldown = false, float blendTime = -1) { if (checkCooldown && state.coolingDown) { return(false); } #region Debug log #if (DEVELOPMENT_BUILD || UNITY_EDITOR) && DETAIL_BATTLE_LOG if (type != 0 && creature.isCombat) { var msg = Util.Format("[{2}:{3}-{4}], [{5}:{6}] Enter state {0} from {1}, type:{7}", state.name, currentState.name, Level.levelTime, creature.frameTime, creature.frameCount, creature.id, creature.name, type); if (type > 0) { Logger.LogChat(msg); } else { Logger.LogWarning(msg); } } #endif #if AI_LOG if (type != 0 && creature.isCombat) { Module_AI.LogBattleMsg(creature, true, "[Enter state {0} from {1}, type:{2}", state.name, currentState.name, type); } #endif #endregion FightRecordManager.RecordLog <LogStateTranslate>(l => { l.tag = (byte)TagType.StateTranslate; l.form = currentState.name; l.roleId = creature.Identify; l.to = state.name; l.currentFrame = (ushort)currentState.currentFrame; l.frameCount = (ushort)currentState.frameCount; }, true); var old = currentState; old.Quit(); onQuitState?.Invoke(old, state, blendTime); currentState = state; currentState.Enter(); onEnterState?.Invoke(old, currentState, blendTime); if (m_nextPendingTime > 0) { Pending(m_nextPendingTime, false, m_preventShake); m_nextPendingTime = 0; } else { pending = false; } return(true); }
public override void OnUpdate(int diff) { base.OnUpdate(diff); FightRecordManager.RecordLog <LogEffectUpdate>(log => { log.tag = (byte)TagType.EffectOnUpdate; log.name = effectInfo?.effect; log.life = lifeTime; log.currentLife = m_time; log.freez = m_freez; log.source = source.Identify; log.isDestroyed = destroyed; }); if (destroyed) { return; } var tp = position_ + direction * (velocity + acceleration * m_time) * diff; if (tp.y < 0) { tp.y = 0; } if (m_collider.isActiveAndEnabled && (m_collider.radius > 0 || m_collider.boxSize != Vector2_.zero)) { PhysicsManager.Foreach <CreatureHitCollider>(collider => { var target = collider.creature; if (!target || source.SameCampWith(target) || collider.Touched(m_collider) || m_collider.AttackedCount(collider) > 0) { return(true); // ignore touched, attacked and same team targets } var hit = (Vector2_)position_; var check = m_collider.radius > 0 && PhysicsManager.Cross(m_collider.sphere, collider.box, (Vector2_)tp + m_collider.sphereOffset, ref hit) ? 1 : m_collider.boxSize != Vector2_.zero && PhysicsManager.Cross(m_collider.box, collider.box, (Vector2_)tp + m_collider.offset, ref hit) ? 2 : 0; if (check == 0) { return(true); } hit -= check == 1 ? m_collider.sphereOffset : m_collider.offset; var np = (Vector3_)hit; np.z = position_.z; position_ = np; m_root.position = np; m_collider.position = np; collider.BeginCollision(m_collider); m_collider.CollisionBegin(collider); return(this); }, Creature.COLLIDER_LAYER_HIT.ToMask()); if (!this) { return; } } position_ = tp; m_root.position = tp; m_collider.position = tp; UpdateSubEffects(); UpdateSoundEffects(); UpdateShakeEffects(); UpdateAttackBox(); if (!m_groundHited && m_lastY > 0 && tp.y <= 0) { OnHit(null); } m_lastY = tp.y; }