Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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;
            }
        }