diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json
index 2e743c6..5aad7a7 100755
--- a/DataCollection/gamedata.json
+++ b/DataCollection/gamedata.json
@@ -79,6 +79,10 @@
"awarded_you":"Mod Revenge taken upon %USERNAME%! $50 earned."
},
"events":{
+ "mods_revenge":{
+ "event_start":"MODS' REVENGE: Mods' revenge has begun! For the next 10 minutes, any mod that hits you with a Splatterball will earn you $500. Go find Mods and make yourself a target! Only one payout per Mod.",
+ "event_end":"MODS REVENGE: Mods Revenge is now over. All Splatterballs removed."
+ },
"water_balloon_game":{
"event_start":"WATER BALLOON FIGHT: You have just been given 8 Water Balloons. Whoever gets hit the MOST in 5 minutes (60 game minutes) will win a prize (hits on yourself are not counted).",
"event_won":"You are a Water Balloon winner! Prize: $20,000",
@@ -89,6 +93,8 @@
"event_start":"ISLE CARD TRADING GAME: You have just been given FOUR Isle Trading Cards. They are identical. To win at this game, you will need exactly one of each stallion, mare, colt and filly card in 5 minutes (60 game minutes).",
"event_disqualified":"ISLE CARDS TIME IS UP: You are disqualified for having over 4 cards!",
"event_one_type":"ISLE CARDS TIME IS UP: You only have one type of card. Removing cards.",
+ "event_two_type":"ISLE CARDS TIME IS UP: You only have two types of cards. Removing cards.",
+ "event_three_type":"ISLE CARDS TIME IS UP: You have three types of cards! Better luck next time. Removing cards.",
"event_no_cards":"ISLE CARDS TIME IS UP: You don't have any isle cards!",
"event_win":"ISLE CARDS TIME IS UP: You have all four cards! Great work! Prize=$25,000"
},
diff --git a/Horse Isle Server/HorseIsleServer/Game/Events/IsleCardTradingGame.cs b/Horse Isle Server/HorseIsleServer/Game/Events/IsleCardTradingGame.cs
index ccdc742..6183131 100644
--- a/Horse Isle Server/HorseIsleServer/Game/Events/IsleCardTradingGame.cs
+++ b/Horse Isle Server/HorseIsleServer/Game/Events/IsleCardTradingGame.cs
@@ -51,32 +51,47 @@ namespace HISP.Game.Events
if(client.LoggedIn)
{
int totalCards = 0;
+ int totalTypes = 0;
foreach (int itemId in Item.TradingCards)
if (client.LoggedinUser.Inventory.HasItemId(itemId))
totalCards += client.LoggedinUser.Inventory.GetItemByItemId(itemId).ItemInstances.Count;
- bool win = (client.LoggedinUser.Inventory.HasItemId(Item.ColtTradingCard) &&
- client.LoggedinUser.Inventory.HasItemId(Item.FillyTradingCard) &&
- client.LoggedinUser.Inventory.HasItemId(Item.MareTradingCard) &&
- client.LoggedinUser.Inventory.HasItemId(Item.StallionTradingCard));
+ if (client.LoggedinUser.Inventory.HasItemId(Item.ColtTradingCard))
+ totalTypes++;
+ if (client.LoggedinUser.Inventory.HasItemId(Item.FillyTradingCard))
+ totalTypes++;
+ if (client.LoggedinUser.Inventory.HasItemId(Item.MareTradingCard))
+ totalTypes++;
+ if (client.LoggedinUser.Inventory.HasItemId(Item.StallionTradingCard))
+ totalTypes++;
if(totalCards > 4)
{
byte[] disqualifiedTooManyCards = PacketBuilder.CreateChat(Messages.EventDisqualifiedIsleTradingGame, PacketBuilder.CHAT_BOTTOM_RIGHT);
client.SendPacket(disqualifiedTooManyCards);
}
- else if(!win && totalCards <= 0)
+ else if(totalTypes == 0)
{
byte[] noCardsMessage = PacketBuilder.CreateChat(Messages.EventNoneIsleTradingGame, PacketBuilder.CHAT_BOTTOM_RIGHT);
client.SendPacket(noCardsMessage);
}
- else if(!win && totalCards >= 1)
+ else if(totalTypes == 1)
{
byte[] onlyOneTypeOfCardMesage = PacketBuilder.CreateChat(Messages.EventOnlyOneTypeIsleTradingGame, PacketBuilder.CHAT_BOTTOM_RIGHT);
client.SendPacket(onlyOneTypeOfCardMesage);
}
- else if (win && totalCards >= 4) // it should be impossible to have this if you dont have one of each,
+ else if (totalTypes == 2)
+ {
+ byte[] onlyTwoTypeOfCardMesage = PacketBuilder.CreateChat(Messages.EventOnlyTwoTypeIsleTradingGame, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ client.SendPacket(onlyTwoTypeOfCardMesage);
+ }
+ else if (totalTypes == 3)
+ {
+ byte[] onlyThreeTypeOfCardMesage = PacketBuilder.CreateChat(Messages.EventOnlyThreeTypeIsleTradingGame, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ client.SendPacket(onlyThreeTypeOfCardMesage);
+ }
+ else if (totalTypes == 4)
{
client.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.IsleCardsGameWin).Count++;
diff --git a/Horse Isle Server/HorseIsleServer/Game/Events/ModsRevenge.cs b/Horse Isle Server/HorseIsleServer/Game/Events/ModsRevenge.cs
new file mode 100644
index 0000000..7493bfe
--- /dev/null
+++ b/Horse Isle Server/HorseIsleServer/Game/Events/ModsRevenge.cs
@@ -0,0 +1,144 @@
+using HISP.Game.Items;
+using HISP.Player;
+using HISP.Server;
+using System.Collections.Generic;
+using System.Threading;
+
+namespace HISP.Game.Events
+{
+ public class ModsRevenge
+ {
+ public class ThrowTracker
+ {
+ public ThrowTracker(User thrower)
+ {
+ Thrower = thrower;
+ ThrownAt = new List();
+ }
+ public User Thrower;
+ public List ThrownAt;
+ }
+
+ public bool Active = false;
+ public const int REVENGE_TIMEOUT = 10;
+ private List trackedThrows;
+ private Timer revengeTimeout;
+ public ThrowTracker[] TrackedThrows
+ {
+ get
+ {
+ return trackedThrows.ToArray();
+ }
+ }
+
+ public ModsRevenge()
+ {
+ trackedThrows = new List();
+ Active = false;
+ }
+
+ public void StartEvent()
+ {
+ revengeTimeout = new Timer(new TimerCallback(revengeTimedOut), null, REVENGE_TIMEOUT * 60 * 1000, REVENGE_TIMEOUT * 60 * 1000);
+
+ int TOTAL_SPLATTERBALLS = 8; // I dont know the actural amount t-t
+
+ // Give Splatterballs
+ int[] allUsers = Database.GetUsers();
+ foreach (int userid in allUsers)
+ {
+ for (int i = 0; i < TOTAL_SPLATTERBALLS; i++)
+ {
+ ItemInstance itm = new ItemInstance(Item.ModSplatterball);
+
+ if (GameServer.IsUserOnline(userid))
+ GameServer.GetUserById(userid).Inventory.AddWithoutDatabase(itm);
+
+ Database.AddItemToInventory(userid, itm);
+ }
+ }
+
+ byte[] annoucePacket = PacketBuilder.CreateChat(Messages.EventStartModsRevenge, PacketBuilder.CHAT_BOTTOM_RIGHT);
+
+ foreach (GameClient client in GameServer.ConnectedClients)
+ if (client.LoggedIn)
+ client.SendPacket(annoucePacket);
+ }
+
+ public void EndEvent()
+ {
+ GameServer.RemoveAllItemsOfIdInTheGame(Item.ModSplatterball);
+
+ byte[] annoucePacket = PacketBuilder.CreateChat(Messages.EventEndModsRevenge, PacketBuilder.CHAT_BOTTOM_RIGHT);
+
+ foreach (GameClient client in GameServer.ConnectedClients)
+ if (client.LoggedIn)
+ client.SendPacket(annoucePacket);
+ }
+ private void revengeTimedOut(object state)
+ {
+ resetEvent();
+ }
+
+ private void resetEvent()
+ {
+ revengeTimeout.Dispose();
+ trackedThrows.Clear();
+ Active = false;
+ }
+ private ThrowTracker getUserThrowTracker(User thrower)
+ {
+ foreach (ThrowTracker throwTracker in TrackedThrows)
+ {
+ if (throwTracker.Thrower.Id == thrower.Id)
+ return throwTracker;
+ }
+
+ return new ThrowTracker(thrower);
+ }
+
+ private bool checkUserThrownAtAlready(ThrowTracker tracker, User thrownAt)
+ {
+ foreach (User user in tracker.ThrownAt)
+ {
+ if (user.Id == thrownAt.Id)
+ return true;
+ }
+
+ return false;
+
+ }
+
+
+ public void LeaveEvent(User userToLeave)
+ {
+ foreach (ThrowTracker thrownMemory in TrackedThrows)
+ {
+ if (thrownMemory.Thrower.Id == userToLeave.Id)
+ trackedThrows.Remove(thrownMemory);
+ }
+ }
+
+
+ public void Payout(User thrower, User throwAt)
+ {
+ ThrowTracker throwCounter = getUserThrowTracker(thrower);
+ if(checkUserThrownAtAlready(throwCounter, throwAt))
+ {
+
+ byte[] otherEarned = PacketBuilder.CreateChat(Messages.FormatModSplatterBallAwardedOther(thrower.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ byte[] youEarned = PacketBuilder.CreateChat(Messages.FormatModSplatterBallAwardedYou(throwAt.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
+
+ thrower.Money += 50;
+ throwAt.Money += 500;
+
+ thrower.LoggedinClient.SendPacket(youEarned);
+ throwAt.LoggedinClient.SendPacket(otherEarned);
+
+ throwCounter.ThrownAt.Add(throwAt);
+ }
+ }
+
+
+ }
+}
diff --git a/Horse Isle Server/HorseIsleServer/Game/Messages.cs b/Horse Isle Server/HorseIsleServer/Game/Messages.cs
index c0cd5bc..f4fe531 100755
--- a/Horse Isle Server/HorseIsleServer/Game/Messages.cs
+++ b/Horse Isle Server/HorseIsleServer/Game/Messages.cs
@@ -69,10 +69,16 @@ namespace HISP.Game
public static string SocialTypeFormat;
public static string SocialPlayerNoLongerNearby;
+ // Events : Mods Revenge
+ public static string EventStartModsRevenge;
+ public static string EventEndModsRevenge;
+
// Events : Isle Cards Trading Game
public static string EventStartIsleTradingGame;
public static string EventDisqualifiedIsleTradingGame;
public static string EventOnlyOneTypeIsleTradingGame;
+ public static string EventOnlyTwoTypeIsleTradingGame;
+ public static string EventOnlyThreeTypeIsleTradingGame;
public static string EventNoneIsleTradingGame;
public static string EventWonIsleTradingGame;
diff --git a/Horse Isle Server/HorseIsleServer/Server/Database.cs b/Horse Isle Server/HorseIsleServer/Server/Database.cs
index 5aaf91a..f67862e 100755
--- a/Horse Isle Server/HorseIsleServer/Server/Database.cs
+++ b/Horse Isle Server/HorseIsleServer/Server/Database.cs
@@ -4042,6 +4042,25 @@ namespace HISP.Server
return instances;
}
}
+ public static int[] GetModsAndAdmins()
+ {
+ List userList = new List();
+ using (MySqlConnection db = new MySqlConnection(ConnectionString))
+ {
+ db.Open();
+ MySqlCommand sqlCommand = db.CreateCommand();
+
+ sqlCommand.CommandText = "SELECT id FROM Users WHERE Moderator=\"YES\" AND Admin=\"YES\"";
+ MySqlDataReader reader = sqlCommand.ExecuteReader();
+ while (reader.Read())
+ {
+ userList.Add(reader.GetInt32(0));
+ }
+ sqlCommand.Dispose();
+ }
+ return userList.ToArray();
+ }
+
public static int[] GetUsers()
{
List userList = new List();
diff --git a/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs b/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs
index 1f0e422..008cd00 100755
--- a/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs
+++ b/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs
@@ -964,10 +964,16 @@ namespace HISP.Server
// Message Queue
Messages.MessageQueueHeader = gameData.messages.message_queue;
+ // Events : Mods Revenge
+ Messages.EventStartModsRevenge = gameData.messages.events.mods_revenge.event_start;
+ Messages.EventEndModsRevenge = gameData.messages.events.mods_revenge.event_end;
+
// Events : Isle Trading Game
Messages.EventStartIsleTradingGame = gameData.messages.events.isle_card_trading_game.event_start;
Messages.EventDisqualifiedIsleTradingGame = gameData.messages.events.isle_card_trading_game.event_disqualified;
Messages.EventOnlyOneTypeIsleTradingGame = gameData.messages.events.isle_card_trading_game.event_one_type;
+ Messages.EventOnlyTwoTypeIsleTradingGame = gameData.messages.events.isle_card_trading_game.event_two_type;
+ Messages.EventOnlyThreeTypeIsleTradingGame = gameData.messages.events.isle_card_trading_game.event_three_type;
Messages.EventNoneIsleTradingGame = gameData.messages.events.isle_card_trading_game.event_no_cards;
Messages.EventWonIsleTradingGame = gameData.messages.events.isle_card_trading_game.event_win;
diff --git a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs
index 0019de3..9dbe4ae 100755
--- a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs
+++ b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs
@@ -44,6 +44,7 @@ namespace HISP.Server
public static RealTimeQuiz QuizEvent = null;
public static WaterBalloonGame WaterBalloonEvent = new WaterBalloonGame();
public static IsleCardTradingGame IsleCardTrading;
+ public static ModsRevenge ModsRevengeEvent = new ModsRevenge();
/*
* Private stuff
@@ -134,6 +135,11 @@ namespace HISP.Server
}
}
}
+ // Mods Revenge
+ if(totalMinutesElapsed % (((60*8)+5)+10) == 0)
+ {
+ ModsRevengeEvent.StartEvent();
+ }
// Isle Card Trading Game
if(totalMinutesElapsed % ((60 + 50)+5) == 0)
{
@@ -152,7 +158,7 @@ namespace HISP.Server
TackShopGiveawayEvent.StartEvent();
}
// Real Time Riddle
- if(totalMinutesElapsed % (30+5) == 0)
+ if(totalMinutesElapsed % (30) == 0)
{
RiddleEvent = RealTimeRiddle.GetRandomRiddle();
RiddleEvent.StartEvent();
@@ -5957,7 +5963,7 @@ namespace HISP.Server
}
ItemInstance curItem = sender.LoggedinUser.Inventory.GetItemByItemId(itemId).ItemInstances[0];
- User[] userAt = GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y, false, true);
+ User[] userAt = GetReallyNearbyUsers(sender.LoggedinUser.X, sender.LoggedinUser.Y);
while (true)
{
@@ -5983,14 +5989,7 @@ namespace HISP.Server
}
if(itemId == Item.ModSplatterball)
{
- byte[] otherEarned = PacketBuilder.CreateChat(Messages.FormatModSplatterBallAwardedOther(sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
- byte[] youEarned = PacketBuilder.CreateChat(Messages.FormatModSplatterBallAwardedYou(userAt[userIndx].Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
-
- sender.LoggedinUser.Money += 50;
- userAt[userIndx].Money += 500;
-
- sender.SendPacket(youEarned);
- userAt[userIndx].LoggedinClient.SendPacket(otherEarned);
+ ModsRevengeEvent.Payout(sender.LoggedinUser, userAt[userIndx]);
}
byte[] thrownForYou = PacketBuilder.CreateChat(Messages.FormatThrownItemMessage(throwableItem.ThrowMessage, userAt[userIndx].Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
@@ -7052,6 +7051,8 @@ namespace HISP.Server
if (QuizEvent != null)
QuizEvent.LeaveEvent(sender.LoggedinUser);
+ ModsRevengeEvent.LeaveEvent(sender.LoggedinUser);
+
// Delete Arena Entries
if (Arena.UserHasEnteredHorseInAnyArena(sender.LoggedinUser))
{
@@ -7195,6 +7196,25 @@ namespace HISP.Server
throw new KeyNotFoundException("User not found (not online?)");
}
+
+ public static User[] GetReallyNearbyUsers(int x, int y)
+ {
+ int startX = x - 3;
+ int endX = x + 3;
+ int startY = y - 3;
+ int endY = y + 3;
+ List usersNearby = new List();
+
+ foreach (GameClient client in ConnectedClients)
+ if (client.LoggedIn)
+ {
+ if (startX <= client.LoggedinUser.X && endX >= client.LoggedinUser.X && startY <= client.LoggedinUser.Y && endY >= client.LoggedinUser.Y)
+ usersNearby.Add(client.LoggedinUser);
+ }
+
+ return usersNearby.ToArray();
+ }
+
public static User[] GetNearbyUsers(int x, int y, bool includeStealth=false, bool includeMuted=false)
{
int startX = x - 15;