private void OnEntityUse(int player, ServerEntityId id) { ServerEntity e = m.EntityGet(id); if (e.sign == null) { return; } // TODO: Check permissions Dialog d = new Dialog(); d.Width = 400; d.Height = 200; d.IsModal = true; d.Widgets = new Widget[4]; int widgetCount = 0; var font = new DialogFont("Verdana", 11f, DialogFontStyle.Bold); d.Widgets[widgetCount++] = Widget.MakeSolid(0, 0, 300, 200, Color.FromArgb(255, 50, 50, 50).ToArgb()); d.Widgets[widgetCount++] = Widget.MakeTextBox(e.sign.text, font, 50, 50, 200, 50, Color.FromArgb(255, 0, 0, 0).ToArgb()); Widget okHandler = Widget.MakeSolid(100, 100, 100, 50, Color.FromArgb(255, 100, 100, 100).ToArgb()); okHandler.ClickKey = (char)13; okHandler.Id = "UseSign_OK"; d.Widgets[widgetCount++] = okHandler; d.Widgets[widgetCount++] = Widget.MakeText("OK", font, 100, 100, Color.FromArgb(255, 0, 0, 0).ToArgb()); editingSign[player] = id; m.SendDialog(player, "UseSign", d); }
void OnUseEntity(int player, int chunkx, int chunky, int chunkz, int id) { ServerEntity e = server.GetEntity(chunkx, chunky, chunkz, id); if (e.sign == null) { return; } if (!server.CheckBuildPrivileges(player, (int)e.position.x, (int)e.position.z, (int)e.position.y)) { return; } ManicDigger.Dialog d = new ManicDigger.Dialog(); d.Width = 400; d.Height = 200; d.IsModal = true; d.Widgets = new ManicDigger.Widget[4]; int widgetCount = 0; var font = new DialogFont("Verdana", 11f, DialogFontStyle.Bold); d.Widgets[widgetCount++] = Widget.MakeSolid(0, 0, 300, 200, Game.ColorFromArgb(255, 50, 50, 50)); d.Widgets[widgetCount++] = Widget.MakeTextBox(e.sign.text, font, 50, 50, 200, 50, Game.ColorFromArgb(255, 0, 0, 0)); Widget okHandler = Widget.MakeSolid(100, 100, 100, 50, Game.ColorFromArgb(255, 100, 100, 100)); okHandler.ClickKey = (char)13; okHandler.Id = "UseSign_OK"; d.Widgets[widgetCount++] = okHandler; d.Widgets[widgetCount++] = Widget.MakeText("OK", font, 100, 100, Game.ColorFromArgb(255, 0, 0, 0)); ServerEntityId id_ = new ServerEntityId(); id_.chunkx = chunkx; id_.chunky = chunky; id_.chunkz = chunkz; id_.id = id; server.clients[player].editingSign = id_; server.SendDialog(player, "UseSign", d); }
private void OnEntityUpdate(ServerEntityId id) { ServerEntity e = m.EntityGet(id); if (e.sign == null) { return; } if (e.drawModel == null) { e.drawModel = new ServerEntityAnimatedModel(); } e.drawModel.model = "signmodel.txt"; e.drawModel.texture = "signmodel.png"; e.drawModel.modelHeight = 1.3f; if (e.drawText == null) { e.drawText = new ServerEntityDrawText(); } e.drawText.text = e.sign.text; e.drawText.dx = 0.1f; e.drawText.dy = 1.1f; e.drawText.dz = 0.1f; e.usable = true; if (e.drawName == null) { e.drawName = new ServerEntityDrawName(); e.drawName.name = "Sign"; e.drawName.onlyWhenSelected = true; } }
public ServerEntity EntityGet(ServerEntityId id) { if (id == null) { throw new ArgumentNullException("id", "The entity ID must not be null!"); } return(server.GetEntity(id)); }
public void EntitySetDirty(ServerEntityId id) { if (id == null) { throw new ArgumentNullException("id", "The entity ID must not be null!"); } server.SetEntityDirty(id); }
public void EntityDelete(ServerEntityId id) { if (id == null) { throw new ArgumentNullException("id", "The entity ID must not be null!"); } server.DespawnEntity(id); }
void OnDialogClick(DialogClickArgs args) { string name = null; PermissionSignType type = PermissionSignType.Player; if (args.GetWidgetId() == "UsePermissionSign_OK") { name = args.GetTextBoxValue()[1]; type = PermissionSignType.Player; for (int i = 0; i < server.serverClient.Groups.Count; i++) { Group g = server.serverClient.Groups[i]; if (name == g.Name) { type = PermissionSignType.Group; } } } else if (args.GetWidgetId().StartsWith("PermissionSignGroup")) { for (int i = 0; i < server.serverClient.Groups.Count; i++) { Group g = server.serverClient.Groups[i]; if (args.GetWidgetId() == "PermissionSignGroup" + g.Name) { name = g.Name; type = PermissionSignType.Group; } } } else { //Return when dialog is not a sign return; } ClientOnServer c = server.clients[args.GetPlayer()]; ServerEntityId id = c.editingSign; if (name != "") { c.editingSign = null; ServerEntity e = server.GetEntity(id.chunkx, id.chunky, id.chunkz, id.id); e.permissionSign.name = name; e.permissionSign.type = type; server.SetEntityDirty(id); } else { server.DespawnEntity(id); } server.SendDialog(args.GetPlayer(), "UseSign", null); }
int IndexOfNull(ServerEntityId[] list, int listCount) { for (int i = 0; i < listCount; i++) { ServerEntityId s = list[i]; if (s == null) { return(i); } } return(-1); }
public override void Update(Server server_, float dt) { server = server_; if (!started) { started = true; server_.modManager.RegisterOnBlockUseWithTool(OnUseWithTool); server_.modEventHandlers.onentityupdate.Add(UpdateEntity); server_.modEventHandlers.onentityuse.Add(OnUseEntity); server.modEventHandlers.ondialogclick2.Add(OnDialogClick); server.modEventHandlers.onpermission.Add(OnPermission); editingSign = new ServerEntityId[server.modManager.GetMaxPlayers()]; } }
void OnUseEntity(int player, int chunkx, int chunky, int chunkz, int id) { ServerEntity e = server.GetEntity(chunkx, chunky, chunkz, id); if (e.permissionSign == null) { return; } if (!server.PlayerHasPrivilege(player, ServerClientMisc.Privilege.area_add)) { server.SendMessage(player, server.colorError + server.language.Get("Server_CommandInsufficientPrivileges")); return; } ManicDigger.Dialog d = new ManicDigger.Dialog(); d.Width = 400; d.Height = 400; d.IsModal = true; d.Widgets = new ManicDigger.Widget[4 + server.serverClient.Groups.Count * 2]; int widgetCount = 0; var font = new DialogFont("Verdana", 11f, DialogFontStyle.Bold); d.Widgets[widgetCount++] = Widget.MakeSolid(0, 0, 400, 400, Game.ColorFromArgb(255, 50, 50, 50)); d.Widgets[widgetCount++] = Widget.MakeTextBox(e.permissionSign.name, font, 50, 50, 200, 50, Game.ColorFromArgb(255, 0, 0, 0)); for (int i = 0; i < server.serverClient.Groups.Count; i++) { Group g = server.serverClient.Groups[i]; Widget button = Widget.MakeSolid(50, 150 + i * 50, 100, 40, Game.ColorFromArgb(255, 100, 100, 100)); button.ClickKey = (char)13; button.Id = "PermissionSignGroup" + g.Name; d.Widgets[widgetCount++] = button; d.Widgets[widgetCount++] = Widget.MakeText(g.Name, font, 50, 150 + i * 50, Game.ColorFromArgb(255, 0, 0, 0)); } Widget okHandler = Widget.MakeSolid(200, 50, 100, 50, Game.ColorFromArgb(255, 100, 100, 100)); okHandler.ClickKey = (char)13; okHandler.Id = "UsePermissionSign_OK"; d.Widgets[widgetCount++] = okHandler; d.Widgets[widgetCount++] = Widget.MakeText("Set player", font, 200, 50, Game.ColorFromArgb(255, 0, 0, 0)); ServerEntityId id_ = new ServerEntityId(); id_.chunkx = chunkx; id_.chunky = chunky; id_.chunkz = chunkz; id_.id = id; server.clients[player].editingSign = id_; server.SendDialog(player, "UseSign", d); }
bool Contains(ServerEntityId[] list, int listCount, ServerEntityId value) { for (int i = 0; i < listCount; i++) { ServerEntityId s = list[i]; if (s == null) { continue; } if (s.chunkx == value.chunkx && s.chunky == value.chunky && s.chunkz == value.chunkz && s.id == value.id) { return(true); } } return(false); }
bool Contains(ServerEntityId[] list, int listCount, ServerEntityId value) { for (int i = 0; i < listCount; i++) { ServerEntityId s = list[i]; if (s == null) { continue; } if (s.chunkx == value.chunkx && s.chunky == value.chunky && s.chunkz == value.chunkz && s.id == value.id) { return true; } } return false; }
public void Start(ModManager m) { this.m = m; editingSign = new ServerEntityId[m.GetMaxPlayers()]; m.SetBlockType(75, "EntitySign", new BlockType() { AllTextures = "VandalFinder", DrawType = DrawType.Solid, WalkableType = WalkableType.Solid, IsUsable = true, IsTool = true, }); m.AddToCreativeInventory("EntitySign"); m.RegisterOnBlockUseWithTool(OnUseWithTool); m.RegisterOnEntityUse(OnEntityUse); m.RegisterOnEntityUpdate(OnEntityUpdate); m.RegisterOnDialogClick2(OnDialogClick); }
private void OnDialogClick(DialogClickArgs args) { if (args.GetWidgetId() != "UseSign_OK") { //Return when dialog is not a sign return; } string newText = args.GetTextBoxValue()[1]; ServerEntityId id = editingSign[args.GetPlayer()]; if (newText != "") { editingSign[args.GetPlayer()] = null; ServerEntity e = m.EntityGet(id); e.sign.text = newText; m.EntitySetDirty(id); } else { m.EntityDelete(id); } m.SendDialog(args.GetPlayer(), "UseSign", null); }
public ClientOnServer() { float one = 1; entity = new ServerEntity(); entity.drawName = new ServerEntityDrawName(); entity.drawName.clientAutoComplete = true; entity.position = new ServerEntityPositionAndOrientation(); entity.position.pitch = 2 * 255 / 4; entity.drawModel = new ServerEntityAnimatedModel(); entity.drawModel.downloadSkin = true; Id = -1; state = ClientStateOnServer.Connecting; queryClient = true; received = new List <byte>(); Ping = new Ping_(); playername = Server.invalidplayername; Model = "player.txt"; chunksseenTime = new Dictionary <int, int>(); heightmapchunksseen = new Dictionary <Vector2i, int>(); IsInventoryDirty = true; IsPlayerStatsDirty = true; FillLimit = 500; privileges = new List <string>(); displayColor = "&f"; EyeHeight = one * 15 / 10; ModelHeight = one * 17 / 10; WindowSize = new int[] { 800, 600 }; playersDirty = new bool[128]; for (int i = 0; i < 128; i++) { playersDirty[i] = true; } spawnedEntities = new ServerEntityId[64]; spawnedEntitiesCount = 64; updateEntity = new bool[spawnedEntitiesCount]; }
void OnDialogClick(DialogClickArgs args) { if (args.GetWidgetId() != "UseSign_OK") { //Return when dialog is not a sign return; } var c = server.clients[args.GetPlayer()]; string newText = args.GetTextBoxValue()[1]; ServerEntityId id = c.editingSign; if (newText != "") { c.editingSign = null; ServerEntity e = server.GetEntity(id.chunkx, id.chunky, id.chunkz, id.id); e.sign.text = newText; server.SetEntityDirty(id); } else { server.DespawnEntity(id); } server.SendDialog(args.GetPlayer(), "UseSign", null); }
void NotifyEntities(Server server, int clientid, float dt) { ClientOnServer c = server.clients[clientid]; c.notifyEntitiesAccum += dt; if (c.notifyEntitiesAccum < (one / EntityPositionUpdatesPerSecond)) { return; } c.notifyEntitiesAccum = 0; // find nearest entities int max = SpawnMaxEntities; ServerEntityId[] nearestEntities = new ServerEntityId[max]; FindNearEntities(server, c, max, nearestEntities); // update entities for (int i = 0; i < max; i++) { ServerEntityId e = nearestEntities[i]; if (e == null) { continue; } for (int k = 0; k < server.modEventHandlers.onupdateentity.Count; k++) { server.modEventHandlers.onupdateentity[k](e.chunkx, e.chunky, e.chunkz, e.id); } } // despawn old entities for (int i = 0; i < c.spawnedEntitiesCount; i++) { ServerEntityId e = c.spawnedEntities[i]; if (e == null) { continue; } if (!Contains(nearestEntities, max, e)) { int onClientId = i; c.spawnedEntities[onClientId] = null; server.SendPacket(clientid, ServerPackets.EntityDespawn(64 + onClientId)); } } // spawn new entities for (int i = 0; i < max; i++) { ServerEntityId e = nearestEntities[i]; if (e == null) { continue; } if (!Contains(c.spawnedEntities, max, e)) { int onClientId = IndexOfNull(c.spawnedEntities, c.spawnedEntitiesCount); c.spawnedEntities[onClientId] = e.Clone(); ServerChunk chunk = server.d_Map.GetChunk(e.chunkx * Server.chunksize, e.chunky * Server.chunksize, e.chunkz * Server.chunksize); ServerEntity ee = chunk.Entities[e.id]; Packet_ServerEntity ne = ToNetworkEntity(server.serverPlatform, ee); server.SendPacket(clientid, ServerPackets.EntitySpawn(64 + onClientId, ne)); } } for (int i = 0; i < max; i++) { if (c.updateEntity[i]) { c.updateEntity[i] = false; ServerEntityId e = c.spawnedEntities[i]; ServerChunk chunk = server.d_Map.GetChunk(e.chunkx * Server.chunksize, e.chunky * Server.chunksize, e.chunkz * Server.chunksize); ServerEntity ee = chunk.Entities[e.id]; Packet_ServerEntity ne = ToNetworkEntity(server.serverPlatform, ee); server.SendPacket(clientid, ServerPackets.EntitySpawn(64 + i, ne)); } } }
void UpdateEntity(ServerEntityId id) { ServerEntity e = server.GetEntity(id); if (e.permissionSign == null) { return; } if (e.drawModel == null) { e.drawModel = new ServerEntityAnimatedModel(); } e.drawModel.model = "signmodel.txt"; e.drawModel.texture = "permissionsignmodel.png"; e.drawModel.modelHeight = one * 13 / 10; if (e.drawText == null) { e.drawText = new ServerEntityDrawText(); } e.drawText.text = e.permissionSign.name; if (e.permissionSign.type == PermissionSignType.Group) { e.drawText.text = "&4" + e.drawText.text; } e.drawText.dx = one * 3 / 32; e.drawText.dy = one * 36 / 32; e.drawText.dz = one * 3 / 32; e.usable = true; if (e.drawName == null) { e.drawName = new ServerEntityDrawName(); } e.drawName.name = "Permission Sign"; e.drawName.onlyWhenSelected = true; if (e.drawArea == null) { e.drawArea = new ServerEntityDrawArea(); } int sizex = 32; int sizey = 32; int sizez = 32; e.drawArea.x = (int)e.position.x - sizex / 2; e.drawArea.y = (int)e.position.y - sizey / 2; e.drawArea.z = (int)e.position.z - sizez / 2; byte heading = (byte)(e.position.heading + 255 / 8); int rotDir = heading / 64; if (rotDir == 0) { e.drawArea.x = (int)e.position.x - sizex / 2; e.drawArea.y = (int)e.position.y - sizey / 2; e.drawArea.z = (int)e.position.z - sizez; } else if (rotDir == 1) { e.drawArea.x = (int)e.position.x; e.drawArea.y = (int)e.position.y - sizey / 2; e.drawArea.z = (int)e.position.z - sizez / 2; } else if (rotDir == 2) { e.drawArea.x = (int)e.position.x - sizex / 2; e.drawArea.y = (int)e.position.y - sizey / 2; e.drawArea.z = (int)e.position.z; } else { e.drawArea.x = (int)e.position.x - sizex; e.drawArea.y = (int)e.position.y - sizey / 2; e.drawArea.z = (int)e.position.z - sizez / 2; } e.drawArea.sizex = sizex; e.drawArea.sizey = sizey; e.drawArea.sizez = sizez; }
void FindNearEntities(Server server, ClientOnServer c, int maxCount, ServerEntityId[] ret) { List <ServerEntityId> list = new List <ServerEntityId>(); int playerx = c.PositionMul32GlX / 32; int playery = c.PositionMul32GlZ / 32; int playerz = c.PositionMul32GlY / 32; // Find all entities in 3x3x3 chunks around player. for (int xx = -1; xx < 2; xx++) { for (int yy = -1; yy < 2; yy++) { for (int zz = -1; zz < 2; zz++) { int chunkx = playerx / Server.chunksize + xx; int chunky = playery / Server.chunksize + yy; int chunkz = playerz / Server.chunksize + zz; if (!MapUtil.IsValidChunkPos(server.d_Map, chunkx, chunky, chunkz, Server.chunksize)) { continue; } ServerChunk chunk = server.d_Map.GetChunk(chunkx * Server.chunksize, chunky * Server.chunksize, chunkz * Server.chunksize); if (chunk == null) { continue; } if (chunk.Entities == null) { continue; } for (int i = 0; i < chunk.EntitiesCount; i++) { if (chunk.Entities[i] == null) { continue; } if (chunk.Entities[i].position == null) { continue; } ServerEntityId id = new ServerEntityId(chunkx, chunky, chunkz, i); list.Add(id); } } } } // Return maxCount of entities nearest to player. list.Sort((a, b) => { var entityA = server.d_Map.GetChunk(a.chunkx * Server.chunksize, a.chunky * Server.chunksize, a.chunkz * Server.chunksize).Entities[a.id]; var entityB = server.d_Map.GetChunk(b.chunkx * Server.chunksize, b.chunky * Server.chunksize, b.chunkz * Server.chunksize).Entities[b.id]; Vector3i posA = new Vector3i((int)entityA.position.x, (int)entityA.position.y, (int)entityA.position.z); Vector3i posB = new Vector3i((int)entityB.position.x, (int)entityB.position.y, (int)entityB.position.z); Vector3i posPlayer = new Vector3i(c.PositionMul32GlX / 32, c.PositionMul32GlY / 32, c.PositionMul32GlZ / 32); return(server.DistanceSquared(posA, posPlayer).CompareTo(server.DistanceSquared(posB, posPlayer))); } ); int retCount = maxCount; if (list.Count < maxCount) { retCount = list.Count; } for (int i = 0; i < retCount; i++) { ret[i] = list[i]; } }
int IndexOfNull(ServerEntityId[] list, int listCount) { for (int i = 0; i < listCount; i++) { ServerEntityId s = list[i]; if (s == null) { return i; } } return -1; }
void FindNearEntities(Server server, ClientOnServer c, int maxCount, ServerEntityId[] ret) { List<ServerEntityId> list = new List<ServerEntityId>(); int playerx = c.PositionMul32GlX / 32; int playery = c.PositionMul32GlZ / 32; int playerz = c.PositionMul32GlY / 32; // Find all entities in 3x3x3 chunks around player. for (int xx = -1; xx < 2; xx++) { for (int yy = -1; yy < 2; yy++) { for (int zz = -1; zz < 2; zz++) { int chunkx = playerx / Server.chunksize + xx; int chunky = playery / Server.chunksize + yy; int chunkz = playerz / Server.chunksize + zz; if (!MapUtil.IsValidChunkPos(server.d_Map, chunkx, chunky, chunkz, Server.chunksize)) { continue; } ServerChunk chunk = server.d_Map.GetChunk(chunkx * Server.chunksize, chunky * Server.chunksize, chunkz * Server.chunksize); if (chunk == null) { continue; } if (chunk.Entities == null) { continue; } for (int i = 0; i < chunk.EntitiesCount; i++) { if (chunk.Entities[i] == null) { continue; } if (chunk.Entities[i].position == null) { continue; } ServerEntityId id = new ServerEntityId(); id.chunkx = chunkx; id.chunky = chunky; id.chunkz = chunkz; id.id = i; list.Add(id); } } } } // Return maxCount of entities nearest to player. list.Sort((a, b) => { var entityA = server.d_Map.GetChunk(a.chunkx * Server.chunksize, a.chunky * Server.chunksize, a.chunkz * Server.chunksize).Entities[a.id]; var entityB = server.d_Map.GetChunk(b.chunkx * Server.chunksize, b.chunky * Server.chunksize, b.chunkz * Server.chunksize).Entities[b.id]; Vector3i posA = new Vector3i((int)entityA.position.x, (int)entityA.position.y, (int)entityA.position.z); Vector3i posB = new Vector3i((int)entityB.position.x, (int)entityB.position.y, (int)entityB.position.z); Vector3i posPlayer = new Vector3i(c.PositionMul32GlX / 32, c.PositionMul32GlY / 32, c.PositionMul32GlZ / 32); return server.DistanceSquared(posA, posPlayer).CompareTo(server.DistanceSquared(posB, posPlayer)); } ); int retCount = maxCount; if (list.Count < maxCount) { retCount = list.Count; } for (int i = 0; i < retCount; i++) { ret[i] = list[i]; } }
void NotifyEntities(Server server, int clientid, float dt) { ClientOnServer c = server.clients[clientid]; c.notifyEntitiesAccum += dt; if (c.notifyEntitiesAccum < (one / EntityPositionUpdatesPerSecond)) { return; } c.notifyEntitiesAccum = 0; // find nearest entities int max = SpawnMaxEntities; ServerEntityId[] nearestEntities = new ServerEntityId[max]; FindNearEntities(server, c, max, nearestEntities); // update entities for (int i = 0; i < max; i++) { ServerEntityId e = nearestEntities[i]; if (e == null) { continue; } for (int k = 0; k < server.modEventHandlers.onentityupdate.Count; k++) { server.modEventHandlers.onentityupdate[k](e); } } // despawn old entities for (int i = 0; i < c.spawnedEntitiesCount; i++) { ServerEntityId e = c.spawnedEntities[i]; if (e == null) { continue; } if (!Contains(nearestEntities, max, e)) { int onClientId = i; c.spawnedEntities[onClientId] = null; server.SendPacket(clientid, ServerPackets.EntityDespawn(64 + onClientId)); } } // spawn new entities for (int i = 0; i < max; i++) { ServerEntityId e = nearestEntities[i]; if (e == null) { continue; } if (!Contains(c.spawnedEntities, max, e)) { int onClientId = IndexOfNull(c.spawnedEntities, c.spawnedEntitiesCount); c.spawnedEntities[onClientId] = e.Clone(); ServerChunk chunk = server.d_Map.GetChunk(e.chunkx * Server.chunksize, e.chunky * Server.chunksize, e.chunkz * Server.chunksize); ServerEntity ee = chunk.Entities[e.id]; Packet_ServerEntity ne = ToNetworkEntity(server.serverPlatform, ee); server.SendPacket(clientid, ServerPackets.EntitySpawn(64 + onClientId, ne)); } } for (int i = 0; i < max; i++) { if (c.updateEntity[i]) { c.updateEntity[i] = false; ServerEntityId e = c.spawnedEntities[i]; ServerChunk chunk = server.d_Map.GetChunk(e.chunkx * Server.chunksize, e.chunky * Server.chunksize, e.chunkz * Server.chunksize); ServerEntity ee = chunk.Entities[e.id]; Packet_ServerEntity ne = ToNetworkEntity(server.serverPlatform, ee); server.SendPacket(clientid, ServerPackets.EntitySpawn(64 + i, ne)); } } }