private static bool HandleSwitch(Session Session, Item Item, RoomInstance Instance, ItemEventType Event, int RequestData, uint Opcode) { if (Event != ItemEventType.Interact) { return(true); } RoomActor actor = Instance.GetActor(Session.CharacterId); if (actor == null) { return(true); } foreach (Item item in Instance.GetFloorItems()) { if (item.Definition.Behavior != ItemBehavior.WiredTrigger || WiredTypesUtil.TriggerFromInt(item.Definition.BehaviorData) != WiredTriggerTypes.state_changed) { continue; } String[] Selected = item.WiredData.Data1.Split('|'); if (Selected.Contains(Item.Id.ToString())) { Instance.WiredManager.ExecuteActions(item, actor); } } return(true); }
private static void TradeInitiate(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null || !Instance.Info.CanTrade) { return; } RoomActor TargetActor = Instance.GetActor(Message.PopWiredUInt32()); RoomActor SelfActor = Instance.GetActorByReferenceId(Session.CharacterId); if (TargetActor == null || TargetActor.Type != RoomActorType.UserCharacter || SelfActor == null || TargetActor.ReferenceId == SelfActor.ReferenceId) { return; } Session TargetSession = SessionManager.GetSessionByCharacterId(TargetActor.ReferenceId); if (TargetSession == null) { return; } if (!Instance.TradeManager.InitiateTrade(Session.CharacterId, TargetSession.CharacterId)) { Session.SendData(RoomTradeCannotInitiate.Compose()); return; } ServerMessage TradeInitiatedMessage = TradeInitiatedComposer.Compose(Session.CharacterId, Session.HasRight("trade"), TargetSession.CharacterId, TargetSession.HasRight("trade")); Session.SendData(TradeInitiatedMessage); TargetSession.SendData(TradeInitiatedMessage); SelfActor.SetStatus("trd"); SelfActor.UpdateNeeded = true; TargetActor.SetStatus("trd"); TargetActor.UpdateNeeded = true; }
private static bool HandleTeleporter(Session Session, Item Item, RoomInstance Instance, ItemEventType Event, int RequestData, uint Opcode) { RoomActor Actor = null; uint LinkedRef = 0; uint.TryParse(Item.Flags, out LinkedRef); switch (Event) { case ItemEventType.InstanceLoaded: Item.DisplayFlags = "0"; break; case ItemEventType.Moved: if (RequestData != 1) { goto case ItemEventType.Removing; } break; case ItemEventType.Removing: case ItemEventType.Placed: if (Item.DisplayFlags != "0") { Item.DisplayFlags = "0"; if (Event == ItemEventType.Moved) { Item.BroadcastStateUpdate(Instance); } } foreach (uint RefId in Item.TemporaryInteractionReferenceIds.Values) { RoomActor InteractingActor = Instance.GetActor(RefId); if (InteractingActor != null) { InteractingActor.UnblockWalking(); } } Item.TemporaryInteractionReferenceIds.Clear(); break; case ItemEventType.Interact: if (Session != null) { Actor = Instance.GetActorByReferenceId(Session.CharacterId); } if (Actor == null) { break; } bool IsInFront = (Actor.Position.X == Item.SquareInFront.X && Actor.Position.Y == Item.SquareInFront.Y); bool IsInTele = !IsInFront && (Actor.Position.X == Item.RoomPosition.X && Actor.Position.Y == Item.RoomPosition.Y); if (!IsInFront && !IsInTele) { Actor.MoveToItemAndInteract(Item, RequestData, Opcode); break; } if (Item.DisplayFlags == "0" && Item.TemporaryInteractionReferenceIds.Count == 0) { Item.TemporaryInteractionReferenceIds.Add(1, Actor.Id); Actor.BlockWalking(); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { TeleporterLinkFinder.FillCache(MySqlClient, LinkedRef); } if (IsInTele) { Item.RequestUpdate(1); } else { Item.DisplayFlags = "1"; Actor.MoveTo(Item.RoomPosition.GetVector2(), true, true, true); Item.BroadcastStateUpdate(Instance); Item.RequestUpdate(3); } } break; case ItemEventType.UpdateTick: RoomActor OutgoingUser = null; RoomActor IncomingUser = null; if (Item.TemporaryInteractionReferenceIds.ContainsKey(1)) { OutgoingUser = Instance.GetActor(Item.TemporaryInteractionReferenceIds[1]); if (OutgoingUser == null) { Item.TemporaryInteractionReferenceIds.Remove(1); } } if (Item.TemporaryInteractionReferenceIds.ContainsKey(2)) { IncomingUser = Instance.GetActor(Item.TemporaryInteractionReferenceIds[2]); if (IncomingUser == null) { Item.TemporaryInteractionReferenceIds.Remove(2); } } string EffectToApply = "0"; uint LinkedRoomRefId = TeleporterLinkFinder.GetValue(LinkedRef); RoomInstance LinkedRoomRef = RoomManager.GetInstanceByRoomId(LinkedRoomRefId); if (OutgoingUser != null) { Item TargetItem = null; Session OutgoingSession = SessionManager.GetSessionByCharacterId(OutgoingUser.ReferenceId); if (LinkedRoomRef == null && LinkedRoomRefId > 0) { RoomManager.TryLoadRoomInstance(LinkedRoomRefId); LinkedRoomRef = RoomManager.GetInstanceByRoomId(LinkedRoomRefId); } if (LinkedRoomRef != null) { TargetItem = LinkedRoomRef.GetItem(LinkedRef); } if (OutgoingSession == null || OutgoingUser.Position.X != Item.RoomPosition.X || OutgoingUser.Position.Y != Item.RoomPosition.Y || (TargetItem != null && TargetItem.TemporaryInteractionReferenceIds.ContainsKey(2))) { OutgoingUser.UnblockWalking(); Item.TemporaryInteractionReferenceIds.Remove(1); } else if (TargetItem != null) { EffectToApply = "2"; RoomActor TeleActor = OutgoingUser; if (Instance != LinkedRoomRef) { OutgoingSession.IsTeleporting = true; OutgoingSession.TargetTeleporterId = LinkedRef; RoomHandler.PrepareRoom(OutgoingSession, LinkedRoomRefId, string.Empty, true); TeleActor = null; } if (TeleActor != null) { TeleActor.BlockWalking(); TeleActor.Position = new Vector3(TargetItem.RoomPosition.X, TargetItem.RoomPosition.Y, TargetItem.RoomPosition.Z); TeleActor.BodyRotation = TargetItem.RoomRotation; TeleActor.HeadRotation = TeleActor.BodyRotation; TeleActor.UpdateNeeded = true; if (TargetItem.DisplayFlags != "2") { TargetItem.DisplayFlags = "2"; TargetItem.BroadcastStateUpdate(LinkedRoomRef); TargetItem.RequestUpdate(3); } TargetItem.TemporaryInteractionReferenceIds.Add(2, TeleActor.Id); } Item.TemporaryInteractionReferenceIds.Remove(1); Item.RequestUpdate(2); } else if (TargetItem == null) { EffectToApply = "1"; OutgoingUser.UnblockWalking(); if (Instance.IsValidStep(OutgoingUser.Position.GetVector2(), Item.SquareInFront, true)) { OutgoingUser.MoveTo(Item.SquareInFront); } Item.TemporaryInteractionReferenceIds.Remove(1); Item.RequestUpdate(2); } } if (IncomingUser != null) { if (IncomingUser.Position.X != Item.RoomPosition.X || IncomingUser.Position.Y != IncomingUser.Position.Y) { IncomingUser.UnblockWalking(); Item.TemporaryInteractionReferenceIds.Remove(2); } else { EffectToApply = "1"; IncomingUser.UnblockWalking(); Item.TemporaryInteractionReferenceIds.Remove(2); if (Instance.CanInitiateMoveToPosition(Item.SquareInFront)) { IncomingUser.MoveTo(Item.SquareInFront); } Item.RequestUpdate(3); } } if (Item.DisplayFlags != EffectToApply) { Item.DisplayFlags = EffectToApply; Item.BroadcastStateUpdate(Instance); } break; } return(true); }
private List <Vector2> FindPath() { if (mCurrentInstance == null || mTarget == null) { return(null); } RoomActor Actor = mCurrentInstance.GetActor(mActorId); if (Actor == null) { return(null); } List <Vector2> Points = new List <Vector2>(); bool MadeProgress = true; while (MadeProgress) { Vector2 NextPoint = new Vector2(-1, -1); Vector2 LastPoint = null; if (Points.Count > 0) { LastPoint = Points[Points.Count - 1]; } int FromX = 0; int FromY = 0; if (LastPoint != null) { FromX = LastPoint.X; FromY = LastPoint.Y; } else { FromX = Actor.Position.X; FromY = Actor.Position.Y; } if (FromX == mTarget.X && FromY == mTarget.Y) { break; } if (FromX > mTarget.X && FromY > mTarget.Y) { NextPoint = new Vector2(FromX - 1, FromY - 1); } else if (FromX < mTarget.X && FromY < mTarget.Y) { NextPoint = new Vector2(FromX + 1, FromY + 1); } else if (FromX > mTarget.X && FromY < mTarget.Y) { NextPoint = new Vector2(FromX - 1, FromY + 1); } else if (FromX < mTarget.X && FromY > mTarget.Y) { NextPoint = new Vector2(FromX + 1, FromY - 1); } else if (FromX > mTarget.X) { NextPoint = new Vector2(FromX - 1, FromY); } else if (FromX < mTarget.X) { NextPoint = new Vector2(FromX + 1, FromY); } else if (FromY < mTarget.Y) { NextPoint = new Vector2(FromX, FromY + 1); } else if (FromY > mTarget.Y) { NextPoint = new Vector2(FromX, FromY - 1); } MadeProgress = (NextPoint.X > -1 && NextPoint.Y > -1); if (LastPoint != null && NextPoint.X == LastPoint.X && NextPoint.Y == LastPoint.Y) { MadeProgress = false; } if (MadeProgress) { Points.Add(NextPoint); } } return(Points); }
private static bool HandleDispenser(Session Session, Item Item, RoomInstance Instance, ItemEventType Event, int RequestData, uint Opcode) { switch (Event) { case ItemEventType.Moved: { RoomActor InteractingActor = (Item.TemporaryInteractionReferenceIds.ContainsKey(0) ? Instance.GetActor(Item.TemporaryInteractionReferenceIds[0]) : null); if (InteractingActor != null) { InteractingActor.UnblockWalking(); } goto case ItemEventType.InstanceLoaded; } case ItemEventType.InstanceLoaded: { if (Item.DisplayFlags != "0") { Item.DisplayFlags = "0"; Item.BroadcastStateUpdate(Instance); } return(true); } case ItemEventType.Interact: { RoomActor InteractingActor = Instance.GetActorByReferenceId(Session.CharacterId); if (InteractingActor == null) { return(true); } if (InteractingActor.Position.X != Item.SquareInFront.X || InteractingActor.Position.Y != Item.SquareInFront.Y) { InteractingActor.MoveToItemAndInteract(Item, RequestData, Opcode); return(true); } if (Item.TemporaryInteractionReferenceIds.Count == 0) { Item.TemporaryInteractionReferenceIds.Add(0, InteractingActor.Id); InteractingActor.BlockWalking(); InteractingActor.PositionToSet = Item.SquareInFront; int NewRot = Rotation.Calculate(InteractingActor.Position.GetVector2(), Item.RoomPosition.GetVector2()); if (InteractingActor.BodyRotation != NewRot) { InteractingActor.BodyRotation = NewRot; InteractingActor.HeadRotation = NewRot; InteractingActor.UpdateNeeded = true; } Item.DisplayFlags = "1"; Item.BroadcastStateUpdate(Instance); Item.RequestUpdate(2); } return(true); } case ItemEventType.UpdateTick: { if (Item.DisplayFlags != "0") { Item.DisplayFlags = "0"; Item.BroadcastStateUpdate(Instance); } if (Item.TemporaryInteractionReferenceIds.Count < 1) { return(true); } RoomActor InteractingActor = Instance.GetActor(Item.TemporaryInteractionReferenceIds[0]); Item.TemporaryInteractionReferenceIds.Clear(); if (InteractingActor == null) { return(true); } InteractingActor.CarryItem(DrinkSetManager.GetRandomDrinkForSet(Item.Definition.BehaviorData)); int NewRot = Rotation.Calculate(InteractingActor.Position.GetVector2(), Item.RoomPosition.GetVector2()); if (InteractingActor.BodyRotation != NewRot) { InteractingActor.BodyRotation = NewRot; InteractingActor.HeadRotation = NewRot; InteractingActor.UpdateNeeded = true; } InteractingActor.UnblockWalking(); return(true); } } return(true); }
public override void PerformUpdate(RoomInstance Instance) { if (mNextSpeechAttempt <= 0) { string Message = BotManager.GetRandomSpeechForBotDefinition(mSelfBot.DefinitionId); if (Message != null && Message.Length > 0) { mSelfActor.Chat(Message); } mNextSpeechAttempt = RandomGenerator.GetNext(0, 255); } else { mNextSpeechAttempt--; } if (!mSelfActor.IsMoving && mNextMovementAttempt <= 0) { switch (mSelfBot.WalkMode) { default: case BotWalkMode.STAND: break; case BotWalkMode.FREEROAM: mSelfActor.MoveTo(new Vector2(RandomGenerator.GetNext(0, Instance.Model.Heightmap.SizeX - 1), RandomGenerator.GetNext(0, Instance.Model.Heightmap.SizeY - 1))); break; case BotWalkMode.SPECIFIED_RANGE: ReadOnlyCollection<Vector2> Possibilites = mSelfBot.PredefinedPositions; mSelfActor.MoveTo(Possibilites[RandomGenerator.GetNext(0, (Possibilites.Count - 1))]); break; } mNextMovementAttempt = RandomGenerator.GetNext(0, 180); mNeedsRotation = true; } else { mNextMovementAttempt--; if (!mSelfActor.IsMoving) { if (mMovingToServePos) { mMovingToServePos = false; mSelfActor.CarryItem(mServingItemId); mSelfActor.MoveTo(mActorServePos); } else if (mServingItemId > 0) { mSelfActor.CarryItem(0); RoomActor TargetActor = Instance.GetActor(mServingActorId); if (TargetActor != null) { TargetActor.CarryItem(mServingItemId); int NewRot = Rotation.Calculate(mActorServePos, TargetActor.Position.GetVector2()); mSelfActor.HeadRotation = NewRot; mSelfActor.BodyRotation = NewRot; mNeedsRotation = true; mSelfActor.UpdateNeeded = true; } mServingItemId = 0; } else if (mNeedsRotation && mSelfBot.Rotation >= 0) { mSelfActor.BodyRotation = mSelfBot.Rotation; mSelfActor.HeadRotation = mSelfBot.Rotation; mNeedsRotation = false; } } } }
private static bool HandleOneWayGate(Session Session, Item Item, RoomInstance Instance, ItemEventType Event, int RequestData, uint Opcode) { switch (Event) { case ItemEventType.InstanceLoaded: case ItemEventType.Moved: case ItemEventType.Placed: if (Item.DisplayFlags != "0") { Item.DisplayFlags = "0"; Item.BroadcastStateUpdate(Instance); } foreach (uint ActorId in Item.TemporaryInteractionReferenceIds.Values) { RoomActor ActorToUnlock = Instance.GetActor(ActorId); if (ActorToUnlock != null) { ActorToUnlock.UnblockWalking(); } } Item.TemporaryInteractionReferenceIds.Clear(); break; case ItemEventType.Interact: RoomActor Actor = Instance.GetActorByReferenceId(Session.CharacterId); if (Actor == null) { break; } if (Actor.Position.X != Item.SquareInFront.X || Actor.Position.Y != Item.SquareInFront.Y) { Actor.MoveToItemAndInteract(Item, RequestData, Opcode); break; } if (Item.TemporaryInteractionReferenceIds.Count == 0 && Instance.IsValidStep(Item.RoomPosition.GetVector2(), Item.SquareBehind, true) && Item.DisplayFlags == "0") { Actor.BlockWalking(); Actor.MoveTo(Item.RoomPosition.GetVector2(), true, true, true); Item.TemporaryInteractionReferenceIds.Add(1, Actor.Id); Item.RequestUpdate(1); } break; case ItemEventType.UpdateTick: RoomActor UpdateActor = null; if (Item.TemporaryInteractionReferenceIds.ContainsKey(1)) { UpdateActor = Instance.GetActor(Item.TemporaryInteractionReferenceIds[1]); } if (UpdateActor == null || !Instance.IsValidStep(Item.RoomPosition.GetVector2(), Item.SquareBehind, true) || ((UpdateActor.Position.X != Item.RoomPosition.X || UpdateActor.Position.Y != Item.RoomPosition.Y) && (UpdateActor.Position.X != Item.SquareInFront.X || UpdateActor.Position.Y != Item.SquareInFront.Y))) { if (Item.DisplayFlags != "0") { Item.DisplayFlags = "0"; Item.BroadcastStateUpdate(Instance); } if (Item.TemporaryInteractionReferenceIds.Count > 0) { Item.TemporaryInteractionReferenceIds.Clear(); } if (UpdateActor != null) { UpdateActor.UnblockWalking(); } break; } Item.DisplayFlags = "1"; Item.BroadcastStateUpdate(Instance); UpdateActor.MoveTo(Item.SquareBehind, true, true, true); Item.RequestUpdate(2); break; } return(true); }