-
Notifications
You must be signed in to change notification settings - Fork 1
/
TwitchBoss.cs
170 lines (156 loc) · 6.65 KB
/
TwitchBoss.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
using Microsoft.Xna.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using Terraria;
using Terraria.ID;
using Terraria.Utilities;
using TwitchChat.Events;
using TwitchChat.IRCClient;
namespace TwitchChat
{
public static class TwitchBoss
{
public static string Boss { get; set; }
public static Dictionary<string, Action<ChannelMessageEventArgs>> Commands { get; } = new Dictionary<string, Action<ChannelMessageEventArgs>>();
public static DateTimeOffset Cooldown = DateTimeOffset.Now;
private static TwitchBossEvent BossEvent { get; } = new TwitchBossEvent();
public static int CooldownLength { get; set; } = 60;
/// <summary>
/// Adds new command to boss
/// </summary>
/// <param name="commandName">Command alias</param>
/// <param name="action">Action what performed once command entered</param>
/// <returns>Return true if command was added or false if this command all ready exist</returns>
public static bool AddCommand(string commandName, Action<ChannelMessageEventArgs> action)
{
if (CommandExist(commandName.ToLower()) || action == null)
return false;
Commands.Add(commandName.ToLower(), action);
return true;
}
/// <summary>
/// Remove a command from pool
/// </summary>
/// <param name="commandName">Command alias</param>
public static void RemoveCommand(string commandName)
{
if (Commands.ContainsKey(commandName))
Commands.Remove(commandName);
}
/// <summary>
/// Clear commands pool
/// </summary>
public static void ClearPool()
{
Commands.Clear();
BossEvent.End();
}
public static bool CommandExist(string commandName) => Commands.ContainsKey(commandName);
internal static bool ProcessCommand(ChannelMessageEventArgs m)
{
var cmd = (from x in Commands where m.Message.ToLower().StartsWith(x.Key) select x.Value).ToArray();//Make it ToArray() to calm down ReSharper
if (!cmd.Any())
return false;
cmd.First().Invoke(m);
Cooldown = DateTimeOffset.Now.AddSeconds(CooldownLength);
return true;
}
public static void SelectNew()
{
Boss = string.Empty;
#if DEBUG
Cooldown = DateTimeOffset.Now.AddSeconds(5);
#else
Cooldown = DateTimeOffset.Now.AddSeconds(CooldownLength);
#endif
BossEvent.Start();
}
public static void ShatterBoss()
{
if (!BossEvent.Started && BossEvent.ChanceAction.Invoke())
SelectNew();
else if(BossEvent.Started && BossEvent.Part.Any() && Cooldown < DateTimeOffset.Now)
BossEvent.End();
}
private static readonly UnifiedRandom Rand = new UnifiedRandom();
internal static void InitialiseDefault()
{
//AddCommand("test", (m) =>
//{
// if (Main.netMode == NetmodeID.Server)
// for (int i = 0; i < Main.maxPlayers; i++)
// {
// Main.player[i].GetModPlayer<EventPlayer>().Teleportationpotion = true;
// }
// else if (Main.netMode == NetmodeID.SinglePlayer)
// Main.LocalPlayer.GetModPlayer<EventPlayer>().Teleportationpotion = true;
//});
AddCommand("heal", (m) =>
{
if (Main.netMode != NetmodeID.SinglePlayer)
foreach (Player it in Main.player)
{
if (it.active)
for (var i = Rand.Next(20); i > 0; i--)
{
Item.NewItem(it.position, ItemID.Heart, noGrabDelay: true);
Item.NewItem(it.position, ItemID.Star, noGrabDelay: true);
}
}
else
for (var i = Rand.Next(20); i > 0; i--)
{
Item.NewItem(Main.LocalPlayer.position, ItemID.Heart, noGrabDelay: true);
Item.NewItem(Main.LocalPlayer.position, ItemID.Star, noGrabDelay: true);
}
});
AddCommand("buff", (m) =>
{
if (Main.netMode != NetmodeID.SinglePlayer)
{
foreach (Player it in Main.player)
if (it.active)
{
for (var i = Rand.Next(3); i > 0; i--)
Item.NewItem(it.position, ItemID.NebulaPickup1, noGrabDelay: true);
for (var i = Rand.Next(3); i > 0; i--)
Item.NewItem(it.position, ItemID.NebulaPickup2, noGrabDelay: true);
for (var i = Rand.Next(3); i > 0; i--)
Item.NewItem(it.position, ItemID.NebulaPickup3, noGrabDelay: true);
}
}
else
{
for (var i = Rand.Next(3); i > 0; i--)
Item.NewItem(Main.LocalPlayer.position, ItemID.NebulaPickup1, noGrabDelay: true);
for (var i = Rand.Next(3); i > 0; i--)
Item.NewItem(Main.LocalPlayer.position, ItemID.NebulaPickup2, noGrabDelay: true);
for (var i = Rand.Next(3); i > 0; i--)
Item.NewItem(Main.LocalPlayer.position, ItemID.NebulaPickup3, noGrabDelay: true);
}
});
AddCommand("death", (m) =>
{
if (Main.netMode != NetmodeID.SinglePlayer)
foreach (Player it in Main.player)
{
if (!it.active)
continue;
for (var i = Rand.Next(3); i > 0; i--)
Projectile.NewProjectile(it.position, new Vector2(0, 3), ProjectileID.EyeFire,
20, 0);
}
else
for (var i = Rand.Next(3); i > 0; i--)
Projectile.NewProjectile(Main.LocalPlayer.position, new Vector2(0, 3),
ProjectileID.EyeFire, 20, 0);
});
AddCommand("quit", (m) =>
{
TwitchChat.Send($"@{m.Badge.DisplayName} become a pussy and no more chat boss!");
Boss = "";
});
}
}
}