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); }