public void Climb(NPCInst npc, NPC.ClimbingLedge ledge) { if (!jumpTimer.IsReady) { return; } ClimbMoves move; var gAI = npc.BaseInst.gAI; float dist = ledge.Location.Y - gAI.FeetY; if (dist < gAI.StepHeight) { return; } else if (dist < gAI.YMaxJumpLow) { move = ClimbMoves.Low; } else if (dist < gAI.YMaxJumpMid) { move = ClimbMoves.Mid; } else { move = ClimbMoves.High; } var stream = npc.BaseInst.GetScriptCommandStream(); switch (move) { case ClimbMoves.High: stream.Write((byte)RequestMessageIDs.ClimbHigh); break; case ClimbMoves.Mid: stream.Write((byte)RequestMessageIDs.ClimbMid); break; case ClimbMoves.Low: stream.Write((byte)RequestMessageIDs.ClimbLow); break; default: return; } ledge.WriteStream(stream); NPC.SendScriptCommand(stream, NetPriority.Medium); }
public void DoClimb(ClimbMoves move, NPC.ClimbingLedge ledge) { ScriptAniJob job; switch (move) { case ClimbMoves.High: job = AniCatalog.Climbs.High; break; case ClimbMoves.Mid: job = AniCatalog.Climbs.Mid; break; case ClimbMoves.Low: job = AniCatalog.Climbs.Low; break; default: Logger.Log("Not existing climb move: " + move); return; } if (job == null) { return; } var stream = BaseInst.GetScriptVobStream(); stream.Write((byte)ScriptVobMessageIDs.Climb); ledge.WriteStream(stream); BaseInst.SendScriptVobStream(stream); IsClimbing = true; ModelInst.StartAniJob(job, () => IsClimbing = false); }
public override void OnReadScriptVobMsg(PacketReader stream) { var msgID = (ScriptVobMessageIDs)stream.ReadByte(); switch (msgID) { case ScriptVobMessageIDs.HitMessage: var attackerID = stream.ReadUShort(); if (WorldInst.Current.BaseWorld.TryGetVob(attackerID, out NPC attacker)) { int index = Randomizer.GetInt(hitSounds.Count); SoundHandler.PlaySound3D(hitSounds[index], this.BaseInst); if (this.CustomVoice > 0 && screamTimer.IsReady) { index = Randomizer.GetInt(6) - 2; if (index > 0) { string str = string.Format("SVM_{0}_AARGH_{1}.WAV", (int)this.CustomVoice, index); if (!cachedVoices.TryGetValue(str, out SoundDefinition scream)) { scream = new SoundDefinition(str); cachedVoices.Add(str, scream); } SoundHandler.PlaySound3D(scream, this.BaseInst, 3000, 0.8f); } } if (!this.ModelInst.IsInAnimation()) { this.BaseInst.gModel.StartAni("T_GOTHIT", 0); } // fixme: transmit hit direction and use stumble animation } break; case ScriptVobMessageIDs.ParryMessage: attackerID = stream.ReadUShort(); if (WorldInst.Current.BaseWorld.TryGetVob(attackerID, out NPC targetNPC)) { this.BaseInst.gAI.StartParadeEffects(targetNPC.gVob); } break; case ScriptVobMessageIDs.Climb: var ledge = new NPC.ClimbingLedge(stream); this.BaseInst.SetGClimbingLedge(ledge); break; case ScriptVobMessageIDs.Uncon: SetUnconsciousness((Unconsciousness)stream.ReadByte()); break; case ScriptVobMessageIDs.Voice: DoVoice((VoiceCmd)stream.ReadByte()); break; case ScriptVobMessageIDs.VoiceShout: DoVoice((VoiceCmd)stream.ReadByte(), 6000, 0.8f); break; default: break; } }