-
Notifications
You must be signed in to change notification settings - Fork 1
/
Config.cs
206 lines (201 loc) · 7.43 KB
/
Config.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using TShockAPI;
using JsonTool;
using System.IO;
using MySqlX.XDevAPI.Common;
namespace RegionSpawn
{
public class Setting
{
public static bool CanFindPlayerInRegion(string name)
{
foreach(var region in GetConfig().SpawnRegions)
{
var plr = region.Players.Find(plr=>plr.TSPlayer.Name == name);
if(plr != null)
return true;
}
return false;
}
public static RPlayer GetPlayer(string name)
{
foreach (var region in GetConfig().SpawnRegions)
{
var plr = region.Players.Find(plr => plr.TSPlayer.Name == name);
if (plr != null)
return plr;
}
return null;
}
public static SpawnRegion FindRegionByPlayer(string name)
{
foreach (var region in GetConfig().SpawnRegions)
{
var plr = region.Players.Find(plr => plr.TSPlayer.Name == name);
if (plr != null)
return region;
}
return null;
}
public List<SpawnRegion> SpawnRegions { get; set; }
public static JsonRw<Setting> Config;
public static Setting GetConfig()
{
return Config.ConfigObj;
}
public static readonly string ConfigPath = Path.Combine(AppContext.BaseDirectory, "Conifg.json");
public static void InitConfig()
{
var setting = new Setting();
var json = new JsonRw<Setting>(ConfigPath, setting);
json.OnError += OnError;
json.OnCreating += OnCreating;
json.ConfigObj.SpawnRegions.ForEach(region =>
{
region.Restore();
});
}
static void OnError(object sender, ErrorEventArgs e)
{
TShock.Log.ConsoleError("RegionSpawn插件错误配置读取错误:" + e.ToString());
}
static void OnCreating(object sender, CreatingEvent e)
{
TShock.Log.ConsoleError("正在创建RigionSpawn插件配置文件...");
}
}
public class RPlayer
{
public TSPlayer TSPlayer { get; set; }
public int Kills = 0;
public int Deaths = 0;
}
public class Npc
{
[JsonProperty("生物ID")]
public int ID = 0;
//[JsonProperty("血量")]
//public int Health = 0;
[JsonProperty("数量")]
public int Count = 0;
}
public class Round
{
[JsonProperty("生成点X")]
public float X;
[JsonProperty("生成点Y")]
public float Y;
[JsonProperty("生成范围")]
public int Size;
[JsonProperty("生成速率")]
public int Rate;
[JsonProperty("怪物列表")]
public List<Npc> Npcs;
[JsonProperty("时间")]
public int Time = 0;
[JsonIgnore]
public int SecondCounter = 10;//倒计时
}
public class SpawnRegion
{
public bool IsInside(float x, float y)
{
return x >= RegionLeftX && x <= RegionRightX && y >= RegionLeftY && y <= RegionRightY;
}
public void Restore()
{
Start = false;
PreStart = false;
SecondCounter = StartSeconds;
Players = new List<RPlayer>();
CurrentRoundIndex = 0;
Rounds.ForEach(round =>
{
round.SecondCounter = round.Time;
});
//CurrentMobIndex = 0;
}
public void SpawnMob()
{
var currentround = Rounds[CurrentRoundIndex];
float currentx = (int)currentround.X << 4;//求出相对X点位置
float currenty = (int)currentround.Y << 4;//求出相对Y点位置
float distance = -1f;//距离
foreach (var plr in Players)
{
if (plr.TSPlayer.Active && !plr.TSPlayer.Dead)
{
float currentdistance = Math.Abs(plr.TSPlayer.TPlayer.position.X + (float)(plr.TSPlayer.TPlayer.width / 2) - (currentx + (float)(5 / 2))) + Math.Abs(plr.TSPlayer.TPlayer.position.Y + (float)(plr.TSPlayer.TPlayer.height / 2) - (currenty + (float)(5 / 2)));
if (distance == -1f || currentdistance < distance)
{
distance = currentdistance;
float x;
float y;
double angle;//角度
x = currentx - plr.TSPlayer.TPlayer.position.X;//求出生成点相对于玩家的位置
y = currenty - plr.TSPlayer.TPlayer.position.Y;//求出生成点相对于玩家的位置
if (!(x == 0 && y == 0))
if (Math.Abs(x) > (100 << 4) || Math.Abs(y) > (50 << 4))
{
angle = Math.Atan2(y, x) * 180 / Math.PI;//求出角度
x = (float)((100 << 4) * Math.Cos(angle * Math.PI / 180));//转为弧度
y = (float)((100 << 4) * Math.Sin(angle * Math.PI / 180));
currentx = x + plr.TSPlayer.TPlayer.position.X;
currenty = y + plr.TSPlayer.TPlayer.position.Y;
}
}
}
}
Random random = new Random();
var npc = currentround.Npcs[random.Next(currentround.Npcs.Count)];
currentx = currentx / 16;
currenty = currenty / 16;
var tsnpc = TShock.Utils.GetNPCById(npc.ID);
TSPlayer.Server.SpawnNPC(tsnpc.type, tsnpc.FullName, npc.Count, (int)currentx, (int)currenty, currentround.Size, currentround.Size);
}
[JsonIgnore]
public List<RPlayer> Players;
[JsonIgnore]
public bool Start = false;//副本是否开启
[JsonIgnore]
public bool PreStart = false;//预开启倒计时
[JsonIgnore]
public int SecondCounter = 10;//倒计时
[JsonIgnore]
public int CurrentRoundIndex = 0;//当前round
//[JsonIgnore]
//public int CurrentMobIndex = 0;//当前Mob参数
[JsonProperty("人数到后启动时间")]
public int StartSeconds = 10;
[JsonProperty("名称")]
public string Name = "";
[JsonProperty("权限")]
public string Permission = "";
[JsonProperty("出生点X")]
public float SpawnX = 0;
[JsonProperty("出生点Y")]
public float SpawnY = 0;
[JsonProperty("左上X")]
public float RegionLeftX = 0;
[JsonProperty("左下Y")]
public float RegionLeftY = 0;
[JsonProperty("右下X")]
public float RegionRightX = 0;
[JsonProperty("右下Y")]
public float RegionRightY = 0;
[JsonProperty("最小开启人数")]
public int MinStartPlayer = 2;
[JsonProperty("重生时间")]
public int RespawnTime = 5;
[JsonProperty("完成后执行")]
public List<string> Commands = new List<string>();
[JsonProperty("死亡可复活")]
public bool Respawn = true;
[JsonProperty("进度限制")]
public int Progress = 0;
[JsonProperty("波次")]
public List<Round> Rounds = new List<Round>();
}
}