Example #1
0
 public override void PreUpdate()
 {
     if (DEntrogicDebugClient.Instance.AuthorMode && Main.netMode == NetmodeID.SinglePlayer)
     {
         // 这里是buildings文件生成的代码
         if (Main.keyState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.U) &&
             !Main.oldKeyState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.U))
         {
             if (start == null)
             {
                 start = MousePos;
                 Main.NewText("Start: " + MousePos + " T " + MousePos.ToTileCoordinates());
             }
             else
             {
                 Main.NewText("End: " + MousePos + " T " + MousePos.ToTileCoordinates());
                 Buildings.Export(start.Value, MousePos);
                 start = null;
             }
         }
         if (Main.keyState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.B) &&
             !Main.oldKeyState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.B))
         {
             using (FileStream fs = File.OpenRead(Buildings.BuildingSavePath + "1.buildings"))
                 Buildings.Build(fs, MousePos);
         }
     }
 }
Example #2
0
        public override void ModifyWorldGenTasks(List <GenPass> tasks, ref float totalWeight)
        {
            int MicroBiomesIndex = tasks.FindIndex(genpass => genpass.Name.Equals("Micro Biomes"));

            if (MicroBiomesIndex != -1)
            {
                tasks.Insert(MicroBiomesIndex + 1, new PassLegacy("Generating Card Shrine", delegate(GenerationProgress progress)
                {
                    progress.Message = Language.GetTextValue("Mods.Entrogic.GenCardShrine");
                    try
                    {
                        for (int l = 0; l < (int)((double)(MaxTilesX * MaxTilesY) * 0.00003); l++)
                        {
                            Point psw      = new Point(WorldGen.genRand.Next(50, MaxTilesX - 50), WorldGen.genRand.Next((int)((float)MaxTilesY * 0.35f), (int)((float)MaxTilesY * 0.85f)));
                            bool goodPlace = true;
                            for (int i = psw.X; i <= psw.X + 5; i++)
                            {
                                int j = psw.Y + 9;
                                if (!Main.tile[i, j].active() || !Main.tileSolid[Main.tile[i, j].type])
                                {
                                    goodPlace = false;
                                    break;
                                }
                            }
                            if (goodPlace && WorldGen.InWorld(psw.X, psw.Y) && WorldGen.InWorld(psw.X + 8, psw.Y + 16) && Main.tile[psw.X, psw.Y].active() && Main.tile[psw.X, psw.Y].type == TileID.Stone && Main.tile[psw.X + 5, psw.Y].active() && Main.tile[psw.X + 5, psw.Y].type == TileID.Stone)
                            {
                                Rectangle r = Buildings.Build($"Buildings/CardShrine{WorldGen.genRand.Next(2)}.ebuilding", psw.ToWorldCoordinates());
                                ModHelper.FindAndReplaceWall(r, (ushort)WallType <黑陨岩墙>());
                                Chest c   = ModHelper.FindAndCreateChest(r, TileType <Tiles.ExplodeGraniteChest>());
                                int index = 0;
                                c.AddItem(ModHelper.GetRandomCard(Main.LocalPlayer, WorldGen.genRand, CardRareID.GrandUnified, -1, false).type, 1, ref index);
                                Item item = ModHelper.GetRandomCard(Main.LocalPlayer, WorldGen.genRand);
                                c.AddItem(item.type, Math.Max(WorldGen.genRand.Next(item.maxStack) + 1 - 2, 1), ref index);
                                c.AddNormalChestItem(psw.Y, index);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        throw new Exception("生成世界时发生错误!请将错误发送在QQ群798484146并将 Terraria/ModLoader/Logs/client.txt 发给群主!\n" + e.Message);
                    }
                }));
                int maxX = Main.maxTilesX / 2;
                int maxY = Main.maxTilesY / 2 + 160;
                tasks.Insert(MicroBiomesIndex + 1, new PassLegacy("Generating Life Liquid", delegate(GenerationProgress progress)
                {
                    try
                    {
                        progress.Message = Language.GetTextValue("Mods.Entrogic.GenLifeLiquid");
                        int r            = 55;
                        ModWorldHelper.RoundTile(maxX, maxY, r, r, 70, 75, true, TileType <BlackMeteorite>(), 1, 0.2);
                        progress.Set(0.20f);
                        ModWorldHelper.RoundTile(maxX, maxY, r, r, 0, 24.5, true, TileType <BlackMeteorite>());
                        progress.Set(0.40f);
                        ModWorldHelper.RoundTile(maxX, maxY, r - 7, r - 7, 0, 18, true, 0, 2, 0.5, 1, 140);
                        progress.Set(0.60f);
                        int length = 15;
                        for (int j = maxY - 46; j >= maxY - 80; j--)
                        {
                            for (int i = maxX - WorldGen.genRand.Next(-1, 2) - length; i <= maxX + WorldGen.genRand.Next(-1, 2) + length; i++)
                            {
                                if (Main.tile[i, j].type == TileType <BlackMeteorite>())
                                {
                                    Main.tile[i, j].active(false);
                                }
                            }
                        }
                        progress.Set(0.80f);
                        ModWorldHelper.RoundWall(maxX, maxY, r, r, 0, 25, true, WallType <Walls.黑陨岩墙>(), 0, 1);
                        progress.Set(1.00f);

                        progress.Message = Language.GetTextValue("Mods.Entrogic.SmoothLifeLiquid");
                        ModWorldHelper.SmoothTile(maxX - 80, maxY - 80, maxX + 80, maxY + 80, progress, true);
                    }
                    catch (Exception e)
                    {
                        throw new Exception("生成世界时发生错误!请将错误发送在QQ群798484146并将 Terraria/ModLoader/Logs/client.txt 发给群主!\n" + e.Message);
                    }
                }));
            }
        }
Example #3
0
        public override void HandlePacket(BinaryReader reader, int whoAmI)
        {
            EntrogicModMessageType msgType = (EntrogicModMessageType)reader.ReadByte();

            switch (msgType)
            {
            case EntrogicModMessageType.ReceiveMagicStormRequest:     // 由服务器通告全体客户端
            {
                EntrogicWorld.magicStorm = reader.ReadBoolean();
                break;
            }

            case EntrogicModMessageType.ReceiveMagicStormMPC: // 客户端发出接受请求,服务器发送参数
                if (Main.dedServ)                             // 在服务器下
                {
                    ModPacket packet = GetPacket();
                    packet.Write((byte)EntrogicModMessageType.ReceiveMagicStormMPC);
                    packet.Write(EntrogicWorld.magicStorm);
                    // 发回给发送者
                    packet.Send(whoAmI, -1);
                    break;
                }
                else     // 客户端下接收
                {
                    EntrogicWorld.magicStorm = reader.ReadBoolean();
                    if (EntrogicWorld.magicStorm == true /*规范!*/)    // 肯定是要开始了才提示啊,不然提示什么东西哦
                    {
                        Main.NewText("魔力开始涌动...", 150, 150, 250);    // 补一个提示
                    }
                    break;
                }

            case EntrogicModMessageType.FindUWTeleporter:
            {
                if (Main.dedServ)         // 在服务器下
                {
                    int i         = reader.ReadInt32();
                    int j         = reader.ReadInt32();
                    int playernum = reader.ReadInt32();
                    UnderworldPortal.HandleTransportion(i, j, playernum, true);
                    break;
                }
                else         // 在客户端下,其实就是给玩家回复提示信息
                {
                    string warn = reader.ReadString();
                    Main.NewText(warn);
                }
                break;
            }

            case EntrogicModMessageType.NPCSpawnOnPlayerAction:
            {
                int plr  = (int)reader.ReadByte();
                int type = (int)reader.ReadInt16();
                if (!NPC.AnyNPCs(type))
                {
                    NPC.SpawnOnPlayer(plr, type);
                }
                break;
            }

            case EntrogicModMessageType.NPCSpawn:
            {
                if (Main.netMode == NetmodeID.MultiplayerClient)
                {
                    break;
                }
                int   plr           = (int)reader.ReadByte();
                int   type          = (int)reader.ReadInt16();
                bool  showSpawnText = reader.ReadBoolean();
                float posx          = reader.ReadSingle();
                float posy          = reader.ReadSingle();
                Main.PlaySound(SoundID.Roar, Main.player[plr].Center, 0);
                int npc = NPC.NewNPC((int)posx, (int)posy, type, 1);
                if (npc == 200)
                {
                    break;
                }
                Main.npc[npc].target    = plr;
                Main.npc[npc].timeLeft *= 20;
                if (npc < 200)
                {
                    NetMessage.SendData(MessageID.SyncNPC, -1, -1, null, npc);
                }
                if (showSpawnText == true)
                {
                    NetMessage.BroadcastChatMessage(NetworkText.FromKey("Announcement.HasAwoken", Main.npc[npc].GetTypeNetName()), new Color(175, 75, 255));
                }
                break;
            }

            case EntrogicModMessageType.SyncExplode:
            {
                if (Main.netMode == NetmodeID.MultiplayerClient)
                {
                    Explode(reader.ReadPackedVector2(), reader.ReadPackedVector2(), reader.ReadInt32(), reader.ReadInt32(), reader.ReadInt32(), reader.ReadBoolean());
                }
                else
                {
                    MessageHelper.SendExplode(reader.ReadPackedVector2(), reader.ReadPackedVector2(), reader.ReadInt32(), -1, whoAmI, reader.ReadInt32(), reader.ReadInt32(), reader.ReadBoolean());
                }
                break;
            }

            case EntrogicModMessageType.SyncCardGamingInfos:
            {
                int            playernumber   = reader.ReadByte();
                EntrogicPlayer entrogicPlayer = Main.player[playernumber].GetModPlayer <EntrogicPlayer>();
                // 如何传输List?首先传输一个List.Count,然后遍历传输List数值,接收者根据List.Count逐个接收,最后List.Add发给第三方
                //entrogicPlayer.IsBookActive = reader.ReadBoolean();
                //// Unlike SyncPlayer, here we have to relay/forward these changes to all other connected clients
                //if (Main.netMode == NetmodeID.Server)
                //{
                //    var packet = GetPacket();
                //    packet.Write((byte)EntrogicModMessageType.SyncBookBubbleInfo);
                //    packet.Write((byte)playernumber);
                //    packet.Write(entrogicPlayer.IsBookActive);
                //    packet.Send(-1, playernumber);
                //}
                break;
            }

            case EntrogicModMessageType.SyncBookBubbleInfo:
            {
                int            playernumber   = reader.ReadByte();
                EntrogicPlayer entrogicPlayer = Main.player[playernumber].GetModPlayer <EntrogicPlayer>();
                entrogicPlayer.PageNum      = reader.ReadByte();
                entrogicPlayer.IsBookActive = reader.ReadBoolean();
                // Unlike SyncPlayer, here we have to relay/forward these changes to all other connected clients
                if (Main.netMode == NetmodeID.Server)
                {
                    MessageHelper.SendBookInfo(playernumber, entrogicPlayer.PageNum, entrogicPlayer.IsBookActive, -1, playernumber);
                }
                break;
            }

            case EntrogicModMessageType.SendCompletedCardMerchantMissionRequest:
            {
                byte playernumber = reader.ReadByte();
                CardMerchantQuest cardMerchantQuest = Main.player[playernumber].GetModPlayer <CardMerchantQuest>();
                cardMerchantQuest.Complete = reader.ReadString();
                // Unlike SyncPlayer, here we have to relay/forward these changes to all other connected clients
                if (Main.netMode == NetmodeID.Server)
                {
                    MessageHelper.SendCardMission(playernumber, cardMerchantQuest.Complete, -1, playernumber);
                }
                break;
            }

            case EntrogicModMessageType.BuildBuilding:
            {
                string  name   = reader.ReadString();
                Vector2 pos    = reader.ReadPackedVector2();
                bool    useAir = reader.ReadBoolean();
                Buildings.Build(name, pos, useAir);
                break;
            }

            default:
                Logger.WarnFormat("Entrogic: Unknown Message type: {0}", msgType);
                break;
            }
        }