private static void MoveWallItem(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null || !Instance.CheckUserRights(Session)) { return; } Item Item = Instance.GetItem(Message.PopWiredUInt32()); if (Item == null || Item.Definition.Type != ItemType.WallItem) { return; } string RawPlacementData = Message.PopString(); string WallPos = Instance.SetWallItem(Session, RawPlacementData, Item); if (WallPos.Length > 0) { Item.MoveToRoom(null, Instance.RoomId, new Vector3(0, 0, 0), 0, WallPos); RoomManager.MarkWriteback(Item, false); Instance.BroadcastMessage(RoomWallItemMovedComposer.Compose(Item)); ItemEventDispatcher.InvokeItemEventHandler(Session, Item, Instance, ItemEventType.Moved); } }
public static void Register() { ItemEventDispatcher.RegisterEventHandler(ItemBehavior.WiredTrigger, new ItemEventHandler(HandleWired)); ItemEventDispatcher.RegisterEventHandler(ItemBehavior.WiredEffect, new ItemEventHandler(HandleWired)); ItemEventDispatcher.RegisterEventHandler(ItemBehavior.WiredCondition, new ItemEventHandler(HandleWired)); ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Switchable, new ItemEventHandler(HandleSwitch)); }
private static void TakeItem(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null || !Instance.CheckUserRights(Session, true)) { return; } int Unknown1 = Message.PopWiredInt32(); Item Item = Instance.GetItem(Message.PopWiredUInt32()); if (Item == null || Item.Definition.Behavior == ItemBehavior.StickyNote) { return; } if (Instance.TakeItem(Item.Id)) { ItemEventDispatcher.InvokeItemEventHandler(Session, Item, Instance, ItemEventType.Removing); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Item.MoveToUserInventory(MySqlClient, Session.CharacterId); } Instance.RegenerateRelativeHeightmap(); Session.InventoryCache.Add(Item); Session.SendData(InventoryItemAddedComposer.Compose(Item)); QuestManager.ProgressUserQuest(Session, QuestType.FURNI_PICK); } }
private static void ActivateGeneric(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) // warning: rights need to be checked in the event handler; we do not check here { return; } Item Item = Instance.GetItem(Message.PopWiredUInt32()); if (Item == null || Item.Definition.Behavior == ItemBehavior.StaticItem) { return; } int RequestData = Message.PopWiredInt32(); ItemEventDispatcher.InvokeItemEventHandler(Session, Item, Instance, ItemEventType.Interact, RequestData); QuestManager.ProgressUserQuest(Session, QuestType.EXPLORE_FIND_ITEM, Item.DefinitionId); if (Item.Definition.Behavior == ItemBehavior.Switchable) { QuestManager.ProgressUserQuest(Session, QuestType.FURNI_SWITCH); } }
public static void Register() { ItemEventDispatcher.RegisterEventHandler(ItemBehavior.HabboWheel, new ItemEventHandler(HandleHabboWheel)); ItemEventDispatcher.RegisterEventHandler(ItemBehavior.SpinningBottle, new ItemEventHandler(HandleBottle)); ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Dice, new ItemEventHandler(HandleDice)); ItemEventDispatcher.RegisterEventHandler(ItemBehavior.HoloDice, new ItemEventHandler(HandleDice)); ItemEventDispatcher.RegisterEventHandler(ItemBehavior.LoveShuffler, new ItemEventHandler(HandleLoveShuffler)); }
public static void Register() { ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Switchable, new ItemEventHandler(HandleGenericSwitch)); ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Bed, new ItemEventHandler(HandleGenericSwitch)); ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Seat, new ItemEventHandler(HandleGenericSwitch)); ItemEventDispatcher.RegisterEventHandler(ItemBehavior.StepSwitch, new ItemEventHandler(HandleStepSwitch)); ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Scoreboard, new ItemEventHandler(HandleScoreboard)); ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Rental, new ItemEventHandler(HandleRental)); }
private static void MoveFloorItem(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null || !Instance.CheckUserRights(Session)) { return; } Item Item = Instance.GetItem(Message.PopWiredUInt32()); if (Item == null || Item.Definition.Type != ItemType.FloorItem) { return; } Vector2 NewPosition = new Vector2(Message.PopWiredInt32(), Message.PopWiredInt32()); int NewRotation = Message.PopWiredInt32(); bool IsRotationOnly = (Item.RoomId == Instance.RoomId && Item.RoomPosition.X == NewPosition.X && Item.RoomPosition.Y == NewPosition.Y && NewRotation != Item.RoomRotation); Vector3 FinalizedPosition = Instance.SetFloorItem(Session, Item, NewPosition, NewRotation); if (FinalizedPosition != null) { Item.MoveToRoom(null, Instance.RoomId, FinalizedPosition, NewRotation, string.Empty); RoomManager.MarkWriteback(Item, false); Instance.RegenerateRelativeHeightmap(); Instance.BroadcastMessage(RoomItemUpdatedComposer.Compose(Item)); ItemEventDispatcher.InvokeItemEventHandler(Session, Item, Instance, ItemEventType.Moved, IsRotationOnly ? 1 : 0); QuestManager.ProgressUserQuest(Session, IsRotationOnly ? QuestType.FURNI_ROTATE : QuestType.FURNI_MOVE); if (FinalizedPosition.Z > Instance.Model.Heightmap.FloorHeight[FinalizedPosition.X, FinalizedPosition.Y]) { QuestManager.ProgressUserQuest(Session, QuestType.FURNI_STACK); } } }
public static void Register() { ItemEventDispatcher.RegisterEventHandler(ItemBehavior.ExchangeItem, new ItemEventHandler(HandleExchangeRedemption)); }
public static void Register() { ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Fireworks, new ItemEventHandler(HandleFireworks)); }
public RoomInstance(uint InstanceId, RoomInfo Info, RoomModel Model) { mActorSyncRoot = new object(); mItemSyncRoot = new object(); mInstanceId = InstanceId; mInfo = Info; mActors = new Dictionary <uint, RoomActor>(); mCachedModel = Model; mRelativeHeightmap = string.Empty; mActorIdGenerator = 1; mActorIdGeneratorSyncLock = new object(); mTileStates = new TileState[mCachedModel.Heightmap.SizeX, mCachedModel.Heightmap.SizeY]; mUsersWithRights = new List <uint>(); mBannedUsers = new Dictionary <uint, double>(); mItems = new Dictionary <uint, Item>(); mStaticObjects = new List <StaticObject>(); mItemLimitCache = new Dictionary <ItemBehavior, int>(); mUserGrid = new List <RoomActor> [mCachedModel.Heightmap.SizeX, mCachedModel.Heightmap.SizeY]; mMusicController = new RoomMusicController(); mTemporaryStickieRights = new Dictionary <uint, uint>(); mTradeManager = new TradeManager(); mRollerItems = new List <Item> [mCachedModel.Heightmap.SizeX, mCachedModel.Heightmap.SizeY]; mWiredManager = new WiredManager(this); foreach (Bot Bot in BotManager.GenerateBotInstancesForRoom(RoomId)) { AddBotToRoom(Bot); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { // Items MySqlClient.SetParameter("id", RoomId); DataTable ItemTable = MySqlClient.ExecuteQueryTable("SELECT * FROM items WHERE room_id = @id"); foreach (DataRow Row in ItemTable.Rows) { Item Item = ItemFactory.CreateFromDatabaseRow(Row, mWiredManager); if (Item.PendingExpiration && Item.ExpireTimeLeft <= 0) { Item.RemovePermanently(MySqlClient); continue; } if (Item.InSoundManager) { continue; } mItems.Add(Item.Id, Item); IncrecementFurniLimitCache(Item.Definition.Behavior); ItemEventDispatcher.InvokeItemEventHandler(null, Item, this, ItemEventType.InstanceLoaded); } // Static objects MySqlClient.SetParameter("id", RoomId); DataTable StaticObjectTable = MySqlClient.ExecuteQueryTable("SELECT id,name,position,height,rotation,is_seat FROM static_objects WHERE room_id = @id"); foreach (DataRow Row in StaticObjectTable.Rows) { mStaticObjects.Add(new StaticObject((uint)Row["id"], (string)Row["name"], Vector2.FromString((string)Row["position"]), (int)Row["height"], (int)Row["rotation"], (Row["is_seat"].ToString() == "1"))); } // Rights MySqlClient.SetParameter("id", RoomId); DataTable RightsTable = MySqlClient.ExecuteQueryTable("SELECT user_id FROM room_rights WHERE room_id = @id"); foreach (DataRow Row in RightsTable.Rows) { mUsersWithRights.Add((uint)Row["user_id"]); } // Pets MySqlClient.SetParameter("id", RoomId); DataTable PetsTable = MySqlClient.ExecuteQueryTable("SELECT * FROM pets WHERE room_id = @id"); foreach (DataRow Row in PetsTable.Rows) { Pet PetData = PetFactory.GetPetFromDatabaseRow(Row); AddBotToRoom(BotManager.CreateNewInstance(BotManager.GetHandlerDefinitionForPetType(PetData.Type), RoomId, Vector3.FromString(Row["room_pos"].ToString()), PetData)); } } RegenerateRelativeHeightmap(); mUpdater = new Timer(new TimerCallback(PerformUpdate), null, TimeSpan.FromMilliseconds(500), TimeSpan.FromMilliseconds(500)); }
public void ExecuteActions(Item Item, RoomActor Actor) { Random rnd = new Random(); foreach (Item ActionItem in mInstance.GetItemsOnPosition(Item.RoomPosition.GetVector2())) { if (ActionItem.Definition.Behavior == ItemBehavior.WiredEffect) { ActionItem.DisplayFlags = "1"; ActionItem.BroadcastStateUpdate(mInstance); ActionItem.DisplayFlags = "2"; ActionItem.RequestUpdate(4); switch (WiredTypesUtil.EffectFromInt(ActionItem.Definition.BehaviorData)) { #region show_message case WiredEffectTypes.show_message: if (Actor == null) { continue; } Actor.Whisper(mWired [ActionItem.Id].Data1, 0, true); break; #endregion #region move_rotate case WiredEffectTypes.move_rotate: if (ActionItem.WiredData.Data2 == 0 && ActionItem.WiredData.Data3 == 0) { continue; } String[] ItemsToMove = ActionItem.WiredData.Data1.Split('|'); foreach (String toMove in ItemsToMove) { uint ItemId; uint.TryParse(toMove, out ItemId); Item Move = mInstance.GetItem(ItemId); if (Move == null) { continue; } Vector2 NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y); switch (ActionItem.WiredData.Data2) { case 1: switch (rnd.Next(1, 5)) { case 1: NewPosition = new Vector2(Move.RoomPosition.X - 1, Move.RoomPosition.Y); break; case 2: NewPosition = new Vector2(Move.RoomPosition.X + 1, Move.RoomPosition.Y); break; case 3: NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y + 1); break; case 4: NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y - 1); break; } break; case 2: if (rnd.Next(0, 2) == 1) { NewPosition = new Vector2(Move.RoomPosition.X - 1, Move.RoomPosition.Y); } else { NewPosition = new Vector2(Move.RoomPosition.X + 1, Move.RoomPosition.Y); } break; case 3: if (rnd.Next(0, 2) == 1) { NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y - 1); } else { NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y + 1); } break; case 4: NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y - 1); break; case 5: NewPosition = new Vector2(Move.RoomPosition.X + 1, Move.RoomPosition.Y); break; case 6: NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y + 1); break; case 7: NewPosition = new Vector2(Move.RoomPosition.X - 1, Move.RoomPosition.Y); break; } int NewRotation = Move.RoomRotation; switch (ActionItem.WiredData.Data3) { case 1: NewRotation = NewRotation + 2; if (NewRotation == 8) { NewRotation = 0; } break; case 2: NewRotation = (NewRotation - 2); if (NewRotation == -2) { NewRotation = 6; } break; case 3: if (rnd.Next(0, 2) == 1) { goto case 1; } else { goto case 2; } } bool IsRotationOnly = (ActionItem.WiredData.Data2 == 0); Vector3 FinalizedPosition = mInstance.SetFloorItem(null, Move, NewPosition, NewRotation); if (FinalizedPosition != null) { Move.MoveToRoom(null, mInstance.RoomId, FinalizedPosition, NewRotation, ""); RoomManager.MarkWriteback(Move, false); mInstance.RegenerateRelativeHeightmap(); mInstance.BroadcastMessage(RoomItemUpdatedComposer.Compose(Move)); ItemEventDispatcher.InvokeItemEventHandler(null, Move, mInstance, ItemEventType.Moved, IsRotationOnly ? 1 : 0); } } break; #endregion #region match_to_sshot case WiredEffectTypes.match_to_sshot: String[] Selected = ActionItem.WiredData.Data5.Split('+'); foreach (String FullData in Selected) { if (!FullData.Contains('#')) { continue; } String[] Data = FullData.Split('#'); if (Data.Length != 4) { continue; } uint Id = uint.Parse(Data [0]); String[] Position = Data [1].Split('|'); int Rotation = int.Parse(Data [2]); String Flags = Data [3]; int X = int.Parse(Position [0]); int Y = int.Parse(Position [1]); uint Z = uint.Parse(Position [2]); Item AffectedItem = mInstance.GetItem(Id); if (AffectedItem == null) { continue; } Boolean IsRotationOnly = (X == AffectedItem.RoomPosition.X && Y == AffectedItem.RoomPosition.Y && Z == AffectedItem.RoomPosition.Z); Vector2 NewPosition = new Vector2(X, Y); if (ActionItem.WiredData.Data2 == 1) { AffectedItem.Flags = Flags; AffectedItem.DisplayFlags = Item.Flags; AffectedItem.BroadcastStateUpdate(mInstance); } if (ActionItem.WiredData.Data3 == 0) { Rotation = AffectedItem.RoomRotation; } if (ActionItem.WiredData.Data4 == 0) { NewPosition = AffectedItem.RoomPosition.GetVector2(); } if (ActionItem.WiredData.Data4 == 1 || ActionItem.WiredData.Data3 == 1) { Vector3 FinalizedPosition = mInstance.SetFloorItem(null, AffectedItem, NewPosition, Rotation); AffectedItem.MoveToRoom(null, mInstance.RoomId, FinalizedPosition, Rotation, ""); RoomManager.MarkWriteback(AffectedItem, false); mInstance.RegenerateRelativeHeightmap(); mInstance.BroadcastMessage(RoomItemUpdatedComposer.Compose(AffectedItem)); ItemEventDispatcher.InvokeItemEventHandler(null, AffectedItem, mInstance, ItemEventType.Moved, IsRotationOnly ? 1 : 0); } else if (ActionItem.WiredData.Data2 == 1) { RoomManager.MarkWriteback(AffectedItem, true); } } break; #endregion case WiredEffectTypes.teleport_to: if (Actor == null) { continue; } String[] Selected2 = ActionItem.WiredData.Data1.Split('|'); String ItemIdS = Actor.FurniOnId.ToString(); while (Actor.FurniOnId.ToString() == ItemIdS) { ItemIdS = Selected2 [rnd.Next(0, Selected2.Length)]; } uint ItemId2; uint.TryParse(ItemIdS, out ItemId2); Item AffectedItem2 = mInstance.GetItem(ItemId2); if (AffectedItem2 == null) { continue; } Actor.PositionToSet = AffectedItem2.RoomPosition.GetVector2(); Actor.UpdateNeeded = true; break; case WiredEffectTypes.toggle_state: String[] Selected3 = ActionItem.WiredData.Data1.Split('|'); foreach (String ItemIdS2 in Selected3) { uint ItemId3; uint.TryParse(ItemIdS2, out ItemId3); Item AffectedItem3 = mInstance.GetItem(ItemId3); if (AffectedItem3 == null) { continue; } int CurrentState = 0; int.TryParse(AffectedItem3.Flags, out CurrentState); int NewState = CurrentState + 1; if (CurrentState < 0 || CurrentState >= (AffectedItem3.Definition.BehaviorData - 1)) { NewState = 0; } if (CurrentState != NewState) { AffectedItem3.Flags = NewState.ToString(); AffectedItem3.DisplayFlags = AffectedItem3.Flags; RoomManager.MarkWriteback(AffectedItem3, true); AffectedItem3.BroadcastStateUpdate(mInstance); } } break; } } } }
private static bool HandleRoller(Session Session, Item Item, RoomInstance Instance, ItemEventType Event, int RequestData, uint Opcode) { switch (Event) { case ItemEventType.UpdateTick: List <RoomActor> ActorsToMove = Instance.GetActorsOnPosition(Item.RoomPosition.GetVector2()); List <Item> ItemsToMove = new List <Item>(); ItemsToMove.AddRange(Instance.GetItemsOnPosition(Item.RoomPosition.GetVector2())); if (ActorsToMove != null) { foreach (RoomActor Actor in ActorsToMove) { if (Actor.IsMoving) { continue; } if (Instance.IsValidStep(Actor.Position.GetVector2(), Item.SquareInFront, true)) { Actor.PositionToSet = Item.SquareInFront; Instance.BroadcastMessage(RollerEventComposer.Compose(Actor.Position, new Vector3( Actor.PositionToSet.X, Actor.PositionToSet.Y, Instance.GetUserStepHeight(Actor.PositionToSet)), Item.Id, Actor.Id, 0)); } } } if (ItemsToMove.Count != 0) { foreach (Item item in ItemsToMove) { if (item == Item) { continue; } if (Item.RoomPosition.X == item.RoomPosition.X && Item.RoomPosition.Y == item.RoomPosition.Y) { Vector2 NewPosition = new Vector2(Item.SquareInFront.X, Item.SquareInFront.Y); int NewRotation = item.RoomRotation; Vector3 FinalizedPosition = Instance.SetFloorItem(Session, item, NewPosition, NewRotation); Vector3 oldpos = item.RoomPosition; if (FinalizedPosition != null) { item.MoveToRoom(null, Instance.RoomId, FinalizedPosition, NewRotation, string.Empty); RoomManager.MarkWriteback(item, false); Instance.RegenerateRelativeHeightmap(); Instance.BroadcastMessage(RoomItemUpdatedComposer.Compose(item)); ItemEventDispatcher.InvokeItemEventHandler(Session, item, Instance, ItemEventType.Moved, 0); Instance.BroadcastMessage(RollerEventComposer.Compose(oldpos, FinalizedPosition, Item.Id, 0, item.Id)); } } } } goto case ItemEventType.InstanceLoaded; case ItemEventType.InstanceLoaded: case ItemEventType.Placed: Item.RequestUpdate(4); break; } return(true); }
public void PerformUpdate(object state) { //Console.WriteLine(Thread.CurrentThread.ManagedThreadId); // use this only to debug threadpooling... List <RoomActor> ActorsToUpdate = new List <RoomActor>(); List <RoomActor> ActorsToRemove = new List <RoomActor>(); // Copy collection Dictionary <uint, RoomActor> ActorsCopy = new Dictionary <uint, RoomActor>(); List <RoomActor>[,] NewUserGrid = new List <RoomActor> [mCachedModel.Heightmap.SizeX, mCachedModel.Heightmap.SizeY]; lock (mActorSyncRoot) { foreach (KeyValuePair <uint, RoomActor> CopyItem in mActors) { ActorsCopy.Add(CopyItem.Key, CopyItem.Value); } } foreach (RoomActor Actor in ActorsCopy.Values) { // If the room is unloaded, allow no actors if (mUnloaded) { ActorsToRemove.Add(Actor); continue; } // The idle time is increased in every step. if (Actor.Type == RoomActorType.UserCharacter) { Actor.IncreaseIdleTime(Actor.ReferenceId == Info.OwnerId); } // If this is a bot, allow the brain to process this update tick. if (Actor.Type == RoomActorType.AiBot) { ((Bot)Actor.ReferenceObject).Brain.PerformUpdate(this); } // Remove any walking statusses (they will be re-applied below if neccessary) if (Actor.UserStatusses.ContainsKey("mv")) { Actor.RemoveStatus("mv"); Actor.UpdateNeeded = true; } // Update actor position if neccessary if (Actor.PositionToSet != null) { // Check if the new position is in the door if (Actor.Type == RoomActorType.UserCharacter && Actor.PositionToSet.X == mCachedModel.DoorPosition.X && Actor.PositionToSet.Y == mCachedModel.DoorPosition.Y) { ActorsToRemove.Add(Actor); continue; } // Update the actual position Actor.Position = new Vector3(Actor.PositionToSet.X, Actor.PositionToSet.Y, (Math.Round(GetUserStepHeight(Actor.PositionToSet), 1))); Actor.PositionToSet = null; // Handle any "MoveToAndInteract" events if this was the last step if (!Actor.IsMoving && Actor.MoveToAndInteract > 0 && Actor.Type == RoomActorType.UserCharacter) { Item Item = GetItem(Actor.MoveToAndInteract); if (Item != null) { ItemEventDispatcher.InvokeItemEventHandler(SessionManager.GetSessionByCharacterId( Actor.ReferenceId), Item, this, ItemEventType.Interact, Actor.MoveToAndInteractData); } Actor.MoveToAndInteract = 0; Actor.MoveToAndInteractData = 0; } } // If there are more steps to be made, handle it. if (Actor.IsMoving) { // Check if moving to door if (!Actor.IsLeavingRoom && Actor.Pathfinder.Target.X == mCachedModel.DoorPosition.X && Actor.Pathfinder.Target.Y == mCachedModel.DoorPosition.Y) { Actor.IsLeavingRoom = true; } // Get the next step from the pathfinder Vector2 NextStep = Actor.GetNextStep(); // If the user is leaving and has exceeded 11 steps, help him out by instantly // removing them. if (Actor.LeaveStepsTaken >= 11) { ActorsToRemove.Add(Actor); continue; } // If the pathfinder reports no more steps to be made, this is the last step. bool LastStep = !Actor.IsMoving; // Check that the next step is valid and allowed if (NextStep != null && ((!Actor.ClippingEnabled && IsValidPosition(NextStep)) || IsValidStep(Actor.Position.GetVector2(), NextStep, LastStep, NewUserGrid))) { // Update "mv" status Actor.SetStatus("mv", NextStep.X + "," + NextStep.Y + "," + (Math.Round(GetUserStepHeight(NextStep), 1)).ToString().Replace(',', '.')); Actor.PositionToSet = NextStep; // Update new/temporary grid with our new move to position if (NewUserGrid[NextStep.X, NextStep.Y] == null) { NewUserGrid[NextStep.X, NextStep.Y] = new List <RoomActor>(); } NewUserGrid[NextStep.X, NextStep.Y].Add(Actor); // Remove any "sit" statusses if (Actor.UserStatusses.ContainsKey("sit")) { Actor.RemoveStatus("sit"); } // Remove any "lay" statusses if (Actor.UserStatusses.ContainsKey("lay")) { Actor.RemoveStatus("lay"); } // Update rotation Actor.BodyRotation = Rotation.Calculate(Actor.Position.GetVector2(), NextStep); Actor.HeadRotation = Actor.BodyRotation; // Request update for next @B cycle Actor.UpdateNeeded = true; } else { // Invalid step: tell pathfinder to stop and mark current position on temporary grid Actor.StopMoving(); if (NewUserGrid[NextStep.X, NextStep.Y] == null) { NewUserGrid[NextStep.X, NextStep.Y] = new List <RoomActor>(); } NewUserGrid[NextStep.X, NextStep.Y].Add(Actor); } } else { if (NewUserGrid[Actor.Position.X, Actor.Position.Y] == null) { NewUserGrid[Actor.Position.X, Actor.Position.Y] = new List <RoomActor>(); } NewUserGrid[Actor.Position.X, Actor.Position.Y].Add(Actor); } // If the actor is leaving and has stopped walking, help them out by removing them. if (!Actor.IsMoving && Actor.IsLeavingRoom && Actor.Type == RoomActorType.UserCharacter) { ActorsToRemove.Add(Actor); continue; } // Update status (apply any sit/lay/effect) UpdateActorStatus(Actor); // Add this actor to the update list if this has been requested if (Actor.UpdateNeeded) { ActorsToUpdate.Add(Actor); Actor.UpdateNeeded = false; } } // Remove all actors that need to be removed foreach (RoomActor Actor in ActorsToRemove) { lock (mActorSyncRoot) { if (ActorsToUpdate.Contains(Actor)) { ActorsToUpdate.Remove(Actor); } } switch (Actor.Type) { default: RemoveActorFromRoom(Actor.Id); break; case RoomActorType.UserCharacter: HardKickUser(Actor.ReferenceId); break; } } // Send update list (if there are any updates) to room if (ActorsToUpdate.Count > 0) { BroadcastMessage(RoomUserStatusListComposer.Compose(ActorsToUpdate)); } // Update tick on all items -- List <Item> ItemCopy = null; lock (mItemSyncRoot) { ItemCopy = mItems.Values.ToList(); } foreach (Item Item in ItemCopy) { Item.Update(this); } // Invalidate door position NewUserGrid[mCachedModel.DoorPosition.X, mCachedModel.DoorPosition.Y] = null; // Update user grid to our new version lock (mActorSyncRoot) { mUserGrid = NewUserGrid; } if (mMusicController != null && mMusicController.IsPlaying) { mMusicController.Update(this); } }
public static void Main(string[] args) { mAlive = true; DateTime InitStart = DateTime.Now; // Set up basic output Console.WriteLine("Initializing Snowlight..."); // Cannot be localized before config+lang is loaded // Load configuration, translation, and re-configure output from config data ConfigManager.Initialize(Constants.DataFileDirectory + "server-main.cfg"); Output.InitializeStream(true, (OutputLevel)ConfigManager.GetValue("output.verbositylevel")); Output.WriteLine("Initializing Snowlight..."); Localization.Initialize(Constants.LangFileDirectory + "lang_" + ConfigManager.GetValue("lang") + ".lang"); // Process args foreach (string arg in args) { Output.WriteLine(Localization.GetValue("core.init.cmdarg", arg)); Input.ProcessInput(arg.Split(' ')); } try { // Initialize and test database Output.WriteLine(Localization.GetValue("core.init.mysql")); SqlDatabaseManager.Initialize(); // Initialize network components Output.WriteLine(Localization.GetValue("core.init.net", ConfigManager.GetValue("net.bind.port").ToString())); mServer = new SnowTcpListener(new IPEndPoint((IPAddress)ConfigManager.GetValue("net.bind.ip"), (int)ConfigManager.GetValue("net.bind.port")), (int)ConfigManager.GetValue("net.backlog"), new OnNewConnectionCallback( SessionManager.HandleIncomingConnection)); Output.WriteLine(Localization.GetValue("core.init.net", ConfigManager.GetValue("net.cmd.bind.port").ToString())); musServer = new SnowTcpListener(new IPEndPoint((IPAddress)ConfigManager.GetValue("net.cmd.bind.ip"), (int)ConfigManager.GetValue("net.cmd.bind.port")), (int)ConfigManager.GetValue("net.backlog"), new OnNewConnectionCallback( CommandListener.parse)); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Output.WriteLine(Localization.GetValue("core.init.dbcleanup")); PerformDatabaseCleanup(MySqlClient); Output.WriteLine(Localization.GetValue("core.init.game")); // Core DataRouter.Initialize(); // Sessions, characters Handshake.Initialize(); GlobalHandler.Initialize(); SessionManager.Initialize(); CharacterInfoLoader.Initialize(); RightsManager.Initialize(MySqlClient); SingleSignOnAuthenticator.Initialize(); // Room management and navigator RoomManager.Initialize(MySqlClient); RoomInfoLoader.Initialize(); RoomHandler.Initialize(); RoomItemHandler.Initialize(); Navigator.Initialize(MySqlClient); // Help and moderation HelpTool.Initialize(MySqlClient); ModerationPresets.Initialize(MySqlClient); ModerationTicketManager.Initialize(MySqlClient); ModerationHandler.Initialize(); ModerationBanManager.Initialize(MySqlClient); // Catalog, pets and items ItemDefinitionManager.Initialize(MySqlClient); CatalogManager.Initialize(MySqlClient); CatalogPurchaseHandler.Initialize(); Inventory.Initialize(); ItemEventDispatcher.Initialize(); PetDataManager.Initialize(MySqlClient); // Messenger MessengerHandler.Initialize(); // Achievements and quests AchievementManager.Initialize(MySqlClient); QuestManager.Initialize(MySqlClient); // Misc/extras CrossdomainPolicy.Initialize("Data\\crossdomain.xml"); InfobusManager.Initialize(); ActivityPointsWorker.Initialize(); BotManager.Initialize(MySqlClient); InterstitialManager.Initialize(MySqlClient); ChatEmotions.Initialize(); EffectsCacheWorker.Initialize(); RecyclerManager.Initialize(MySqlClient); DrinkSetManager.Initialize(MySqlClient); SongManager.Initialize(); TradeHandler.Initialize(); RandomGenerator.Initialize(); StatisticsSyncUtil.Initialize(); Wordfilter.Initialize(MySqlClient); // Polish WarningSurpressors.Initialize(); } } catch (Exception e) { HandleFatalError(Localization.GetValue("core.init.error.details", new string[] { e.Message, e.StackTrace })); return; } // Init complete TimeSpan TimeSpent = DateTime.Now - InitStart; Output.WriteLine(Localization.GetValue("core.init.ok", Math.Round(TimeSpent.TotalSeconds, 2).ToString()), OutputLevel.Notification); Output.WriteLine((string)Localization.GetValue("core.init.ok.cmdinfo"), OutputLevel.Notification); Console.Write("$" + Environment.UserName.ToLower() + "@snowlight> "); Console.Beep(); Input.Listen(); // This will make the main thread process console while Program.Alive. }
public static void Register() { ItemEventDispatcher.RegisterEventHandler(ItemBehavior.TraxPlayer, new ItemEventHandler(HandleJukebox)); }
private static void PlaceItem(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { return; } uint ItemId = 0; string[] Data = null; if (Message.Id == OpcodesIn.ROOM_ITEM_PLACE_STICKY) { ItemId = Message.PopWiredUInt32(); string RawData = Message.PopString(); string[] TmpData = RawData.Split(' '); Data = new string[TmpData.Length + 1]; Data[0] = string.Empty; Data[1] = TmpData[0]; Data[2] = TmpData[1]; Data[3] = TmpData[2]; } else { string RawData = Message.PopString(); Data = RawData.Split(' '); uint.TryParse(Data[0], out ItemId); } Item Item = Session.InventoryCache.GetItem(ItemId); if (Item == null) { return; } bool HasPlacementRights = Instance.CheckUserRights(Session); bool IsPlacingGuestStickie = false; if (Item.Definition.Behavior == ItemBehavior.StickyNote && !HasPlacementRights && Instance.GuestsCanPlaceStickies) { IsPlacingGuestStickie = true; } else if (!HasPlacementRights) { Session.SendData(RoomItemPlacementErrorComposer.Compose(RoomItemPlacementErrorCode.InsufficientRights)); return; } if (Item.PendingExpiration && Item.ExpireTimeLeft <= 0) { using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Item.RemovePermanently(MySqlClient); } Session.InventoryCache.RemoveItem(Item.Id); Session.SendData(InventoryItemRemovedComposer.Compose(Item.Id)); return; } switch (Item.Definition.Type) { default: case ItemType.FloorItem: if (Data.Length != 4) { return; } int X = 0; int Y = 0; int Rotation = 0; int.TryParse(Data[1], out X); int.TryParse(Data[2], out Y); int.TryParse(Data[3], out Rotation); Vector3 FinalizedPosition = Instance.SetFloorItem(Session, Item, new Vector2(X, Y), Rotation); if (FinalizedPosition != null) { using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Item.MoveToRoom(MySqlClient, Instance.RoomId, FinalizedPosition, Rotation); } Instance.RegenerateRelativeHeightmap(); Session.InventoryCache.RemoveItem(Item.Id); Session.SendData(InventoryItemRemovedComposer.Compose(Item.Id)); ItemEventDispatcher.InvokeItemEventHandler(Session, Item, Instance, ItemEventType.Placed); Instance.BroadcastMessage(RoomFloorItemPlacedComposer.Compose(Item)); QuestManager.ProgressUserQuest(Session, QuestType.FURNI_PLACE); if (FinalizedPosition.Z > Instance.Model.Heightmap.FloorHeight[FinalizedPosition.X, FinalizedPosition.Y]) { QuestManager.ProgressUserQuest(Session, QuestType.FURNI_STACK); } } break; case ItemType.WallItem: string[] CorrectedData = new string[Data.Length - 1]; for (int i = 1; i < Data.Length; i++) { CorrectedData[i - 1] = Data[i]; } string WallPos = Instance.SetWallItem(Session, CorrectedData, Item); if (WallPos.Length > 0) { using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Item.MoveToRoom(MySqlClient, Instance.RoomId, new Vector3(0, 0, 0), 0, WallPos); } Session.InventoryCache.RemoveItem(Item.Id); Session.SendData(InventoryItemRemovedComposer.Compose(Item.Id)); ItemEventDispatcher.InvokeItemEventHandler(Session, Item, Instance, ItemEventType.Placed); Instance.BroadcastMessage(RoomWallItemPlacedComposer.Compose(Item)); if (IsPlacingGuestStickie) { Instance.GiveTemporaryStickieRights(Item.Id, Session.CharacterId); Session.SendData(StickyDataComposer.Compose(Item)); } } break; } }
public static void Main(string[] args) { mAlive = true; DateTime InitStart = DateTime.Now; // Set up basic output, configuration, etc Output.InitializeStream(true, OutputLevel.DebugInformation); Output.WriteLine("Initializing Snowlight..."); ConfigManager.Initialize(Constants.DataFileDirectory + "\\server-main.cfg"); Output.SetVerbosityLevel((OutputLevel)ConfigManager.GetValue("output.verbositylevel")); // Load Lang LangManager.Initialize(Constants.LangFileDirectory + "\\lang_" + ConfigManager.GetValue("lang") + ".lang"); // Process args foreach (string arg in args) { Output.WriteLine("Command line argument: " + arg); Input.ProcessInput(arg.Split(' ')); } try { // Initialize and test database Output.WriteLine("Initializing MySQL manager..."); SqlDatabaseManager.Initialize(); // Initialize network components Output.WriteLine("Setting up server listener on port " + (int)ConfigManager.GetValue("net.bind.port") + "..."); mServer = new SnowTcpListener(new IPEndPoint(IPAddress.Any, (int)ConfigManager.GetValue("net.bind.port")), (int)ConfigManager.GetValue("net.backlog"), new OnNewConnectionCallback( SessionManager.HandleIncomingConnection)); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Output.WriteLine("Resetting database counters and statistics..."); PerformDatabaseCleanup(MySqlClient); Output.WriteLine("Initializing game components and workers..."); // Core DataRouter.Initialize(); // Sessions, characters Handshake.Initialize(); GlobalHandler.Initialize(); SessionManager.Initialize(); CharacterInfoLoader.Initialize(); RightsManager.Initialize(MySqlClient); SingleSignOnAuthenticator.Initialize(); // Room management and navigator RoomManager.Initialize(MySqlClient); RoomInfoLoader.Initialize(); RoomHandler.Initialize(); RoomItemHandler.Initialize(); Navigator.Initialize(MySqlClient); // Help and moderation HelpTool.Initialize(MySqlClient); ModerationPresets.Initialize(MySqlClient); ModerationTicketManager.Initialize(MySqlClient); ModerationHandler.Initialize(); ModerationBanManager.Initialize(MySqlClient); // Catalog, pets and items ItemDefinitionManager.Initialize(MySqlClient); CatalogManager.Initialize(MySqlClient); CatalogPurchaseHandler.Initialize(); Inventory.Initialize(); ItemEventDispatcher.Initialize(); PetDataManager.Initialize(MySqlClient); // Messenger MessengerHandler.Initialize(); // Achievements and quests AchievementManager.Initialize(MySqlClient); QuestManager.Initialize(MySqlClient); // Misc/extras CrossdomainPolicy.Initialize("Data\\crossdomain.xml"); InfobusManager.Initialize(); ActivityPointsWorker.Initialize(); BotManager.Initialize(MySqlClient); InterstitialManager.Initialize(MySqlClient); ChatEmotions.Initialize(); EffectsCacheWorker.Initialize(); RecyclerManager.Initialize(MySqlClient); DrinkSetManager.Initialize(MySqlClient); SongManager.Initialize(); TradeHandler.Initialize(); RandomGenerator.Initialize(); StatisticsSyncUtil.Initialize(); // Polish WarningSurpressors.Initialize(); } } catch (Exception e) { HandleFatalError("Could not initialize Snowlight: " + e.Message + "\n" + e.StackTrace); return; } // Init complete TimeSpan TimeSpent = DateTime.Now - InitStart; Output.WriteLine("The server has initialized successfully (" + Math.Round(TimeSpent.TotalSeconds, 2) + " seconds). Ready for connections.", OutputLevel.Notification); Output.WriteLine((string)LangManager.GetValue("initialized.info.cmd"), OutputLevel.Notification); Console.Beep(); Input.Listen(); // This will make the main thread process console while Program.Alive. }
public static void Register() { ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Gate, new ItemEventHandler(HandleFixedGateSwitch)); ItemEventDispatcher.RegisterEventHandler(ItemBehavior.OneWayGate, new ItemEventHandler(HandleOneWayGate)); }
public static void Register() { ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Roller, new ItemEventHandler(HandleRoller)); }
public static void Register() { ItemEventDispatcher.RegisterEventHandler(ItemBehavior.TimedAlert, new ItemEventHandler(HandleAlert)); }