├── .gitignore ├── Logic ├── Classes │ ├── LogicAvatar.py │ ├── LogicDataTables.py │ ├── LogicServerCommand.py │ ├── LogicCondition.py │ ├── LogicRankRewardConfig.py │ ├── LogicPlayerRewardData.py │ ├── LogicCommand.py │ ├── LogicGemOffer.py │ ├── LogicOfferBundle.py │ ├── LogicRewardConfig.py │ ├── LogicPlayerMap.py │ ├── LogicClientHome.py │ ├── LogicClientAvatar.py │ ├── LogicConfData.py │ └── LogicDailyData.py ├── Client │ ├── DevicesManager.py │ ├── ClientsManager.py │ └── PlayerManager.py ├── Helpers │ ├── GlobalID.py │ ├── ChronosTextEntry.py │ ├── ChronosFileEntry.py │ ├── ForcedDrops.py │ └── PlayerDisplayData.py ├── Utility │ └── Utils.py ├── Notifications │ ├── FreeTextNotification.py │ ├── SkinRewardNotification.py │ ├── VanityItemRewardNotification.py │ ├── BaseNotification.py │ ├── BandNotification.py │ ├── TicketCompensationNotification.py │ ├── BoxRewardNotification.py │ ├── ProLeagueSeasonEndNotification.py │ ├── RankedSeasonEndNotification.py │ ├── RankedMidSeasonRewardNotification.py │ ├── ChallengeRewardNotification.py │ ├── PromoPopupNotification.py │ ├── StarPointsNotification.py │ └── NotificationFactory.py ├── Entry │ └── ScoreEntry.py ├── Files │ ├── Classes │ │ ├── Pins.py │ │ ├── Locations.py │ │ ├── PlayerThumbnails.py │ │ ├── Characters.py │ │ ├── Cards.py │ │ └── Skins.py │ └── assets │ │ └── csv_logic │ │ ├── player_thumbnails.csv │ │ ├── game_mode_variations.csv │ │ └── locations.csv ├── Settings │ ├── PrintHandler.py │ └── Configuration.py └── Data │ ├── PacketsHandler.py │ └── DataManager.py ├── README.md ├── Messaging ├── Packets │ ├── Server │ │ ├── Socket │ │ │ └── KeepAliveServerMessage.py │ │ ├── Alliance │ │ │ └── MyAllianceMessage.py │ │ ├── Home │ │ │ ├── LobbyInfoMessage.py │ │ │ ├── OwnHomeDataMessage.py │ │ │ └── PlayerProfileMessage.py │ │ ├── Authentication │ │ │ ├── LoginFailedMessage.py │ │ │ └── LoginOkMessage.py │ │ └── Battle │ │ │ └── BattleEndMessage.py │ └── Client │ │ ├── Devices │ │ └── AnalyticEventMessage.py │ │ ├── Socket │ │ └── KeepAliveMessage.py │ │ ├── Home │ │ ├── GoHomeFromOfflinePractiseMessage.py │ │ ├── GetPlayerProfileMessage.py │ │ ├── ChangeAvatarNameMessage.py │ │ └── AskForBattleEndMessage.py │ │ ├── Game │ │ └── EndClientTurnMessage.py │ │ └── Authentication │ │ └── LoginMessage.py ├── Commands │ ├── Client │ │ ├── LogicHelpOpenedCommand.py │ │ ├── LogicQuestsSeenCommand.py │ │ ├── LogicPurchaseDoubleCoinsCommand.py │ │ ├── LogicGatchaCommand.py │ │ ├── LogicClearESportsHubNotificationCommand.py │ │ ├── LogicSelectStarPowerCommand.py │ │ ├── LogicPurchaseHeroLvlUpMaterialCommand.py │ │ ├── LogicHeroSeenCommand.py │ │ ├── LogicSelectEmoteCommand.py │ │ ├── LogicClearShopTickersCommand.py │ │ ├── LogicSelectCharacterCommand.py │ │ ├── LogicSelectSkinCommand.py │ │ └── LogicEnableSkinRandomizerCommand.py │ └── Server │ │ └── LogicChangeAvatarNameCommand.py ├── LogicCommandManager.py └── LogicMessageFactory.py ├── Core.py ├── Database └── DatabaseManager.py └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea/ 2 | /player.sqlite -------------------------------------------------------------------------------- /Logic/Classes/LogicAvatar.py: -------------------------------------------------------------------------------- 1 | class LogicAvatar: 2 | pass -------------------------------------------------------------------------------- /Logic/Client/DevicesManager.py: -------------------------------------------------------------------------------- 1 | class Device: 2 | major = 0 3 | minor = 0 4 | build = 0 5 | isAndroid = True -------------------------------------------------------------------------------- /Logic/Helpers/GlobalID.py: -------------------------------------------------------------------------------- 1 | class GlobalID: 2 | def getClassID(self, globalId): 3 | return (globalId / 1000000 + (globalId >> 31)) - (globalId * 1125899907 >> 63) -------------------------------------------------------------------------------- /Logic/Classes/LogicDataTables.py: -------------------------------------------------------------------------------- 1 | from Logic.Helpers.GlobalID import GlobalID 2 | 3 | 4 | class LogicDataTables: 5 | def getDataById(self, globalId): 6 | GlobalID.getClassID(globalId) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Discord link : https://discord.gg/mt4dUxXryh 2 | 3 | ANDROID : https://www.mediafire.com/file/4lqxq2phdswikv1/com.projectbsds.v3999-rev1.apk/file 4 | 5 | IOS : https://mega.nz/file/9p9AHIhI#nzbAHRjy-eJhjlxAmbYSLVj6zvOg_OXPdgy46JI25ss 6 | -------------------------------------------------------------------------------- /Logic/Classes/LogicServerCommand.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Reader 2 | from LogicCommand import LogicCommand 3 | 4 | 5 | class LogicServerCommand: 6 | def encode(self): 7 | self.writeVint(0) 8 | LogicCommand.encode(self) 9 | 10 | -------------------------------------------------------------------------------- /Logic/Classes/LogicCondition.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Writer 2 | from Logic.Data.DataManager import Reader 3 | 4 | 5 | class LogicCondition: 6 | def decode(self: Reader): 7 | self.readVint() 8 | self.readVint() 9 | 10 | def encode(self: Writer): 11 | self.writeVint(0) 12 | self.writeVint(0) -------------------------------------------------------------------------------- /Logic/Classes/LogicRankRewardConfig.py: -------------------------------------------------------------------------------- 1 | from Logic.LogicCondition import LogicCondition 2 | from Logic.LogicGemOffer import LogicGemOffer 3 | from Logic.Data.DataManager import Writer 4 | from Logic.Data.DataManager import Reader 5 | 6 | 7 | class LogicRankRewardConfig: 8 | def decode(self: Reader): 9 | self.readVint() 10 | self.readVint() 11 | -------------------------------------------------------------------------------- /Messaging/Packets/Server/Socket/KeepAliveServerMessage.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Writer 2 | 3 | 4 | class KeepAliveServerMessage(Writer): 5 | def __init__(self, client, player): 6 | super().__init__(client) 7 | self.id = 20108 8 | self.client = client 9 | self.player = player 10 | 11 | def encode(self): 12 | pass -------------------------------------------------------------------------------- /Messaging/Packets/Server/Alliance/MyAllianceMessage.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Writer 2 | 3 | 4 | class MyAllianceMessage(Writer): 5 | def __init__(self, client, player): 6 | super().__init__(client) 7 | self.id = 24399 8 | self.client = client 9 | self.player = player 10 | 11 | def encode(self): 12 | self.writeVint(0) 13 | self.writeVint(0) -------------------------------------------------------------------------------- /Logic/Classes/LogicPlayerRewardData.py: -------------------------------------------------------------------------------- 1 | from Logic.LogicRewardConfig import LogicRewardConfig 2 | from Logic.Data.DataManager import Writer 3 | from Logic.Data.DataManager import Reader 4 | 5 | 6 | class LogicPlayerRewardData: 7 | def decode(self: Reader): 8 | if self.readBoolean() == True: 9 | LogicRewardConfig.decode(self) 10 | self.readVint() 11 | self.readBoolean() 12 | -------------------------------------------------------------------------------- /Logic/Classes/LogicCommand.py: -------------------------------------------------------------------------------- 1 | from Logic.Classes.LogicCondition import LogicCondition 2 | from Logic.Classes.LogicGemOffer import LogicGemOffer 3 | from Logic.Data.DataManager import Writer 4 | from Logic.Data.DataManager import Reader 5 | 6 | 7 | class LogicCommand: 8 | def encode(self): 9 | self.writeVint(0) 10 | self.writeVint(0) 11 | self.writeVLong(self.player.HighID, self.player.LowID) 12 | -------------------------------------------------------------------------------- /Logic/Utility/Utils.py: -------------------------------------------------------------------------------- 1 | import time 2 | import random 3 | 4 | class Utils: 5 | def GetTime(self): 6 | CurentTime = time.strftime("%H:%M:%S") 7 | return CurentTime 8 | 9 | def GetRoomID(self): 10 | id = [0, 0] 11 | id[0] = int(''.join([str(random.randint(0, 9)) for _ in range(1)])) 12 | id[1] = int(''.join([str(random.randint(0, 9)) for _ in range(8)])) 13 | return id -------------------------------------------------------------------------------- /Logic/Helpers/ChronosTextEntry.py: -------------------------------------------------------------------------------- 1 | from Logic.Classes.LogicDataTables import LogicDataTables 2 | from Logic.Data.DataManager import Writer 3 | from Logic.Data.DataManager import Reader 4 | 5 | 6 | class ChronosTextEntry: 7 | def decode(self: Reader): 8 | self.readInt() 9 | self.readString() 10 | 11 | def encode(self: Writer): 12 | self.writeInt(0) 13 | self.writeString("BSDS is catly hacc") 14 | -------------------------------------------------------------------------------- /Logic/Helpers/ChronosFileEntry.py: -------------------------------------------------------------------------------- 1 | from Logic.Classes.LogicDataTables import LogicDataTables 2 | from Logic.Data.DataManager import Writer 3 | from Logic.Data.DataManager import Reader 4 | 5 | 6 | class ChronosFileEntry: 7 | def decode(self: Reader): 8 | self.readString() 9 | self.readString() 10 | 11 | def encode(self: Writer): 12 | self.writeString("Cats are very nice") 13 | self.writeString("BSDS is catly hacc") 14 | -------------------------------------------------------------------------------- /Logic/Notifications/FreeTextNotification.py: -------------------------------------------------------------------------------- 1 | from Logic.Notifications.BaseNotification import BaseNotification 2 | from Logic.Data.DataManager import Writer 3 | from Logic.Data.DataManager import Reader 4 | 5 | 6 | class FreeTextNotification: 7 | def decode(self: Reader): 8 | BaseNotification.decode(self) 9 | self.readVint() 10 | 11 | def encode(self: Writer, info): 12 | BaseNotification.encode(self, info) 13 | self.writeVint(1) 14 | -------------------------------------------------------------------------------- /Logic/Classes/LogicGemOffer.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Writer 2 | from Logic.Data.DataManager import Reader 3 | 4 | 5 | class LogicGemOffer: 6 | def decode(self: Reader): 7 | type = self.readBytePeek(self.peek(1)) 8 | self.readVint("ItemType") 9 | self.readVint() 10 | self.readDataReference("CsvID") 11 | self.readVint() 12 | 13 | def encode(self: Writer): 14 | self.writeVint(0) 15 | self.writeVint(0) -------------------------------------------------------------------------------- /Messaging/Commands/Client/LogicHelpOpenedCommand.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from Database.DatabaseManager import DatabaseManager 4 | 5 | from Logic.Data.DataManager import Writer, Reader 6 | 7 | 8 | class LogicHelpOpenedCommand(Reader): 9 | def __init__(self, client, player, data): 10 | super().__init__(data) 11 | self.client = client 12 | self.player = player 13 | 14 | def decode(self): 15 | print() 16 | 17 | def process(self): 18 | pass -------------------------------------------------------------------------------- /Messaging/Commands/Client/LogicQuestsSeenCommand.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from Database.DatabaseManager import DatabaseManager 4 | 5 | from Logic.Data.DataManager import Writer, Reader 6 | 7 | 8 | class LogicQuestsSeenCommand(Reader): 9 | def __init__(self, client, player, data): 10 | super().__init__(data) 11 | self.client = client 12 | self.player = player 13 | 14 | def decode(self): 15 | print() 16 | 17 | def process(self): 18 | pass -------------------------------------------------------------------------------- /Messaging/Commands/Client/LogicPurchaseDoubleCoinsCommand.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from Database.DatabaseManager import DatabaseManager 4 | 5 | from Logic.Data.DataManager import Writer, Reader 6 | 7 | 8 | class LogicPurchaseDoubleCoinsCommand(Reader): 9 | def __init__(self, client, player, data): 10 | super().__init__(data) 11 | self.client = client 12 | self.player = player 13 | 14 | def decode(self): 15 | print() 16 | 17 | def process(self): 18 | pass -------------------------------------------------------------------------------- /Logic/Notifications/SkinRewardNotification.py: -------------------------------------------------------------------------------- 1 | from Logic.Notifications.BaseNotification import BaseNotification 2 | from Logic.Data.DataManager import Writer 3 | from Logic.Data.DataManager import Reader 4 | 5 | 6 | class SkinRewardNotification: 7 | def decode(self: Reader): 8 | BaseNotification.decode(self) 9 | self.readVint() 10 | 11 | def encode(self: Writer, info): 12 | BaseNotification.encode(self, info) 13 | self.writeVint(29000000 + info[1]['SkinID']) # SkinID 14 | -------------------------------------------------------------------------------- /Messaging/Commands/Client/LogicGatchaCommand.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from Database.DatabaseManager import DatabaseManager 4 | 5 | from Logic.Data.DataManager import Writer, Reader 6 | 7 | 8 | class LogicGatchaCommand(Reader): 9 | def __init__(self, client, player, data): 10 | super().__init__(data) 11 | self.client = client 12 | self.player = player 13 | 14 | def decode(self): 15 | print() 16 | print(self.readVint()) 17 | 18 | def process(self): 19 | pass -------------------------------------------------------------------------------- /Messaging/Commands/Client/LogicClearESportsHubNotificationCommand.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from Database.DatabaseManager import DatabaseManager 4 | 5 | from Logic.Data.DataManager import Writer, Reader 6 | 7 | 8 | class LogicClearESportsHubNotificationCommand(Reader): 9 | def __init__(self, client, player, data): 10 | super().__init__(data) 11 | self.client = client 12 | self.player = player 13 | 14 | def decode(self): 15 | print() 16 | 17 | def process(self): 18 | pass -------------------------------------------------------------------------------- /Messaging/Packets/Client/Devices/AnalyticEventMessage.py: -------------------------------------------------------------------------------- 1 | from Logic.Settings.PrintHandler import PrintManager 2 | 3 | from Logic.Data.DataManager import Writer 4 | from Logic.Data.DataManager import Reader 5 | 6 | 7 | class AnalyticEventMessage(Reader): 8 | def __init__(self, client, player, header_bytes): 9 | super().__init__(header_bytes) 10 | self.client = client 11 | self.player = player 12 | 13 | def decode(self): 14 | pass 15 | 16 | def process(self): 17 | pass -------------------------------------------------------------------------------- /Logic/Notifications/VanityItemRewardNotification.py: -------------------------------------------------------------------------------- 1 | from Logic.Notifications.BaseNotification import BaseNotification 2 | from Logic.Data.DataManager import Writer 3 | from Logic.Data.DataManager import Reader 4 | 5 | 6 | class VanityItemRewardNotification: 7 | def decode(self: Reader): 8 | BaseNotification.decode(self) 9 | self.readVint("Item") 10 | 11 | def encode(self: Writer, info): 12 | BaseNotification.encode(self, info) 13 | self.writeVint(52000000 + info[1]['EmoteID']) # SkinID 14 | -------------------------------------------------------------------------------- /Messaging/Commands/Client/LogicSelectStarPowerCommand.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from Database.DatabaseManager import DatabaseManager 4 | 5 | from Logic.Data.DataManager import Writer, Reader 6 | 7 | 8 | class LogicSelectStarPowerCommand(Reader): 9 | def __init__(self, client, player, data): 10 | super().__init__(data) 11 | self.client = client 12 | self.player = player 13 | 14 | def decode(self): 15 | print() 16 | print(self.readDataReferenceDouble()) 17 | 18 | def process(self): 19 | pass -------------------------------------------------------------------------------- /Messaging/Commands/Client/LogicPurchaseHeroLvlUpMaterialCommand.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from Database.DatabaseManager import DatabaseManager 4 | 5 | from Logic.Data.DataManager import Writer, Reader 6 | 7 | 8 | class LogicPurchaseHeroLvlUpMaterialCommand(Reader): 9 | def __init__(self, client, player, data): 10 | super().__init__(data) 11 | self.client = client 12 | self.player = player 13 | 14 | def decode(self): 15 | print() 16 | print(self.readVint()) 17 | 18 | def process(self): 19 | pass -------------------------------------------------------------------------------- /Logic/Notifications/BaseNotification.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Writer 2 | from Logic.Data.DataManager import Reader 3 | 4 | 5 | class BaseNotification: 6 | def decode(self: Reader): 7 | self.readInt() 8 | self.readVint() 9 | self.readInt() 10 | self.readString() 11 | 12 | def encode(self: Writer, info): 13 | self.writeInt(int(info[0])) 14 | self.writeBoolean(info[1]['ShowAtLaunch'] != True) 15 | self.writeInt(info[1]['Timer']) 16 | self.writeString(info[1]['Text']) 17 | 18 | -------------------------------------------------------------------------------- /Logic/Notifications/BandNotification.py: -------------------------------------------------------------------------------- 1 | from Logic.Helpers.PlayerDisplayData import PlayerDisplayData 2 | from Logic.Notifications.BaseNotification import BaseNotification 3 | from Logic.Data.DataManager import Writer 4 | from Logic.Data.DataManager import Reader 5 | 6 | 7 | class BandNotification: 8 | def decode(self: Reader): 9 | BaseNotification.decode(self) 10 | PlayerDisplayData.decode(self) 11 | 12 | def encode(self: Writer, info): 13 | BaseNotification.encode(self, info) 14 | PlayerDisplayData.encode(self, info) 15 | -------------------------------------------------------------------------------- /Messaging/Commands/Client/LogicHeroSeenCommand.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from Database.DatabaseManager import DatabaseManager 4 | 5 | from Logic.Data.DataManager import Writer, Reader 6 | 7 | 8 | class LogicHeroSeenCommand(Reader): 9 | def __init__(self, client, player, data): 10 | super().__init__(data) 11 | self.client = client 12 | self.player = player 13 | 14 | def decode(self): 15 | print() 16 | print(self.readDataReference()) 17 | print(self.readInt()) 18 | 19 | def process(self): 20 | pass -------------------------------------------------------------------------------- /Logic/Entry/ScoreEntry.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Writer 2 | from Logic.Data.DataManager import Reader 3 | 4 | 5 | class ScoreEntry: 6 | def decode(self: Reader): 7 | self.readVint() 8 | self.readVint() 9 | self.readVint() 10 | self.readVint() 11 | 12 | def encode(self: Writer, brawler): 13 | self.writeVint(16000000 + brawler[0]) # BrawlerID 14 | self.writeVint(brawler[1]) # Brawler Trophies 15 | self.writeVint(brawler[2]) # Trophies Lost 16 | self.writeVint(brawler[3]) # Starpoints Gained -------------------------------------------------------------------------------- /Messaging/Commands/Client/LogicSelectEmoteCommand.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from Database.DatabaseManager import DatabaseManager 4 | 5 | from Logic.Data.DataManager import Writer, Reader 6 | 7 | 8 | class LogicSelectEmoteCommand(Reader): 9 | def __init__(self, client, player, data): 10 | super().__init__(data) 11 | self.client = client 12 | self.player = player 13 | 14 | def decode(self): 15 | print() 16 | print(self.readDataReferenceDouble()) 17 | print(self.readVint()) 18 | 19 | def process(self): 20 | pass -------------------------------------------------------------------------------- /Logic/Notifications/TicketCompensationNotification.py: -------------------------------------------------------------------------------- 1 | from Logic.Notifications.BaseNotification import BaseNotification 2 | from Logic.Data.DataManager import Writer 3 | from Logic.Data.DataManager import Reader 4 | 5 | 6 | class TicketCompensationNotification: 7 | def decode(self: Reader): 8 | BaseNotification.decode(self) 9 | self.readVint() 10 | self.readVint() 11 | 12 | def encode(self: Writer, info): 13 | BaseNotification.encode(self, info) 14 | self.writeVint(info[1]['Tickets']) 15 | self.writeVint(info[1]['Gems']) 16 | -------------------------------------------------------------------------------- /Messaging/Packets/Server/Home/LobbyInfoMessage.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Writer 2 | from Logic.Client.ClientsManager import ClientsManager 3 | 4 | class LobbyInfoMessage(Writer): 5 | def __init__(self, client, player): 6 | super().__init__(client) 7 | self.id = 23457 8 | self.client = client 9 | self.player = player 10 | 11 | def encode(self): 12 | self.writeVint(ClientsManager.GetCount()) 13 | self.writeString("Project BSDS\n"f"Version: {self.player.device.major}.{self.player.device.build}.{self.player.device.minor}") 14 | self.writeVint(0) -------------------------------------------------------------------------------- /Messaging/Packets/Client/Socket/KeepAliveMessage.py: -------------------------------------------------------------------------------- 1 | from Messaging.Packets.Server.Socket.KeepAliveServerMessage import KeepAliveServerMessage 2 | 3 | 4 | from Logic.Data.DataManager import Writer 5 | from Logic.Data.DataManager import Reader 6 | 7 | 8 | class KeepAliveMessage(Reader): 9 | def __init__(self, client, player, header_bytes): 10 | super().__init__(header_bytes) 11 | self.client = client 12 | self.player = player 13 | 14 | def decode(self): 15 | pass 16 | 17 | def process(self): 18 | KeepAliveServerMessage(self.client, self.player).send(self.player.LowID) -------------------------------------------------------------------------------- /Logic/Classes/LogicOfferBundle.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Writer 2 | from Logic.Data.DataManager import Reader 3 | from LogicGemOffer import LogicGemOffer 4 | 5 | 6 | class LogicOfferBundle: 7 | def decode(self: Reader): 8 | type = self.readBytePeek(self.peek(1)) 9 | self.readVint("ItemType") 10 | self.readVint() 11 | self.readDataReference("CsvID") 12 | self.readVint() 13 | 14 | def encode(self: Writer): 15 | self.writeVint(1) 16 | print() 17 | for i in range(1): 18 | print() 19 | LogicGemOffer.encode(self) 20 | print() -------------------------------------------------------------------------------- /Logic/Client/ClientsManager.py: -------------------------------------------------------------------------------- 1 | class ClientsManager: 2 | 3 | SocketsList = {"Sockets": {}} 4 | 5 | def AddSocket(PlayerID, Sockets): 6 | ClientsManager.SocketsList["Sockets"][PlayerID] = Sockets 7 | 8 | def RemoveSocket(PlayerID): 9 | try: 10 | ClientsManager.SocketsList["Sockets"].pop(PlayerID) 11 | except KeyError: 12 | print(f"Cannot remove socket with id: {PlayerID} Reason: {PlayerID} is not in the list.") 13 | 14 | def GetAll(): 15 | return ClientsManager.SocketsList 16 | 17 | def GetCount(): 18 | return len(ClientsManager.SocketsList["Sockets"]) -------------------------------------------------------------------------------- /Messaging/Commands/Client/LogicClearShopTickersCommand.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from Database.DatabaseManager import DatabaseManager 4 | 5 | from Logic.Data.DataManager import Writer, Reader 6 | 7 | 8 | class LogicClearShopTickersCommand(Reader): 9 | def __init__(self, client, player, data): 10 | super().__init__(data) 11 | self.client = client 12 | self.player = player 13 | 14 | def decode(self): 15 | print() 16 | print(self.readVint()) 17 | print(self.readVint()) 18 | print(self.readVint()) 19 | print(self.readVint()) 20 | 21 | def process(self): 22 | pass -------------------------------------------------------------------------------- /Messaging/Packets/Client/Home/GoHomeFromOfflinePractiseMessage.py: -------------------------------------------------------------------------------- 1 | from Messaging.Packets.Server.Home.OwnHomeDataMessage import OwnHomeDataMessage 2 | 3 | from Logic.Data.DataManager import Writer 4 | from Logic.Data.DataManager import Reader 5 | 6 | 7 | class GoHomeFromOfflinePractiseMessage(Reader): 8 | def __init__(self, client, player, header_bytes): 9 | super().__init__(header_bytes) 10 | self.client = client 11 | self.player = player 12 | 13 | def decode(self): 14 | self.readBoolean() 15 | 16 | def process(self): 17 | OwnHomeDataMessage(self.client, self.player).send(self.player.LowID) -------------------------------------------------------------------------------- /Messaging/Packets/Client/Home/GetPlayerProfileMessage.py: -------------------------------------------------------------------------------- 1 | from Messaging.Packets.Server.Home.PlayerProfileMessage import PlayerProfileMessage 2 | 3 | from Logic.Data.DataManager import Writer 4 | from Logic.Data.DataManager import Reader 5 | 6 | 7 | class GetPlayerProfileMessage(Reader): 8 | def __init__(self, client, player, header_bytes): 9 | super().__init__(header_bytes) 10 | self.client = client 11 | self.player = player 12 | 13 | def decode(self): 14 | self.playerID = self.readLong() 15 | 16 | def process(self): 17 | PlayerProfileMessage(self.client, self.player, self).send(self.player.LowID) -------------------------------------------------------------------------------- /Logic/Notifications/BoxRewardNotification.py: -------------------------------------------------------------------------------- 1 | from Logic.Notifications.BaseNotification import BaseNotification 2 | from Logic.Data.DataManager import Writer 3 | from Logic.Data.DataManager import Reader 4 | 5 | 6 | class BoxRewardNotification: 7 | def decode(self: Reader): 8 | BaseNotification.decode(self) 9 | self.readVint() 10 | self.readVint() 11 | self.readVint() 12 | 13 | def encode(self: Writer, info): 14 | BaseNotification.encode(self, info) 15 | self.writeVint(1) # Unknown 16 | self.writeVint(info[1]['RewardType']) # Type 17 | self.writeVint(info[1]['RewardAmount']) # Amount 18 | -------------------------------------------------------------------------------- /Logic/Files/Classes/Pins.py: -------------------------------------------------------------------------------- 1 | import csv 2 | 3 | 4 | class Pins: 5 | 6 | def getPinsID(): 7 | EmotesID = [] 8 | with open('Logic/Files/assets/csv_logic/emotes.csv') as csv_file: 9 | csv_reader = csv.reader(csv_file, delimiter=',') 10 | line_count = 0 11 | for row in csv_reader: 12 | if line_count == 0 or line_count == 1: 13 | line_count += 1 14 | else: 15 | if row[1].lower() != 'true': 16 | EmotesID.append(line_count - 2) 17 | if row[0] != "": 18 | line_count += 1 19 | 20 | return EmotesID -------------------------------------------------------------------------------- /Logic/Files/Classes/Locations.py: -------------------------------------------------------------------------------- 1 | import csv 2 | 3 | 4 | class Locations: 5 | def getAllMaps(): 6 | Maps = [] 7 | with open('Logic/Files/assets/csv_logic/locations.csv', encoding="utf8") as csv_file: 8 | csv_reader = csv.reader(csv_file, delimiter=',') 9 | line_count = 0 10 | for row in csv_reader: 11 | if line_count == 0 or line_count == 1: 12 | line_count += 1 13 | else: 14 | if row[1].lower() != 'true': 15 | Maps.append(line_count - 2) 16 | if row[0] != "": 17 | line_count += 1 18 | return Maps -------------------------------------------------------------------------------- /Messaging/Packets/Client/Home/ChangeAvatarNameMessage.py: -------------------------------------------------------------------------------- 1 | from Messaging.Commands.Server.LogicChangeAvatarNameCommand import LogicChangeAvatarNameCommand 2 | 3 | from Logic.Data.DataManager import Writer 4 | from Logic.Data.DataManager import Reader 5 | 6 | 7 | class ChangeAvatarNameMessage(Reader): 8 | def __init__(self, client, player, header_bytes): 9 | super().__init__(header_bytes) 10 | self.client = client 11 | self.player = player 12 | 13 | def decode(self): 14 | self.player.Name = self.readString() 15 | self.readBoolean() 16 | 17 | def process(self): 18 | LogicChangeAvatarNameCommand(self.client, self.player).send(self.player.LowID) -------------------------------------------------------------------------------- /Logic/Classes/LogicRewardConfig.py: -------------------------------------------------------------------------------- 1 | from Logic.Classes.LogicCondition import LogicCondition 2 | from Logic.Classes.LogicGemOffer import LogicGemOffer 3 | from Logic.Data.DataManager import Writer 4 | from Logic.Data.DataManager import Reader 5 | 6 | 7 | class LogicRewardConfig: 8 | def decode(self: Reader): 9 | if self.readBoolean() == True: 10 | LogicCondition.decode(self) 11 | if self.readBoolean() == True: 12 | LogicGemOffer.decode(self) 13 | 14 | def encode(self: Writer, info): # TODO 15 | if self.writeBoolean() == True: 16 | LogicCondition.decode(self) 17 | if self.readBoolean() == True: 18 | LogicGemOffer.decode(self) 19 | -------------------------------------------------------------------------------- /Logic/Helpers/ForcedDrops.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Writer 2 | from Logic.Data.DataManager import Reader 3 | 4 | 5 | class ForcedDrops: 6 | def decode(self: Reader): 7 | self.readVint() 8 | self.readVint() 9 | for i in range(self.readVint()): 10 | self.readVint() 11 | 12 | def encode(self: Writer): 13 | self.writeVint(0) # Starpower Drop 14 | self.writeVint(0) # Gadget Drop 15 | 16 | self.writeVint(5) # Rarity Count 17 | self.writeVint(0) # Rare Drop 18 | self.writeVint(0) # Super Rare Drop 19 | self.writeVint(0) # Epic Drop 20 | self.writeVint(0) # Mythic Drop 21 | self.writeVint(0) # Legendary Drop -------------------------------------------------------------------------------- /Logic/Notifications/ProLeagueSeasonEndNotification.py: -------------------------------------------------------------------------------- 1 | from Logic.Notifications.BaseNotification import BaseNotification 2 | from Logic.Data.DataManager import Writer 3 | from Logic.Data.DataManager import Reader 4 | 5 | 6 | class ProLeagueSeasonEndNotification: 7 | def decode(self: Reader): 8 | BaseNotification.decode(self) 9 | self.readVint() 10 | self.readVint() 11 | self.readVint() 12 | self.readVint() 13 | self.readVint() 14 | 15 | def encode(self: Writer, info): 16 | BaseNotification.encode(self, info) 17 | self.writeVint(0) 18 | self.writeVint(0) 19 | self.writeVint(0) 20 | self.writeVint(0) 21 | self.writeVint(0) -------------------------------------------------------------------------------- /Logic/Files/Classes/PlayerThumbnails.py: -------------------------------------------------------------------------------- 1 | import csv 2 | 3 | 4 | class PlayerThumbnails: 5 | def getThumbnailsID(): 6 | ThumbnailsID = [] 7 | with open('Logic/Files/assets/csv_logic/player_thumbnails.csv') as csv_file: 8 | csv_reader = csv.reader(csv_file, delimiter=',') 9 | line_count = 0 10 | for row in csv_reader: 11 | if line_count == 0 or line_count == 1: 12 | line_count += 1 13 | else: 14 | if row[8].lower() == 'true': 15 | ThumbnailsID.append(line_count - 2) 16 | if row[0] != "": 17 | line_count += 1 18 | return ThumbnailsID -------------------------------------------------------------------------------- /Logic/Files/Classes/Characters.py: -------------------------------------------------------------------------------- 1 | import csv 2 | 3 | 4 | class Characters: 5 | 6 | def getBrawlersID(): 7 | BrawlersID = [] 8 | with open('Logic/Files/assets/csv_logic/characters.csv') as csv_file: 9 | csv_reader = csv.reader(csv_file, delimiter=',') 10 | line_count = 0 11 | for row in csv_reader: 12 | if line_count == 0 or line_count == 1: 13 | line_count += 1 14 | else: 15 | if row[23] == 'Hero' and row[1].lower() != 'true' and row[2].lower() != 'true' and row[0] != "MechaDudeBig": 16 | BrawlersID.append(line_count - 2) 17 | line_count += 1 18 | 19 | return BrawlersID -------------------------------------------------------------------------------- /Logic/Classes/LogicPlayerMap.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Writer 2 | from Logic.Data.DataManager import Reader 3 | 4 | 5 | class LogicPlayerMap: 6 | def decode(self: Reader): 7 | self.readVLong("MapID") 8 | self.readString("MapName") 9 | self.readVint("GameModeVariation") 10 | self.readDataReference("MapEnvironmentData") 11 | self.readCompressedString("MapData") 12 | self.readVLong("AccountID") 13 | self.readString("AvatarName") 14 | self.readVint("State") 15 | self.readLong("LastUpdateTimeSecondsSinceEpoch") 16 | self.readVint("FriendlyParticipantCount") 17 | self.readVint("FriendlySignoffCount") 18 | self.readVint("Dislikes") 19 | self.readVint("Likes") 20 | self.readVint("Battles") -------------------------------------------------------------------------------- /Messaging/Commands/Client/LogicSelectCharacterCommand.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from Database.DatabaseManager import DatabaseManager 4 | 5 | from Logic.Data.DataManager import Writer, Reader 6 | 7 | 8 | class LogicSelectCharacterCommand(Reader): 9 | def __init__(self, client, player, data): 10 | super().__init__(data) 11 | self.client = client 12 | self.player = player 13 | 14 | def decode(self): 15 | print() 16 | self.brawlerData = self.readDataReferenceDouble() 17 | print(self.brawlerData) 18 | 19 | def process(self): 20 | self.db = DatabaseManager() 21 | self.database = json.loads(self.db.getPlayerWithLowID(self.player.LowID)[0][2]) 22 | self.database['brawlerID'] = self.brawlerData[1] 23 | self.db.update_player_data(self.database, self.player.LowID) -------------------------------------------------------------------------------- /Logic/Notifications/RankedSeasonEndNotification.py: -------------------------------------------------------------------------------- 1 | from Logic.Classes.LogicGemOffer import LogicGemOffer 2 | from Logic.Notifications.BaseNotification import BaseNotification 3 | from Logic.Data.DataManager import Writer 4 | from Logic.Data.DataManager import Reader 5 | 6 | 7 | class RankedSeasonEndNotification: 8 | def decode(self: Reader): 9 | BaseNotification.decode(self) 10 | self.readVint() 11 | self.readVint() 12 | self.readVint() 13 | if self.readVint() == 1: 14 | LogicGemOffer.decode(self) 15 | 16 | def encode(self: Writer, info): # TODO 17 | BaseNotification.encode(self, info) 18 | self.writeVint(0) 19 | self.writeVint(0) 20 | self.writeVint(0) 21 | 22 | self.writeVint(0) 23 | # for i in range(0): 24 | # LogicGemOffer.encode(self) -------------------------------------------------------------------------------- /Logic/Notifications/RankedMidSeasonRewardNotification.py: -------------------------------------------------------------------------------- 1 | from Logic.Classes.LogicRewardConfig import LogicRewardConfig 2 | from Logic.Notifications.BaseNotification import BaseNotification 3 | from Logic.Data.DataManager import Writer 4 | from Logic.Data.DataManager import Reader 5 | 6 | 7 | class RankedMidSeasonRewardNotification: 8 | def decode(self: Reader): 9 | BaseNotification.decode(self) 10 | LogicRewardConfig.decode(self) 11 | 12 | def encode(self: Writer, info): # TODO 13 | BaseNotification.encode(self, info) 14 | self.writeVint(1) 15 | self.writeByte(3) 16 | 17 | self.writeByte(3) # LogicRewardConfig 18 | 19 | self.writeVint(30) 20 | self.writeVint(1) 21 | 22 | self.writeVint(26) # ItemType 23 | self.writeVint(1) 24 | self.writeVint(0) # CsvID 25 | self.writeVint(357) -------------------------------------------------------------------------------- /Messaging/Packets/Server/Home/OwnHomeDataMessage.py: -------------------------------------------------------------------------------- 1 | from Database.DatabaseManager import DatabaseManager 2 | from Logic.Data.DataManager import Writer 3 | from Logic.Classes.LogicClientAvatar import LogicClientAvatar 4 | from Logic.Classes.LogicClientHome import LogicClientHome 5 | 6 | 7 | class OwnHomeDataMessage(Writer): 8 | def __init__(self, client, player): 9 | super().__init__(client) 10 | self.id = 24101 11 | self.client = client 12 | self.player = player 13 | 14 | def encode(self): 15 | self.db = DatabaseManager() 16 | try: 17 | self.db.LoadAccount(self.player.LowID, self.player) 18 | except: 19 | print("[ERROR] Failed to load player data from database.") 20 | 21 | self.writeVint(0) 22 | self.writeVint(0) 23 | LogicClientHome.encode(self) 24 | LogicClientAvatar.encode(self) 25 | -------------------------------------------------------------------------------- /Logic/Notifications/ChallengeRewardNotification.py: -------------------------------------------------------------------------------- 1 | from Logic.Notifications.BaseNotification import BaseNotification 2 | from Logic.Data.DataManager import Writer 3 | from Logic.Data.DataManager import Reader 4 | 5 | 6 | class ChallengeRewardNotification: 7 | def decode(self: Reader): 8 | BaseNotification.decode(self) 9 | self.readVint() 10 | self.readVint() 11 | self.readVint() 12 | self.readVint() 13 | self.readVint() 14 | 15 | def encode(self: Writer, info): 16 | BaseNotification.encode(self, info) 17 | self.writeVint(1) 18 | for i in range(1): 19 | self.writeVint(1) 20 | self.writeVint(14) # ItemType 21 | self.writeVint(1) 22 | self.writeVint(0) # CsvID 23 | self.writeVint(0) 24 | 25 | self.writeVint(7) 26 | self.writeVint(3) 27 | self.writeString('SUMMER SPORTS CHALLENGE!') -------------------------------------------------------------------------------- /Messaging/Packets/Server/Authentication/LoginFailedMessage.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Writer 2 | 3 | class LoginFailedMessage(Writer): 4 | def __init__(self, client, player): 5 | super().__init__(client) 6 | self.id = 20103 7 | self.client = client 8 | self.player = player 9 | 10 | def encode(self): 11 | self.writeInt(1) 12 | self.writeString() 13 | self.writeString() 14 | self.writeString() 15 | self.writeString() 16 | self.writeString() 17 | self.writeInt(0) 18 | self.writeBoolean(False) 19 | self.writeBytes(b'') 20 | self.writeInt(0) 21 | self.writeInt(0) 22 | self.writeInt(0) 23 | self.writeString() 24 | self.writeInt(0) 25 | self.writeByte(3) 26 | self.writeStringReference() 27 | self.writeVint(0) 28 | self.writeStringReference() 29 | self.writeBoolean(False) -------------------------------------------------------------------------------- /Messaging/Commands/Server/LogicChangeAvatarNameCommand.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from Database.DatabaseManager import DatabaseManager 4 | 5 | from Logic.Data.DataManager import Writer 6 | 7 | 8 | class LogicChangeAvatarNameCommand(Writer): 9 | def __init__(self, client, player): 10 | super().__init__(client) 11 | self.id = 24111 12 | self.client = client 13 | self.player = player 14 | 15 | def encode(self): 16 | self.db = DatabaseManager() 17 | self.database = json.loads(self.db.getPlayerWithLowID(self.player.LowID)[0][2]) 18 | self.database['name'] = self.player.Name 19 | self.database['IsRegistred'] = True 20 | self.db.update_player_data(self.database, self.player.LowID) 21 | 22 | self.writeVint(201) 23 | self.writeString(self.player.Name) 24 | self.writeVint(0) 25 | 26 | self.writeVint(1) 27 | 28 | self.writeVint(2) 29 | self.writeVint(3) 30 | 31 | self.writeVint(4) 32 | self.writeVint(5) -------------------------------------------------------------------------------- /Logic/Classes/LogicClientHome.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Writer 2 | from Logic.Data.DataManager import Reader 3 | from Logic.Classes.LogicConfData import LogicConfData 4 | from Logic.Classes.LogicDailyData import LogicDailyData 5 | from Logic.Notifications.NotificationFactory import NotificationFactory 6 | from Logic.Settings.Configuration import Configuration 7 | 8 | 9 | class LogicClientHome: 10 | def decode(self: Reader): 11 | pass 12 | 13 | def encode(self: Writer): 14 | LogicDailyData.encode(self) 15 | LogicConfData.encode(self) 16 | self.writeLong(self.player.HighID, self.player.LowID) # PlayerID 17 | 18 | self.writeVint(len(Configuration.Inbox)) # Notification Factory 19 | for notifInfo in Configuration.Inbox: 20 | NotificationFactory.encode(self, (Configuration.Inbox.index(notifInfo), notifInfo)) 21 | 22 | self.writeVint(-64) # VideoAdStarted 23 | self.writeBoolean(False) 24 | self.writeVint(0) # GatchaDrop 25 | self.writeVint(0) # FriendlyStarPower -------------------------------------------------------------------------------- /Logic/Helpers/PlayerDisplayData.py: -------------------------------------------------------------------------------- 1 | from Logic.Classes.LogicDataTables import LogicDataTables 2 | from Logic.Data.DataManager import Writer 3 | from Logic.Data.DataManager import Reader 4 | 5 | 6 | class PlayerDisplayData: 7 | Checksum = 0 8 | AccountBoundFlags = 0 9 | LogicBattleMode = "LogicBattleModeClient" 10 | LogicHomeMode = "LogicHomeMode" 11 | 12 | def decode(self: Reader): 13 | self.readString("PlayerName") 14 | self.readVint() 15 | self.readVint("PlayerThumbnail") 16 | self.readVint("NameColor") 17 | self.readVint() 18 | 19 | def encode(self: Writer, info): 20 | self.writeString(info[1]['Sender']['Name']) 21 | self.writeVint(100) 22 | self.writeVint(28000000 + info[1]['Sender']['Thumbnail']) 23 | self.writeVint(43000000 + info[1]['Sender']['NameColor']) 24 | self.writeVint(-1) 25 | 26 | def getNameColor(self, globalId): 27 | LogicDataTables.getDataById(globalId) 28 | 29 | def getPlayerThumbnail(self, globalId): 30 | LogicDataTables.getDataById(globalId) -------------------------------------------------------------------------------- /Logic/Settings/PrintHandler.py: -------------------------------------------------------------------------------- 1 | from Logic.Settings.Configuration import Configuration 2 | 3 | 4 | class PrintManager: 5 | def printDisabledPrint(self): 6 | if Configuration.Print["DisabledPrint"] == True: 7 | print() 8 | for i,v in Configuration.Print.items(): 9 | if v == False: 10 | print(f'{i} printing is disabled in configuration.') 11 | print() 12 | 13 | def printLogin(self): 14 | if Configuration.Print["Login"] == True: 15 | print(f'\nHighID: {self.player.HighID}, LowID: {self.player.LowID}, Token: {self.player.Token}\n') 16 | 17 | print(f'Major: {self.Major}, Minor: {self.Minor}, Build: {self.Build}\n') 18 | 19 | print(f'Fingerprint: {self.FingerprintSha}\n') 20 | 21 | print(f'Device model: {self.DeviceModel}, Android bool: {self.IsAndroid}, Device language: {self.DeviceLanguage}, OS version: {self.OSVersion}\n') 22 | 23 | print(f'OpenUDID: {self.OpenUDID}\n') 24 | 25 | print(f'App version: {self.AppVersion}\n') 26 | 27 | 28 | def printAnalytics(self): 29 | if Configuration.Print["Analytics"] == True: 30 | print(f'Event: {self.EventType} Info: {self.Event}\n') -------------------------------------------------------------------------------- /Messaging/Commands/Client/LogicSelectSkinCommand.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from Logic.Files.Classes.Skins import Skins 4 | from Database.DatabaseManager import DatabaseManager 5 | 6 | from Logic.Data.DataManager import Writer, Reader 7 | 8 | 9 | class LogicSelectSkinCommand(Reader): 10 | def __init__(self, client, player, data): 11 | super().__init__(data) 12 | self.client = client 13 | self.player = player 14 | 15 | def decode(self): 16 | print() 17 | self.skinData = self.readDataReferenceDouble() 18 | print(self.skinData) 19 | print(self.readBoolean()) 20 | self.randomSkinData = self.readDataReferenceDouble() 21 | print(self.randomSkinData) 22 | 23 | def process(self): 24 | self.db = DatabaseManager() 25 | self.database = json.loads(self.db.getPlayerWithLowID(self.player.LowID)[0][2]) 26 | if self.skinData != 0: 27 | self.database['skinID'] = self.skinData[1] 28 | self.database['selectedSkin'][Skins.getBrawlerBySkin(self, self.skinData[1])] = self.skinData[1] 29 | elif self.randomSkinData != 0: 30 | self.database['selectedRandomSkin'].append(self.randomSkinData[1]) 31 | self.db.update_player_data(self.database, self.player.LowID) -------------------------------------------------------------------------------- /Messaging/Commands/Client/LogicEnableSkinRandomizerCommand.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from Logic.Files.Classes.Skins import Skins 4 | from Database.DatabaseManager import DatabaseManager 5 | 6 | from Logic.Data.DataManager import Writer, Reader 7 | 8 | 9 | class LogicEnableSkinRandomizerCommand(Reader): 10 | def __init__(self, client, player, data): 11 | super().__init__(data) 12 | self.client = client 13 | self.player = player 14 | 15 | def decode(self): 16 | print() 17 | self.skinData = self.readDataReferenceDouble() 18 | print(self.skinData) 19 | self.state = self.readBoolean() 20 | print(self.state) 21 | 22 | def process(self): 23 | self.db = DatabaseManager() 24 | self.database = json.loads(self.db.getPlayerWithLowID(self.player.LowID)[0][2]) 25 | if self.skinData != 0: 26 | if self.state == True: 27 | self.database['brawlerState'][Skins.getBrawlerBySkin(self, self.skinData[1])] = 18 28 | else: 29 | self.database['brawlerState'][Skins.getBrawlerBySkin(self, self.skinData[1])] = 2 30 | self.database['selectedSkin'][Skins.getBrawlerBySkin(self, self.skinData[1])] = self.skinData[1] 31 | self.db.update_player_data(self.database, self.player.LowID) -------------------------------------------------------------------------------- /Messaging/Packets/Client/Home/AskForBattleEndMessage.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Writer 2 | from Logic.Data.DataManager import Reader 3 | 4 | from Messaging.Packets.Server.Battle.BattleEndMessage import BattleEndMessage 5 | 6 | class AskForBattleEndMessage(Reader): 7 | def __init__(self, client, player, header_bytes): 8 | super().__init__(header_bytes) 9 | self.player = player 10 | self.client = client 11 | 12 | def decode(self): 13 | self.playersList = {} 14 | self.readVint() 15 | self.result = self.readVint() 16 | self.rank = self.readVint() 17 | self.mapID = self.readDataReference() 18 | for i in range(self.readVint()): 19 | self.playersList[str(i)] = {} 20 | self.playersList[str(i)]["BrawlerID"] = self.readDataReferenceDouble(True) 21 | self.playersList[str(i)]["SkinID"] = self.readDataReferenceDouble(True) 22 | self.readVint() 23 | self.playersList[str(i)]["IsPlayer"] = self.readBoolean() 24 | self.playersList[str(i)]["Name"] = self.readString() 25 | if self.playersList[str(i)]["Name"] == "3" or self.playersList[str(i)]["Name"] == "4" or self.playersList[str(i)]["Name"] == "5": 26 | self.playersList[str(i)]["Unknown"] = 1 27 | else: 28 | self.playersList[str(i)]["Unknown"] = 0 29 | 30 | def process(self): 31 | self.info = [] 32 | BattleEndMessage(self.client, self.player, self.playersList, self.info).send(self.player.LowID) 33 | -------------------------------------------------------------------------------- /Logic/Notifications/PromoPopupNotification.py: -------------------------------------------------------------------------------- 1 | from Logic.Helpers.ChronosFileEntry import ChronosFileEntry 2 | from Logic.Helpers.ChronosTextEntry import ChronosTextEntry 3 | from Logic.Notifications.BaseNotification import BaseNotification 4 | from Logic.Data.DataManager import Writer 5 | from Logic.Data.DataManager import Reader 6 | 7 | 8 | class PromoPopupNotification: 9 | def decode(self: Reader): 10 | BaseNotification.decode(self) 11 | ChronosTextEntry.encode(self) 12 | ChronosTextEntry.encode(self) 13 | ChronosTextEntry.encode(self) 14 | ChronosFileEntry.encode(self) 15 | self.writeString("Damn how much strings is there here") 16 | self.writeVint(0) 17 | 18 | 19 | def encode(self: Writer, info): 20 | BaseNotification.encode(self, info) 21 | ChronosTextEntry.encode(self) 22 | ChronosTextEntry.encode(self) 23 | ChronosTextEntry.encode(self) 24 | ChronosFileEntry.encode(self) 25 | self.writeString("Damn how much strings is there here") 26 | self.writeVint(0) 27 | 28 | self.writeInt(0) 29 | self.writeString('BRAWL TALK IS HERE!') 30 | 31 | self.writeInt(0) 32 | self.writeString('Legendary Sidekick, MAKE Skin, and MORE!') 33 | 34 | self.writeInt(0) 35 | self.writeString('Here we go!') 36 | 37 | self.writeString('/36042168-49af-4e79-b5f3-13c8c279bc5c_brawltalkpopup.png') 38 | self.writeString('28d8d5533ddecebf766daac49f3290415a36fa42') 39 | 40 | self.writeString('brawlstars://extlink?page=https%3A%2F%2Fyoutu.be%2F9jycpItX9l4') 41 | self.writeVint(3473) 42 | -------------------------------------------------------------------------------- /Messaging/Packets/Client/Game/EndClientTurnMessage.py: -------------------------------------------------------------------------------- 1 | from Messaging.LogicCommandManager import commandIdentifiers 2 | 3 | from Logic.Data.DataManager import Writer 4 | from Logic.Data.DataManager import Reader 5 | 6 | 7 | class EndClientTurnMessage(Reader): 8 | def __init__(self, client, player, header_bytes): 9 | super().__init__(header_bytes) 10 | self.client = client 11 | self.player = player 12 | self.commmandID = [] 13 | 14 | def decode(self): 15 | print(self.readBoolean()) 16 | print(self.readVint()) 17 | print(self.readVint()) 18 | count = self.readVint() 19 | print(count) 20 | for command in range(count): 21 | self.commmandID.append(self.readVint()) 22 | self.tick1 = self.readVint() 23 | self.tick2 = self.readVint() 24 | self.readVLong() 25 | if self.commmandID[command] in commandIdentifiers: 26 | if type(commandIdentifiers[self.commmandID[command]]) != str: 27 | command = commandIdentifiers[self.commmandID[command]] 28 | command.decode(self) 29 | command.process(self) 30 | ## Rest is the data 31 | 32 | def process(self): 33 | if len(self.commmandID) != 0: 34 | for i in self.commmandID: 35 | if i in commandIdentifiers: 36 | if type(commandIdentifiers[i]) != str: 37 | print(f'Received command: {i}: {commandIdentifiers[i].__name__}') 38 | else: 39 | print(f'Received command: {i}: {commandIdentifiers[i]}') 40 | else: 41 | print(f'Received unknown command with id: {i}.') -------------------------------------------------------------------------------- /Messaging/Packets/Server/Authentication/LoginOkMessage.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Writer 2 | 3 | class LoginOkMessage(Writer): 4 | def __init__(self, client, player): 5 | super().__init__(client) 6 | self.id = 20104 7 | self.client = client 8 | self.player = player 9 | self.version = 1 10 | 11 | def encode(self): 12 | self.writeLong(self.player.HighID, self.player.LowID) 13 | self.writeLong(self.player.HighID, self.player.LowID) 14 | self.writeString(self.player.Token) 15 | self.writeString() 16 | self.writeString() 17 | self.writeInt(39) 18 | self.writeInt(110) 19 | self.writeInt(1) 20 | self.writeString('prod') 21 | self.writeInt(0) 22 | self.writeInt(0) 23 | self.writeInt(0) 24 | self.writeString() 25 | self.writeString() 26 | self.writeString() 27 | self.writeInt(0) 28 | self.writeString() 29 | self.writeString('CA') 30 | self.writeString() 31 | self.writeInt(2) 32 | self.writeString() 33 | 34 | self.writeInt(2) 35 | self.writeString('https://game-assets.brawlstarsgame.com') 36 | self.writeString('http://a678dbc1c015a893c9fd-4e8cc3b1ad3a3c940c504815caefa967.r87.cf2.rackcdn.com') 37 | 38 | self.writeInt(2) 39 | self.writeString('https://event-assets.brawlstars.com') 40 | self.writeString('https://24b999e6da07674e22b0-8209975788a0f2469e68e84405ae4fcf.ssl.cf2.rackcdn.com/event-assets') 41 | 42 | self.writeVint(0) 43 | self.writeCompressedString(b'') 44 | self.writeBoolean(True) 45 | self.writeString() 46 | self.writeString() 47 | self.writeString() 48 | self.writeString('https://play.google.com/store/apps/details?id=com.supercell.brawlstars') 49 | self.writeString() 50 | self.writeBoolean(False) -------------------------------------------------------------------------------- /Logic/Settings/Configuration.py: -------------------------------------------------------------------------------- 1 | class Configuration: 2 | Print = { 3 | "DisabledPrint": True, 4 | "Login": False, 5 | "Analytics": False 6 | } 7 | 8 | Settings = { } 9 | 10 | Inbox = [ 11 | { 12 | 'ID': 94, 13 | 'Timer': 9999, 14 | 'ShowAtLaunch': False, 15 | 'Text': "", 16 | 'SkinID': 59 17 | }, 18 | { 19 | 'ID': 81, 20 | 'Timer': 9999, 21 | 'ShowAtLaunch': False, 22 | 'Text': "Notification text" 23 | }, 24 | { 25 | 'ID': 82, 26 | 'Timer': 9999, 27 | 'ShowAtLaunch': False, 28 | 'Text': "Inbox Notification", 29 | 'Sender': {'Name': 'Crazor', 'Thumbnail': 17, 'NameColor': 9} 30 | }, 31 | { 32 | 'ID': 79, 33 | 'Timer': 9999, 34 | 'ShowAtLaunch': False, 35 | 'Text': "Season end hacc" 36 | }, 37 | { 38 | 'ID': 67, 39 | 'Timer': 9999, 40 | 'ShowAtLaunch': False, 41 | 'Text': "RankedMidSeason" 42 | }, 43 | { 44 | 'ID': 72, 45 | 'Timer': 9999, 46 | 'ShowAtLaunch': False, 47 | 'Text': "Here's your CLAPPING pin from a previous Brawl Pass season!", 48 | 'EmoteID': 470 49 | }, 50 | { 51 | 'ID': 63, 52 | 'Timer': 9999, 53 | 'ShowAtLaunch': False, 54 | 'Text': "", 55 | }, 56 | { 57 | 'ID': 74, 58 | 'Timer': 9999, 59 | 'ShowAtLaunch': False, 60 | 'Text': "", 61 | 'Tickets': 11, 62 | 'Gems': 111 63 | }, 64 | { 65 | 'ID': 64, 66 | 'Timer': 9999, 67 | 'ShowAtLaunch': False, 68 | 'Text': "Hacc", 69 | 'RewardType': 1, 70 | 'RewardAmount': 666 71 | } 72 | ] -------------------------------------------------------------------------------- /Logic/Notifications/StarPointsNotification.py: -------------------------------------------------------------------------------- 1 | from Logic.Entry.ScoreEntry import ScoreEntry 2 | from Logic.Notifications.BaseNotification import BaseNotification 3 | from Logic.Data.DataManager import Writer 4 | from Logic.Data.DataManager import Reader 5 | 6 | 7 | class StarPointsNotification: 8 | ProgressStart = [501, 525, 550, 575, 600, 625, 650, 675, 700, 725, 750, 775, 800, 825, 850, 875, 900, 925, 950, 975, 1000, 1050, 1100, 1150, 1200, 1250, 1300, 1350, 1400, 1450, 1500] 9 | ProgressEnd = [524, 549, 574, 599, 624, 649, 674, 699, 724, 749, 774, 799, 824, 849, 874, 899, 924, 949, 974, 999, 1049, 1099, 1149, 1199, 1249, 1299, 1349, 1399, 1449, 1499, -64] 10 | Progress = [500, 524, 549, 574, 599, 624, 649, 674, 699, 724, 749, 774, 799, 824, 849, 874, 885, 900, 920, 940, 960, 980, 1000, 1020, 1040, 1060, 1080, 1100, 1120, 1140, 1150] 11 | RewardedSP = [20, 50, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250,260, 270, 280, 290, 300, 310, 320, 330, 340, 350] 12 | 13 | def decode(self: Reader): 14 | BaseNotification.decode(self) 15 | for i in range(self.readVint()): 16 | print() 17 | ScoreEntry.decode(self) 18 | 19 | def encode(self: Writer, info): 20 | BaseNotification.encode(self, info) 21 | self.writeVint(len(self.player.brawlersTrophies)) 22 | for id,trophies in self.player.brawlersTrophies.items(): 23 | brawlerInfo = [int(id), trophies] 24 | if trophies >= 1500: 25 | brawlerInfo.append(trophies - 1150) 26 | brawlerInfo.append(350) 27 | elif trophies >= 501: 28 | for i in StarPointsNotification.Progress: 29 | StarpointsProgressIndex = StarPointsNotification.Progress.index(i) 30 | if StarPointsNotification.ProgressStart[StarpointsProgressIndex] <= trophies <= StarPointsNotification.ProgressEnd[StarpointsProgressIndex]: 31 | brawlerInfo.append(trophies - i) 32 | brawlerInfo.append(StarPointsNotification.RewardedSP[StarpointsProgressIndex]) 33 | break 34 | ScoreEntry.encode(self, brawlerInfo) -------------------------------------------------------------------------------- /Logic/Data/PacketsHandler.py: -------------------------------------------------------------------------------- 1 | from Messaging.LogicMessageFactory import identifiers, knownList 2 | from Messaging.Packets.Server.Home.LobbyInfoMessage import LobbyInfoMessage 3 | from Logic.Utility.Utils import Utils 4 | 5 | 6 | class PacketsHandler: 7 | def ReadHeader(self): 8 | def recv(n): 9 | data = bytearray() 10 | while len(data) < n: 11 | packet = self.client.recv(n - len(data)) 12 | if not packet: 13 | return None 14 | data.extend(packet) 15 | return data 16 | 17 | packetInfo = self.client.recv(7) 18 | if len(packetInfo): 19 | packet_identifier = int.from_bytes(packetInfo[:2], 'big') 20 | length = int.from_bytes(packetInfo[2:5], 'big') 21 | version = int.from_bytes(packetInfo[5:7], 'big') 22 | data = recv(length) 23 | 24 | if packet_identifier in identifiers: 25 | message = identifiers[packet_identifier](self.client, self.player, data) 26 | packet_name = identifiers[packet_identifier].__name__ 27 | 28 | print(f"---------------------------------------------------------------------------------------------") 29 | print(f"\033[93m[{Utils.GetTime(self)}] [SERVER] PacketID: {packet_identifier} Name: {packet_name} Length: {length} Version: {version}, Data: {data}") 30 | 31 | message.decode() 32 | message.process() 33 | 34 | elif packet_identifier in knownList: 35 | print(f"---------------------------------------------------------------------------------------------") 36 | print(f"\033[93m[{Utils.GetTime(self)}] [SERVER] PacketID: {packet_identifier} Name: {knownList[packet_identifier]} Length: {length} Version: {version}, Data: {data}") 37 | else: 38 | print(f"---------------------------------------------------------------------------------------------") 39 | print(f"\033[93m[{Utils.GetTime(self)}] [SERVER] PacketID: {packet_identifier} Name: Unknown Length: {length} Version: {version}, Data: {data}") 40 | 41 | # Yes i like to put useless line of code ¯\_(ツ)_/¯ 42 | 43 | LobbyInfoMessage(self.client, self.player).send(self.client) -------------------------------------------------------------------------------- /Messaging/Packets/Server/Home/PlayerProfileMessage.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Writer 2 | 3 | 4 | class PlayerProfileMessage(Writer): 5 | def __init__(self, client, player, entry): 6 | super().__init__(client) 7 | self.id = 24113 8 | self.client = client 9 | self.player = player 10 | self.info = entry 11 | 12 | def encode(self): 13 | self.writeVLong(self.info.playerID[0], self.info.playerID[1]) 14 | self.writeVint(0) 15 | 16 | # Brawlers 17 | self.writeVint(len(self.player.allBrawlers)) 18 | for i in self.player.allBrawlers: 19 | self.writeDataReference(16, i) 20 | self.writeDataReference(0, 0) 21 | self.writeVint(1250) 22 | self.writeVint(1250) 23 | self.writeVint(10) 24 | 25 | self.writeVint(15) 26 | 27 | self.writeVint(1) 28 | self.writeVint(0) # 3v3 Victories 29 | 30 | self.writeVint(2) 31 | self.writeVint(self.player.experience) # Experince 32 | 33 | self.writeVint(3) 34 | self.writeVint(self.player.trophies) # Current Trophies 35 | 36 | self.writeVint(4) 37 | self.writeVint(self.player.highestTrophies) # Highest Trophies 38 | 39 | self.writeVint(5) 40 | self.writeVint(len(self.player.allBrawlers)) 41 | 42 | self.writeVint(8) 43 | self.writeVint(0) # Solo Victories 44 | 45 | self.writeVint(11) 46 | self.writeVint(0) # Duo Victories 47 | 48 | self.writeVint(9) 49 | self.writeVint(0) # Highest Robo Rumble LVL Passed 50 | 51 | self.writeVint(12) 52 | self.writeVint(0) # Highest Boss Fight LVL Passed 53 | 54 | self.writeVint(13) 55 | self.writeVint(100) 56 | 57 | self.writeVint(14) 58 | self.writeVint(0) 59 | 60 | self.writeVint(15) 61 | self.writeVint(0) # Most Challenge Wins 62 | 63 | self.writeVint(16) 64 | self.writeVint(0) # Highest Rampage LVL Passed 65 | 66 | self.writeVint(18) 67 | self.writeVint(0) # Highest Solo League 68 | 69 | self.writeVint(17) 70 | self.writeVint(0) # Highest Team League 71 | 72 | self.writeString(self.player.Name) 73 | self.writeVint(100) 74 | self.writeVint(28000000 + self.player.thumbnails) 75 | self.writeVint(43000000 + self.player.nameColor) 76 | self.writeVint(-64) 77 | 78 | self.writeVint(0) 79 | self.writeVint(0) -------------------------------------------------------------------------------- /Core.py: -------------------------------------------------------------------------------- 1 | import socket 2 | import threading 3 | import traceback 4 | from builtins import ConnectionError 5 | 6 | from Logic.Client.ClientsManager import ClientsManager 7 | from Logic.Data.PacketsHandler import PacketsHandler 8 | from Logic.Client.PlayerManager import Players 9 | 10 | '''brawlertrophies = 1500 11 | ProgressStart = [501, 525, 550, 575, 600, 625, 650, 675, 700, 725, 750, 775, 800, 825, 850, 875, 900, 925, 950, 975, 1000, 1050, 1100, 1150, 1200, 1250, 1300, 1350, 1400, 1450, 1500] 12 | ProgressEnd = [524, 549, 574, 599, 624, 649, 674, 699, 724, 749, 774, 799, 824, 849, 874, 899, 924, 949, 974, 999, 1049, 1099, 1149, 1199, 1249, 1299, 1349, 1399, 1449, 1499, -1] 13 | Progress = [500, 524, 549, 574, 599, 624, 649, 674, 699, 724, 749, 774, 799, 824, 849, 874, 885, 900, 920, 940, 960, 980, 1000, 1020, 1040, 1060, 1080, 1100, 1120, 1140, 1150] 14 | RewardedSP = [20, 50, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350] 15 | 16 | if brawlertrophies >= 1500: 17 | print(brawlertrophies, RewardedSP[Progress.index(1150)], brawlertrophies - 1150) 18 | if brawlertrophies >= 501: 19 | for i in Progress: 20 | if ProgressStart[Progress.index(i)] <= brawlertrophies <= ProgressEnd[Progress.index(i)]: 21 | print(brawlertrophies, RewardedSP[Progress.index(i)], brawlertrophies - i) 22 | break 23 | else: 24 | print("Trophies below 501.")''' 25 | 26 | class Core: 27 | def __init__(self): 28 | self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 29 | 30 | def CoreInit(self): 31 | self.server.bind(('0.0.0.0', 9339)) 32 | print("Socket binded!") 33 | while True: 34 | self.server.listen() 35 | socket, address = self.server.accept() 36 | print(f'Got new connection with address: {address[0]}') 37 | ConnectionThread(socket, address).start() 38 | 39 | class ConnectionThread(threading.Thread): 40 | def __init__(self, client, address): 41 | super().__init__() 42 | self.address = address 43 | self.client = client 44 | self.player = Players 45 | 46 | def run(self): 47 | try: 48 | while True: 49 | # Reading and processing packet 50 | PacketsHandler.ReadHeader(self) 51 | 52 | except ConnectionError: 53 | print(f"Client with ip: {self.address[0]} disconnected!") 54 | ClientsManager.RemoveSocket(self.player.LowID) 55 | self.client.close() 56 | print(traceback.format_exc()) 57 | exit(0) 58 | 59 | Core().CoreInit() -------------------------------------------------------------------------------- /Messaging/LogicCommandManager.py: -------------------------------------------------------------------------------- 1 | from Messaging.Commands.Client.LogicClearESportsHubNotificationCommand import LogicClearESportsHubNotificationCommand 2 | from Messaging.Commands.Client.LogicClearShopTickersCommand import LogicClearShopTickersCommand 3 | from Messaging.Commands.Client.LogicEnableSkinRandomizerCommand import LogicEnableSkinRandomizerCommand 4 | from Messaging.Commands.Client.LogicGatchaCommand import LogicGatchaCommand 5 | from Messaging.Commands.Client.LogicHelpOpenedCommand import LogicHelpOpenedCommand 6 | from Messaging.Commands.Client.LogicHeroSeenCommand import LogicHeroSeenCommand 7 | from Messaging.Commands.Client.LogicPurchaseDoubleCoinsCommand import LogicPurchaseDoubleCoinsCommand 8 | from Messaging.Commands.Client.LogicPurchaseHeroLvlUpMaterialCommand import LogicPurchaseHeroLvlUpMaterialCommand 9 | from Messaging.Commands.Client.LogicQuestsSeenCommand import LogicQuestsSeenCommand 10 | from Messaging.Commands.Client.LogicSelectCharacterCommand import LogicSelectCharacterCommand 11 | from Messaging.Commands.Client.LogicSelectEmoteCommand import LogicSelectEmoteCommand 12 | from Messaging.Commands.Client.LogicSelectSkinCommand import LogicSelectSkinCommand 13 | from Messaging.Commands.Client.LogicSelectStarPowerCommand import LogicSelectStarPowerCommand 14 | 15 | commandIdentifiers = { 16 | 500: LogicGatchaCommand, 17 | 503: 'LogicClaimDailyRewardCommand', 18 | 504: 'LogicSendAllianceMailCommand', 19 | 505: 'LogicSetPlayerThumbnailCommand', 20 | 506: LogicSelectSkinCommand, 21 | 507: 'LogicUnlockSkinCommand', 22 | 508: 'LogicChangeControlModeCommand', 23 | 509: LogicPurchaseDoubleCoinsCommand, 24 | 511: LogicHelpOpenedCommand, 25 | 512: 'LogicToggleInGameHintsCommand', 26 | 514: 'LogicDeleteNotificationCommand', 27 | 515: LogicClearShopTickersCommand, 28 | 517: 'LogicClaimRankUpRewardCommand', 29 | 518: 'LogicPurchaseTicketsCommand', 30 | 519: 'LogicPurchaseOfferCommand', 31 | 520: 'LogicLevelUpCommand', 32 | 521: LogicPurchaseHeroLvlUpMaterialCommand, 33 | 522: LogicHeroSeenCommand, 34 | 523: 'LogicClaimAdRewardCommand', 35 | 524: 'LogicVideoStartedCommand', 36 | 525: LogicSelectCharacterCommand, 37 | 526: 'LogicUnlockFreeSkinsCommand', 38 | 527: 'LogicSetPlayerNameColorCommand', 39 | 528: 'LogicViewInboxNotificationCommand', 40 | 529: LogicSelectStarPowerCommand, 41 | 530: 'LogicSetPlayerAgeCommand', 42 | 531: 'LogicCancelPurchaseOfferCommand', 43 | 532: 'LogicItemSeenCommand', 44 | 533: LogicQuestsSeenCommand, 45 | 534: 'LogicPurchaseBrawlPassCommand', 46 | 535: 'LogicClaimTailRewardCommand', 47 | 536: 'LogicPurchaseBrawlpassProgressCommand', 48 | 537: 'LogicVanityItemSeenCommand', 49 | 538: LogicSelectEmoteCommand, 50 | 539: 'LogicBrawlPassAutoCollectWarningSeenCommand', 51 | 540: 'LogicPurchaseChallengeLivesCommand', 52 | 541: LogicClearESportsHubNotificationCommand, 53 | 542: 'LogicSelectGroupSkinCommand', 54 | 547: LogicEnableSkinRandomizerCommand, 55 | 1000: 'LogicDebugCommand' 56 | } -------------------------------------------------------------------------------- /Messaging/Packets/Client/Authentication/LoginMessage.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | from Logic.Client.ClientsManager import ClientsManager 4 | from Logic.Client.PlayerManager import Players 5 | from Database.DatabaseManager import DatabaseManager 6 | 7 | from Messaging.Packets.Server.Authentication.LoginOkMessage import LoginOkMessage 8 | from Messaging.Packets.Server.Home.OwnHomeDataMessage import OwnHomeDataMessage 9 | from Messaging.Packets.Server.Alliance.MyAllianceMessage import MyAllianceMessage 10 | 11 | from Logic.Data.DataManager import Reader 12 | 13 | 14 | class LoginMessage(Reader): 15 | def __init__(self, client, player: Players, header_bytes): 16 | super().__init__(header_bytes) 17 | self.client = client 18 | self.player = player 19 | self.encrypted = False 20 | 21 | 22 | def decode(self): 23 | try: 24 | self.player.HighID = self.readInt() 25 | self.player.LowID = self.readInt() 26 | self.player.Token = self.readString() 27 | 28 | self.player.device.major = self.readInt() 29 | self.player.device.minor = self.readInt() 30 | self.player.device.build = self.readInt() 31 | if self.player.device.major == 0: 32 | self.player.device.major = 39 33 | except: 34 | self.encrypted = True 35 | 36 | # self.FingerprintSha = self.readString() 37 | # 38 | # self.DeviceModel = self.readString() 39 | # self.IsAndroid = self.readBoolean() 40 | # self.Unknown = self.readBoolean() 41 | # self.DeviceLanguage = self.readString() 42 | # 43 | # self.OSVersion = self.readString() 44 | # 45 | # self.readInt() 46 | # self.readVint() 47 | # 48 | # self.OpenUDID = self.readString() 49 | # 50 | # self.readBoolean() 51 | # self.readInt() 52 | # 53 | # self.readInt() 54 | # self.readVint() 55 | # 56 | # self.AppVersion = self.readString() 57 | 58 | def process(self): 59 | if self.encrypted == False: 60 | self.db = DatabaseManager() 61 | try: 62 | self.AccountCreated = self.db.GetAllDb(self.player.LowID) 63 | if self.player.LowID in self.AccountCreated and self.player.LowID != 0: 64 | self.db.LoadAccount(self.player.LowID, self.player) 65 | else: 66 | data = Players.CreateAccount(Players, self.player.HighID, self.player.LowID, self.player.Token) 67 | self.db.createAccount(self.player.LowID, self.player.Token, data) 68 | except Exception: 69 | data = Players.CreateAccount(Players, self.player.HighID, self.player.LowID, self.player.Token) 70 | self.db.createAccount(self.player.LowID, self.player.Token, data) 71 | ClientsManager.AddSocket(self.player.LowID, self.client) 72 | 73 | if self.player.device.major == 39: 74 | LoginOkMessage(self.client, self.player).send(self.player.LowID, 2) 75 | OwnHomeDataMessage(self.client, self.player).send(self.player.LowID) 76 | MyAllianceMessage(self.client, self.player).send(self.player.LowID) 77 | 78 | else: 79 | print(f"Not supported version Detected: {self.player.device.major}.{self.player.device.build}.{self.player.device.minor}") -------------------------------------------------------------------------------- /Logic/Notifications/NotificationFactory.py: -------------------------------------------------------------------------------- 1 | from Logic.Notifications.BandNotification import BandNotification 2 | from Logic.Notifications.BaseNotification import BaseNotification 3 | from Logic.Notifications.BoxRewardNotification import BoxRewardNotification 4 | from Logic.Notifications.ChallengeRewardNotification import ChallengeRewardNotification 5 | from Logic.Notifications.FreeTextNotification import FreeTextNotification 6 | from Logic.Notifications.ProLeagueSeasonEndNotification import ProLeagueSeasonEndNotification 7 | from Logic.Notifications.PromoPopupNotification import PromoPopupNotification 8 | from Logic.Notifications.RankedMidSeasonRewardNotification import RankedMidSeasonRewardNotification 9 | from Logic.Notifications.RankedSeasonEndNotification import RankedSeasonEndNotification 10 | from Logic.Notifications.SkinRewardNotification import SkinRewardNotification 11 | from Logic.Notifications.StarPointsNotification import StarPointsNotification 12 | from Logic.Notifications.TicketCompensationNotification import TicketCompensationNotification 13 | from Logic.Notifications.VanityItemRewardNotification import VanityItemRewardNotification 14 | 15 | notificationId = { 16 | 2: 'DonateNotification', 17 | 63: ChallengeRewardNotification, 18 | 64: BoxRewardNotification, 19 | 66: 'FloaterTextNotification', 20 | 67: RankedMidSeasonRewardNotification, 21 | 68: RankedSeasonEndNotification, 22 | 69: 'BrawlPassAutoCollectSeasonNotification', 23 | 70: 'ChallengeRewardNotification', 24 | 71: 'BrawlPassPointRewardNotification', 25 | 72: VanityItemRewardNotification, 26 | 73: 'BrawlPassRewardNotification', 27 | 74: TicketCompensationNotification, 28 | 75: 'ChallengeSkinRewardNotification', 29 | 76: 'QualifyNotification', 30 | 77: ProLeagueSeasonEndNotification, 31 | 78: 'RankRewardNotification', 32 | 79: StarPointsNotification, 33 | 80: 'StarPointMigrationNotification', 34 | 81: FreeTextNotification, 35 | 82: BandNotification, 36 | 83: PromoPopupNotification, 37 | 84: 'StarPowerRewardNotification', 38 | 86: 'IAPDeliveryNotification', 39 | 87: 'NewsPopupNotification', 40 | 88: 'CoinDoublerRewardNotification', 41 | 89: 'GemRewardNotification', 42 | 90: 'ResourceRewardNotification', 43 | 91: 'TicketRewardNotification', 44 | 92: 'HeroPowerRewardNotification', 45 | 93: 'HeroRewardNotification', 46 | 94: SkinRewardNotification 47 | } 48 | 49 | class NotificationFactory: 50 | def decode(self, notificationID): 51 | if notificationID not in notificationId: 52 | raise NotImplementedError(f"Notification with id {notificationID} is not implemented.") 53 | elif type(notificationId[notificationID]) != str: 54 | notificationId[notificationID].decode(self) 55 | else: 56 | raise NotImplementedError(f"{notificationId[notificationID]} is not implemented.") 57 | 58 | def encode(self, info): 59 | notificationID = info[1]['ID'] 60 | if notificationID not in notificationId: 61 | BaseNotification.encode(self, info) 62 | raise NotImplementedError(f"Notification with id {notificationID} is not implemented.") 63 | elif type(notificationId[notificationID]) != str: 64 | self.writeVint(notificationID) 65 | notificationId[notificationID].encode(self, info) 66 | else: 67 | raise NotImplementedError(f"{notificationId[notificationID]} is not implemented.") 68 | 69 | -------------------------------------------------------------------------------- /Messaging/Packets/Server/Battle/BattleEndMessage.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Writer 2 | 3 | class BattleEndMessage(Writer): 4 | def __init__(self, client, player, playersList, info): 5 | super().__init__(client) 6 | self.id = 23456 7 | self.client = client 8 | self.player = player 9 | self.allPlayers = playersList 10 | self.info = info 11 | 12 | def encode(self): 13 | self.writeLong(0, 1) 14 | self.writeLong(0, 1) 15 | self.writeVint(1) # Battle End Game Mode 16 | self.writeVint(0) # Result (Victory/Defeat/Draw/Rank Score) 17 | self.writeVint(0) # Tokens Gained 18 | self.writeVint(1250) # Trophies Result 19 | self.writeVint(0) # Power Play Points Gained 20 | self.writeVint(0) # Doubled Tokens 21 | self.writeVint(0) # Double Token Event 22 | self.writeVint(0) # Token Doubler Remaining 23 | self.writeVint(0) # Special Events Level Passed 24 | self.writeVint(0) # Epic Win Power Play Points Gained 25 | self.writeVint(0) # Championship Level Reached 26 | self.writeBoolean(False) 27 | self.writeVint(0) 28 | self.writeVint(0) 29 | self.writeBoolean(False) 30 | self.writeVint(0) 31 | self.writeVint(0) 32 | self.writeVint(0) 33 | self.writeVint(0) 34 | self.writeVint(0) 35 | self.writeByte(16) 36 | self.writeVint(-1) 37 | self.writeBoolean(False) 38 | 39 | self.writeVint(len(self.allPlayers)) # Players 40 | 41 | for index,playerEntry in self.allPlayers.items(): 42 | if playerEntry["IsPlayer"] == True: 43 | self.writeByte(1) 44 | elif playerEntry["Unknown"] == 1: 45 | self.writeByte(4) 46 | else: 47 | self.writeByte(0) 48 | self.writeDataReference(playerEntry["BrawlerID"][0], playerEntry["BrawlerID"][1]) # BrawlerID 49 | self.writeDataReference(playerEntry["SkinID"][0], playerEntry["SkinID"][1]) # SkinID 50 | self.writeVint(1250) # Trophies 51 | self.writeVint(0) 52 | self.writeVint(10) # PowerLevel 53 | self.writeVint(0) 54 | self.writeBoolean(playerEntry["IsPlayer"]) 55 | if playerEntry["IsPlayer"] == True: 56 | self.writeLong(self.player.HighID, self.player.LowID) 57 | self.writeString(playerEntry["Name"]) # PlayerName 58 | self.writeVint(100) 59 | self.writeVint(28000000 + self.player.thumbnails) # PlayerThumbnail 60 | self.writeVint(43000000 + self.player.nameColor) # NameColor 61 | self.writeVint(-1) 62 | 63 | self.writeVint(0) 64 | 65 | self.writeVint(0) # XpEntry 66 | 67 | self.writeVint(0) 68 | 69 | self.writeVint(2) # LogicMilestoneProgress 70 | self.writeVint(1) 71 | self.writeVint(1250) 72 | self.writeVint(1250) 73 | self.writeVint(5) 74 | self.writeVint(9999999) 75 | self.writeVint(9999999) 76 | 77 | self.writeDataReference(28, self.player.thumbnails) 78 | 79 | self.writeBoolean(False) # PlayAgainStatus 80 | 81 | self.writeBoolean(False) # LogicQuests 82 | 83 | self.writeVint(0) 84 | self.writeVint(0) 85 | self.writeBoolean(False) # LogicRankedMatchRoundState 86 | self.writeVint(-1) 87 | self.writeBoolean(False) # ChronosTextEntry 88 | -------------------------------------------------------------------------------- /Database/DatabaseManager.py: -------------------------------------------------------------------------------- 1 | import json 2 | import sqlite3 3 | import traceback 4 | 5 | 6 | class DatabaseManager(): 7 | def __init__(self): 8 | self.conn = sqlite3.connect("player.sqlite") 9 | self.cursor = self.conn.cursor() 10 | try: 11 | self.cursor.execute("""CREATE TABLE main (LowID integer, Token text, Data json)""") 12 | except: 13 | pass 14 | 15 | def createAccount(self, lowID, token, data): 16 | try: 17 | self.cursor.execute("INSERT INTO main (LowID, Token, Data) VALUES (?, ?, ?)", 18 | (lowID, token, json.dumps(data, ensure_ascii=0))) 19 | self.conn.commit() 20 | except Exception: 21 | print(traceback.format_exc()) 22 | 23 | def GetAllDb(self, low_id): 24 | self.playersId = [] 25 | try: 26 | self.cursor.execute("SELECT * from main") 27 | self.db = self.cursor.fetchall() 28 | for i in range(len(self.db)): 29 | self.playersId.append(self.db[i][0]) 30 | return self.playersId 31 | except Exception: 32 | print(traceback.format_exc()) 33 | 34 | def getPlayerWithLowID(self, low): 35 | try: 36 | self.cursor.execute("SELECT * from main where LowID=?", (low,)) 37 | return self.cursor.fetchall() 38 | except Exception: 39 | print(traceback.format_exc()) 40 | 41 | def LoadAccount(self, low, player): 42 | try: 43 | self.player = player 44 | self.cursor.execute("SELECT * from main where LowID=?", (low,)) 45 | self.players = self.cursor.fetchall() 46 | self.players = json.loads(self.players[0][2]) 47 | self.player.Name = self.players['name'] 48 | self.player.isRegistred = self.players['IsRegistred'] 49 | self.player.level = self.players['level'] 50 | self.player.doNotDisturb = self.players['DoNotDisturb'] 51 | self.player.friends = self.players['friend'] 52 | self.player.highestTrophies = self.players['highestTrophies'] 53 | self.player.brawlerID = self.players['brawlerID'] 54 | self.player.skinID = self.players['skinID'] 55 | self.player.selectedSkin = self.players['selectedSkin'] 56 | self.player.brawlerState = self.players['brawlerState'] 57 | self.player.brawlersTrophies = self.players['brawlersTrophies'] 58 | self.player.selectedRandomSkin = self.players['selectedRandomSkin'] 59 | self.player.starpowerID = self.players['starpowerID'] 60 | self.player.thumbnails = self.players['playericon'] 61 | self.player.nameColor = self.players['namecolor'] 62 | self.player.trophies = self.players['trophies'] 63 | self.player.experience = self.players['experience'] 64 | self.player.room_id = self.players['gameroomID'] 65 | self.player.roomInfo = self.players['roomInfo'] 66 | self.player.alliance_id = self.players['allianceID'] 67 | self.player.isBanned = self.players['isBanned'] 68 | self.player.gems = self.players['gems'] 69 | self.player.coins = self.players['coins'] 70 | 71 | except Exception: 72 | print(traceback.format_exc()) 73 | 74 | def update_player_data(self, data, lowID): 75 | try: 76 | self.cursor.execute("UPDATE main SET Data=? WHERE LowID=?", (json.dumps(data, ensure_ascii=0), lowID)) 77 | self.conn.commit() 78 | except Exception: 79 | print(traceback.format_exc()) 80 | 81 | def getPlayerDB(self, token): 82 | try: 83 | self.cursor.execute("SELECT * from main where Token=?", (token,)) 84 | return self.cursor.fetchall() 85 | except Exception: 86 | print(traceback.format_exc()) 87 | -------------------------------------------------------------------------------- /Logic/Classes/LogicClientAvatar.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Writer 2 | from Logic.Data.DataManager import Reader 3 | 4 | class LogicClientAvatar: 5 | def decode(self: Reader): 6 | pass 7 | 8 | def encode(self: Writer): 9 | self.writeVLong(self.player.HighID, self.player.LowID) # PlayerID 10 | self.writeVLong(self.player.HighID, self.player.LowID) 11 | self.writeVLong(self.player.HighID, self.player.LowID) 12 | 13 | self.writeString(self.player.Name) # PlayerName 14 | self.writeBoolean(self.player.isRegistred) # isRegistred 15 | 16 | self.writeString() 17 | 18 | self.writeVint(15) # Commodity Count 19 | 20 | # Array 21 | brawlersUnlock = self.player.allBrawlersUnlock 22 | brawlers = self.player.allBrawlers 23 | brawlersCount = len(brawlers) 24 | 25 | # Unlocked Brawlers and Resources Array 26 | self.writeVint(4 + len(brawlersUnlock)) # Count 27 | for i in brawlersUnlock: 28 | self.writeDataReference(23, i) 29 | self.writeVint(1) 30 | 31 | 32 | self.writeDataReference(5, 1) 33 | self.writeVint(1) 34 | 35 | self.writeDataReference(5, 8) 36 | self.writeVint(self.player.coins) # Coins 37 | 38 | self.writeDataReference(5, 9) 39 | self.writeVint(3) 40 | 41 | self.writeDataReference(5, 10) 42 | self.writeVint(self.player.StarPoints) 43 | 44 | # Brawlers Trophies Array 45 | self.writeVint(brawlersCount) # Count 46 | for x in brawlers: 47 | self.writeDataReference(16, x) # Brawler ID 48 | self.writeVint(1250) 49 | # Brawlers Trophies Array End 50 | 51 | # Brawlers Trophies for Rank Array 52 | self.writeVint(brawlersCount) # Count 53 | for x in brawlers: 54 | self.writeDataReference(16, x) # Brawler ID 55 | self.writeVint(1250) 56 | # Brawlers Trophies for Rank Array End 57 | 58 | # Unknown Brawlers Array 59 | self.writeVint(0) # Count 60 | # Unknown Brawlers Array End 61 | 62 | # Brawlers Power Points Array 63 | self.writeVint(brawlersCount) # Count 64 | for x in brawlers: 65 | self.writeDataReference(16, x) # Brawler ID 66 | self.writeVint(1410) 67 | # Brawlers Power Points Array End 68 | 69 | # Brawlers Power Level Array 70 | self.writeVint(brawlersCount) # Count 71 | for x in brawlers: 72 | self.writeDataReference(16, x) # Brawler ID 73 | self.writeVint(8) 74 | # Brawlers Power Level Array End 75 | 76 | # Array 77 | allStarpowers = self.player.allStarpowers 78 | self.writeVint(len(allStarpowers)) # Count 79 | for x in allStarpowers: 80 | self.writeDataReference(23, x) # Cards ID 81 | self.writeVint(1) # Star Power Unlocked State 82 | # Brawlers Star Powers Array End 83 | 84 | # Array 85 | self.writeVint(len(self.player.brawlerState)) # HeroSeenState 86 | for i,v in self.player.brawlerState.items(): 87 | self.writeDataReference(16, int(i)) # Brawler ID 88 | self.writeVint(v) # 18 = randomSkin Activated 89 | 90 | # Array 91 | self.writeVint(0) 92 | 93 | # Array 94 | self.writeVint(0) 95 | 96 | # Array 97 | self.writeVint(0) 98 | 99 | # Array 100 | self.writeVint(0) 101 | 102 | # Array 103 | self.writeVint(0) 104 | 105 | # Array 106 | self.writeVint(0) 107 | 108 | # Array 109 | self.writeVint(0) 110 | 111 | self.writeVint(self.player.gems) # Diamonds 112 | self.writeVint(self.player.gems) # Free Diamonds 113 | self.writeVint(self.player.level) # Player Level 114 | self.writeVint(100) 115 | self.writeVint(0) # CumulativePurchasedDiamonds or Avatar User Level Tier | 10000 < Level Tier = 3 | 1000 < Level Tier = 2 | 0 < Level Tier = 1 116 | self.writeVint(0) # Battle Count 117 | self.writeVint(0) # WinCount 118 | self.writeVint(0) # LoseCount 119 | self.writeVint(0) # WinLooseStreak 120 | self.writeVint(0) # NpcWinCount 121 | self.writeVint(0) # NpcLoseCount 122 | self.writeVint(2) # TutorialState | shouldGoToFirstTutorialBattle = State == 0 123 | self.writeVint(0) -------------------------------------------------------------------------------- /Logic/Files/Classes/Cards.py: -------------------------------------------------------------------------------- 1 | import csv 2 | 3 | 4 | class Cards: 5 | 6 | def getStarpowersID(): 7 | CardSkillsID = [] 8 | with open('Logic/Files/assets/csv_logic/cards.csv') as csv_file: 9 | csv_reader = csv.reader(csv_file, delimiter=',') 10 | line_count = 0 11 | for row in csv_reader: 12 | if line_count == 0 or line_count == 1: 13 | line_count += 1 14 | else: 15 | if row[7] == '4' and row[4].lower() != "true" and row[5].lower() != "true": 16 | # print(line_count - 2, row[7], row[3], row[4], row[5]) 17 | CardSkillsID.append(line_count - 2) 18 | line_count += 1 19 | 20 | return CardSkillsID 21 | 22 | def get_spg_by_brawlerID(self, brawlerID, type): 23 | char_file = open('Logic/Files/assets/csv_logic/characters.csv') 24 | csv_reader = csv.reader(char_file, delimiter=',') 25 | line_count = 0 26 | 27 | for row in csv_reader: 28 | if line_count == 0 or line_count == 1: 29 | line_count += 1 30 | else: 31 | line_count += 1 32 | if line_count == brawlerID + 3: 33 | name = row[0] 34 | line_count += 1 35 | 36 | cards_file = open('Logic/Files/assets/csv_logic/cards.csv') 37 | csv_reader = csv.reader(cards_file, delimiter=',') 38 | line_count = 0 39 | 40 | for row in csv_reader: 41 | if line_count == 0 or line_count == 1: 42 | line_count += 1 43 | else: 44 | line_count += 1 45 | if type == 4: 46 | if row[6].lower() == '4' and row[3] == name: 47 | id = line_count - 3 48 | char_file.close() 49 | cards_file.close() 50 | return id 51 | 52 | elif type == 5: 53 | if row[3] == name and row[6].lower() == '5': 54 | id = line_count - 3 55 | char_file.close() 56 | cards_file.close() 57 | return id 58 | 59 | def get_unlocked_spg(self, brawlerID): 60 | char_file = open('Logic/Files/assets/csv_logic/characters.csv') 61 | csv_reader = csv.reader(char_file, delimiter=',') 62 | line_count = 0 63 | id = [] 64 | 65 | for row in csv_reader: 66 | if line_count == 0 or line_count == 1: 67 | line_count += 1 68 | else: 69 | line_count += 1 70 | if line_count == brawlerID + 3: 71 | name = row[0] 72 | line_count += 1 73 | 74 | cards_file = open('Logic/Files/assets/csv_logic/cards.csv') 75 | csv_reader = csv.reader(cards_file, delimiter=',') 76 | line_count = 0 77 | 78 | for row in csv_reader: 79 | if line_count == 0 or line_count == 1: 80 | line_count += 1 81 | else: 82 | line_count += 1 83 | if row[6].lower() == '4' and row[3] == name and row[4] != "true" or row[3] == name and row[6].lower() == '5' and row[4] != "true": 84 | print(row[0], line_count - 3) 85 | id.append(line_count - 3) 86 | 87 | char_file.close() 88 | cards_file.close() 89 | return id 90 | 91 | def getBrawlersUnlockID(): 92 | CardUnlockID = [] 93 | with open('Logic/Files/assets/csv_logic/cards.csv') as csv_file: 94 | csv_reader = csv.reader(csv_file, delimiter=',') 95 | line_count = 0 96 | for row in csv_reader: 97 | if line_count == 0 or line_count == 1: 98 | line_count += 1 99 | else: 100 | if row[7] == '0' and row[4].lower() != "true" and row[5].lower() != "true": 101 | (line_count - 2, row[7], row[3], row[4], row[5]) 102 | CardUnlockID.append(line_count - 2) 103 | line_count += 1 104 | 105 | return CardUnlockID 106 | -------------------------------------------------------------------------------- /Logic/Client/PlayerManager.py: -------------------------------------------------------------------------------- 1 | import random 2 | import string 3 | 4 | from Logic.Files.Classes.Cards import Cards 5 | from Logic.Files.Classes.Characters import Characters 6 | from Logic.Files.Classes.Locations import Locations 7 | from Logic.Files.Classes.PlayerThumbnails import PlayerThumbnails 8 | from Logic.Files.Classes.Skins import Skins 9 | from Logic.Files.Classes.Pins import Pins 10 | from Logic.Client import DevicesManager 11 | 12 | 13 | class Players: 14 | HighID = 0 15 | LowID = 0 16 | Token = "" 17 | Name = "Guest" 18 | isRegistred = False 19 | isBanned = False 20 | 21 | friends = [] 22 | 23 | trophies = 10000 24 | highestTrophies = 10000 25 | experience = 999999 26 | level = 500 27 | trophy_road_tier = 105 28 | coins = 9999999 29 | gems = 9999999 30 | tokens = 0 31 | StarTokens = 0 32 | StarPoints = 0 33 | 34 | thumbnails = 0 35 | nameColor = 0 36 | 37 | brawlerID = 0 38 | skinID = 0 39 | starpowerID = 76 40 | selectedSkin = {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 12: 0, 13: 0, 14: 0, 15: 0, 16: 0, 17: 0, 18: 0, 19: 0, 20: 0, 21: 0, 22: 0, 23: 0, 24: 0, 25: 0, 26: 0, 27: 0, 28: 0, 29: 0, 30: 0, 31: 0, 32: 0, 34: 0, 35: 0, 36: 0, 37: 0, 38: 0, 39: 0, 40: 0, 41: 0, 42: 0, 43: 0, 44: 0, 45: 0, 46: 0, 47: 0, 49: 0, 50: 0, 51: 0, 52: 0, 53: 0} 41 | selectedRandomSkin = [] 42 | brawlerState = {0: 2, 1: 2, 2: 2, 3: 2, 4: 2, 5: 2, 6: 2, 7: 2, 8: 2, 9: 2, 10: 2, 11: 2, 12: 2, 13: 2, 14: 2, 15: 2, 16: 2, 17: 2, 18: 2, 19: 2, 20: 2, 21: 2, 22: 2, 23: 2, 24: 2, 25: 2, 26: 2, 27: 2, 28: 2, 29: 2, 30: 2, 31: 2, 32: 2, 34: 2, 35: 2, 36: 2, 37: 2, 38: 2, 39: 2, 40: 2, 41: 2, 42: 2, 43: 2, 44: 2, 45: 2, 46: 2, 47: 2, 49: 2, 50: 2, 51: 2, 52: 2, 53: 2} 43 | brawlersTrophies = {0: 1250, 1: 1250, 2: 1250, 3: 1250, 4: 1250, 5: 1250, 6: 1250, 7: 1250, 8: 1250, 9: 1250, 10: 1250, 11: 1250, 12: 1250, 13: 1250, 14: 1250, 15: 1250, 16: 1250, 17: 1250, 18: 1250, 19: 1250, 20: 1250, 21: 1250, 22: 1250, 23: 1250, 24: 1250, 25: 1250, 26: 1250, 27: 1250, 28: 1250, 29: 1250, 30: 1250, 31: 1250, 32: 1250, 34: 1250, 35: 1250, 36: 1250, 37: 1250, 38: 1250, 39: 1250, 40: 1250, 41: 1250, 42: 1250, 43: 1250, 44: 1250, 45: 1250, 46: 1250, 47: 1250, 49: 1250, 50: 1250, 51: 1250, 52: 1250, 53: 1250} 44 | allSkins = Skins.getSkinsID() 45 | allMaps = [5, 7, 24] 46 | allBrawlers = Characters.getBrawlersID() 47 | allBrawlersUnlock = Cards.getBrawlersUnlockID() 48 | allStarpowers = Cards.getStarpowersID() 49 | allPins = Pins.getPinsID() 50 | allThumbnailsReward = PlayerThumbnails.getThumbnailsID() 51 | 52 | alliance_id = 0 53 | 54 | room_id = [0, 0] 55 | roomInfo = { 56 | "eventSlot": 0, 57 | "mapID": 0, 58 | "roomType": 0 59 | } 60 | 61 | doNotDisturb = False 62 | playerState = False 63 | lastOnline = 0 64 | 65 | device = DevicesManager.Device 66 | 67 | def CreateAccount(self, highid, lowid, token): 68 | if lowid == 0: 69 | self.HighID = int(''.join([str(random.randint(0, 9)) for _ in range(1)])) 70 | self.LowID = int(''.join([str(random.randint(0, 9)) for _ in range(8)])) 71 | self.Token = ''.join(random.choice(string.ascii_letters + string.digits) for i in range(40)) 72 | 73 | DBData = { 74 | 'HighID': self.HighID, 75 | 'LowID': self.LowID, 76 | 'Token': self.Token, 77 | 'name': self.Name, 78 | 'allianceID': self.alliance_id, 79 | 'PlayerState': self.playerState, 80 | 'LastOnline': self.lastOnline, 81 | 'DoNotDisturb': self.doNotDisturb, 82 | 'brawlerID': self.brawlerID, 83 | 'skinID': self.skinID, 84 | 'selectedSkin': self.selectedSkin, 85 | 'selectedRandomSkin': self.selectedRandomSkin, 86 | 'brawlersTrophies': self.brawlersTrophies, 87 | 'brawlerState': self.brawlerState, 88 | 'starpowerID': self.starpowerID, 89 | 'playericon': self.thumbnails, 90 | 'namecolor': self.nameColor, 91 | 'highestTrophies': self.highestTrophies, 92 | 'IsRegistred': self.isRegistred, 93 | 'trophies': self.trophies, 94 | 'experience': self.experience, 95 | 'level': self.level, 96 | 'gems': self.gems, 97 | 'coins': self.coins, 98 | 'isBanned': self.isBanned, 99 | 'gameroomID': self.room_id, 100 | "roomInfo": { 101 | "eventSlot": 0, 102 | "mapID": 0, 103 | "roomType": 0 104 | }, 105 | 'friend': self.friends 106 | } 107 | return DBData -------------------------------------------------------------------------------- /Logic/Files/assets/csv_logic/player_thumbnails.csv: -------------------------------------------------------------------------------- 1 | "Name","RequiredExpLevel","RequiredTotalTrophies","RequiredSeasonPoints","RequiredHero","IconSWF","IconExportName","SortOrder","IsReward" 2 | "string","int","int","int","string","string","string","int","boolean" 3 | "base1",1,0,,,"sc/ui.sc","player_icon_00",0, 4 | "base2",10,0,,,"sc/ui.sc","player_icon_01",1, 5 | "base3",20,0,,,"sc/ui.sc","player_icon_02",2, 6 | "hero1",0,0,,"ShotgunGirl","sc/ui.sc","player_icon_shelly",101, 7 | "hero2",0,0,,"Gunslinger","sc/ui.sc","player_icon_colt",103, 8 | "hero3",0,0,,"RocketGirl","sc/ui.sc","player_icon_brock",106, 9 | "hero4",0,0,,"Mechanic","sc/ui.sc","player_icon_jess",105, 10 | "hero5",0,0,,"Shaman","sc/ui.sc","player_icon_nita",102, 11 | "hero6",0,0,,"TntDude","sc/ui.sc","player_icon_mike",107, 12 | "hero7",0,0,,"Luchador","sc/ui.sc","player_icon_primo",201, 13 | "hero8",0,0,,"BullDude","sc/ui.sc","player_icon_bull",104, 14 | "hero9",0,0,,"TrickshotDude","sc/ui.sc","player_icon_rick",301, 15 | "hero10",0,0,,"Barkeep","sc/ui.sc","player_icon_barley",202, 16 | "hero11",0,0,,"DeadMariachi","sc/ui.sc","player_icon_poco",203, 17 | "hero12",0,0,,"Undertaker","sc/ui.sc","player_icon_mortis",501, 18 | "hero13",0,0,,"BowDude","sc/ui.sc","player_icon_bo",108, 19 | "hero14",0,0,,"Cactus","sc/ui.sc","player_icon_spike",601, 20 | "hero15",0,0,,"Crow","sc/ui.sc","player_icon_crow",602, 21 | "hero16",0,0,,"Sniper","sc/ui.sc","player_icon_piper",401, 22 | "base4",40,0,,,"sc/ui.sc","player_icon_03",3, 23 | "base5",60,0,,,"sc/ui.sc","player_icon_04",4, 24 | "base6",80,0,,,"sc/ui.sc","player_icon_05",5, 25 | "base7",100,0,,,"sc/ui.sc","player_icon_06",6, 26 | "base8",120,0,,,"sc/ui.sc","player_icon_07",7, 27 | "trophy1",0,500,,,"sc/ui.sc","player_icon_trophy_00",8, 28 | "trophy2",0,1000,,,"sc/ui.sc","player_icon_trophy_01",9, 29 | "trophy3",0,2000,,,"sc/ui.sc","player_icon_trophy_02",10, 30 | "trophy4",0,3000,,,"sc/ui.sc","player_icon_trophy_03",11, 31 | "hero17",0,0,,"MinigunDude","sc/ui.sc","player_icon_mj",402, 32 | "hero18",0,0,,"BlackHole","sc/ui.sc","player_icon_taro",502, 33 | "trophy5",0,5000,,,"sc/ui.sc","player_icon_elite_00",12, 34 | "trophy6",0,7000,,,"sc/ui.sc","player_icon_elite_01",13, 35 | "trophy7",0,10000,,,"sc/ui.sc","player_icon_elite_02",14, 36 | "trophy8",0,13000,,,"sc/ui.sc","player_icon_elite_03",15, 37 | "hero19",0,0,,"BarrelBot","sc/ui.sc","player_icon_barrelbot",302, 38 | "hero20",0,0,,"ArtilleryDude","sc/ui.sc","player_icon_penny",303, 39 | "hero21",0,0,,"HammerDude","sc/ui.sc","player_icon_frank",403, 40 | "hero22",0,0,,"Ninja","sc/ui.sc","player_icon_leon",603, 41 | "hero23",0,0,,"HookDude","sc/ui.sc","player_icon_gene",503, 42 | "hero24",0,0,,"Whirlwind","sc/ui.sc","player_icon_carl",304, 43 | "hero25",0,0,,"Rosa","sc/ui.sc","player_icon_rosa",204, 44 | "hero26",0,0,,"Baseball","sc/ui.sc","player_icon_bibi",404, 45 | "hero27",0,0,,"ClusterBombDude","sc/ui.sc","player_icon_tick",109, 46 | "hero28",0,0,,"Arcade","sc/ui.sc","player_icon_8bit",110, 47 | "hero29",0,0,,"Sandstorm","sc/ui.sc","player_icon_sandy",604, 48 | "hero30",0,0,,"Mummy","sc/ui.sc","player_icon_emz",111, 49 | "hero31",0,0,,"BeeSniper","sc/ui.sc","player_icon_bea",405, 50 | "hero32",0,0,,"Speedy","sc/ui.sc","player_icon_max",504, 51 | "hero33",0,0,,"SpawnerDude","sc/ui.sc","player_icon_mrp",505, 52 | "hero34",0,0,,"Driller","sc/ui.sc","player_icon_jacky",305, 53 | "hero35",0,0,,"Wally","sc/ui.sc","player_icon_sprout",506, 54 | "hero36",0,0,,"Blower","sc/ui.sc","player_icon_gale",701, 55 | "hero37",0,0,,"Controller","sc/ui.sc","player_icon_nani",406, 56 | "hero38",0,0,,"PowerLeveler","sc/ui.sc","player_icon_surge",702, 57 | "hero39",0,0,,"Percenter","sc/ui.sc","player_icon_colette",703, 58 | "hero40",0,0,,"FireDude","sc/ui.sc","player_icon_amber",605, 59 | "hero41",0,0,,"IceDude","sc/ui.sc","player_icon_lou",704, 60 | "hero42",0,0,,"SnakeOil","sc/ui.sc","player_icon_byron",507, 61 | "hero43",0,0,,"Enrager","sc/ui.sc","player_icon_edgar",407, 62 | "hero44",0,0,,"Ruffs","sc/ui.sc","player_icon_ruffs",705, 63 | "rank01",0,0,,,"sc/ui.sc","player_icon_starrforce_01",1000,"true" 64 | "rank02",0,0,,,"sc/ui.sc","player_icon_starrforce_02",1001,"true" 65 | "hero45",0,0,,"Roller","sc/ui.sc","player_icon_stu",112, 66 | "rank03",0,0,,,"sc/ui.sc","player_icon_actionshow_01",1002,"true" 67 | "rank04",0,0,,,"sc/ui.sc","player_icon_actionshow_02",1003,"true" 68 | "hero46",0,0,,"ElectroSniper","sc/ui.sc","player_icon_belle",706, 69 | "hero47",0,0,,"StickyBomb","sc/ui.sc","player_icon_squeak",508, 70 | "hero48",0,0,,"RopeDude","sc/ui.sc","player_icon_buzz",707, 71 | "hero49",0,0,,"AssaultShotgun","sc/ui.sc","player_icon_griff",408, 72 | "rank05",0,0,,,"sc/ui.sc","player_icon_velocirapids_01",1004,"true" 73 | "rank06",0,0,,,"sc/ui.sc","player_icon_velocirapids_02",1005,"true" 74 | "hero50",0,0,,"Knight","sc/ui.sc","player_icon_ash",708, 75 | "rank07",0,0,,,"sc/ui.sc","player_icon_ft_01",1006,"true" 76 | "rank08",0,0,,,"sc/ui.sc","player_icon_ft_02",1007,"true" 77 | "hero51",0,0,,"MechaDude","sc/ui.sc","player_icon_meg",606, 78 | "hero52",0,0,,"Duplicator","sc/ui.sc","player_icon_lolla",709, 79 | "rank09",0,0,,,"sc/ui.sc","player_icon_bw_01",1008,"true" 80 | "rank10",0,0,,,"sc/ui.sc","player_icon_bw_02",1009,"true" 81 | -------------------------------------------------------------------------------- /Logic/Classes/LogicConfData.py: -------------------------------------------------------------------------------- 1 | from Logic.Data.DataManager import Reader 2 | from Logic.Data.DataManager import Writer 3 | 4 | 5 | class LogicConfData: 6 | def decode(self: Reader): 7 | pass 8 | 9 | def encode(self: Writer): 10 | self.writeVint(0) 11 | 12 | # Event Slots IDs Array 13 | self.writeVint(22) # Count 14 | self.writeVint(1) # Gem Grab 15 | self.writeVint(2) # Showdown 16 | self.writeVint(3) # Daily Events 17 | self.writeVint(4) # Team Events 18 | self.writeVint(5) # Duo Showdown 19 | self.writeVint(6) # Team Events 2 20 | self.writeVint(7) # Special Events 21 | self.writeVint(8) # Solo Events 22 | self.writeVint(9) # Power Play 23 | self.writeVint(10) # Seasonal Events 24 | self.writeVint(11) # Seasonal Events 2 25 | self.writeVint(12) # Candidates of The Day 26 | self.writeVint(13) # Winner of The Day 27 | self.writeVint(14) # Solo Mode Power League 28 | self.writeVint(15) # Team Mode Power League 29 | self.writeVint(16) # Club league 30 | self.writeVint(17) # Club league 31 | self.writeVint(20) # Championship Challenge (Stage 1) 32 | self.writeVint(21) # Championship Challenge (Stage 2) 33 | self.writeVint(22) # Championship Challenge (Stage 3) 34 | self.writeVint(23) # Championship Challenge (Stage 4) 35 | self.writeVint(24) # Championship Challenge (Stage 5) 36 | # Event Slots IDs Array End 37 | 38 | self.writeVint(len(self.player.allMaps)) # Events Count 39 | 40 | eventIndex = 1 41 | for i in self.player.allMaps: 42 | self.writeVint(0) 43 | self.writeVint(eventIndex) # EventType 44 | self.writeVint(0) # EventsBeginCountdown 45 | self.writeVint(99999) # Timer 46 | self.writeVint(0) # tokens reward for new event 47 | self.writeDataReference(15, i) # MapID 48 | self.writeVint(-64) # GameModeVariation 49 | self.writeVint(2) # State 50 | self.writeString() 51 | self.writeVint(0) 52 | self.writeVint(0) 53 | self.writeVint(0) 54 | self.writeVint(0) # Modifiers 55 | self.writeVint(0) 56 | self.writeVint(0) 57 | self.writeBoolean(False) # Map Maker Map Structure Array 58 | self.writeVint(0) 59 | self.writeBoolean(False) # Power League Data Array 60 | self.writeVint(0) 61 | self.writeVint(0) 62 | self.writeVint(0) # ChronosTextEntry 63 | self.writeVint(-64) 64 | self.writeBoolean(False) 65 | eventIndex += 1 66 | 67 | self.writeVint(0) # Coming Up Events Count 68 | 69 | self.writeVint(8) # Brawler Upgrade Cost 70 | self.writeVint(20) 71 | self.writeVint(35) 72 | self.writeVint(75) 73 | self.writeVint(140) 74 | self.writeVint(290) 75 | self.writeVint(480) 76 | self.writeVint(800) 77 | self.writeVint(1250) 78 | 79 | self.writeVint(4) # Shop Coins Price 80 | self.writeVint(20) 81 | self.writeVint(50) 82 | self.writeVint(140) 83 | self.writeVint(280) 84 | 85 | self.writeVint(4) # Shop Coins Amount 86 | self.writeVint(150) 87 | self.writeVint(400) 88 | self.writeVint(1200) 89 | self.writeVint(2600) 90 | 91 | self.writeBoolean(True) # Show Offers Packs 92 | 93 | self.writeVint(0) # Release Entry 94 | 95 | self.writeVint(18) # IntValueEntry 96 | 97 | self.writeLong(10008, 501) 98 | self.writeLong(65, 2) 99 | self.writeLong(1, 41000034) # ThemeID 100 | self.writeLong(60, 36270) 101 | self.writeLong(66, 1) 102 | self.writeLong(61, 36270) # SupportDisabled State | if 36218 < state its true 103 | self.writeLong(47, 41381) 104 | self.writeLong(29, 10) # Skin Group Active For Campaign 105 | self.writeLong(48, 41381) 106 | self.writeLong(50, 0) # Coming up quests placeholder 107 | self.writeLong(1100, 500) 108 | self.writeLong(1003, 1) 109 | self.writeLong(36, 0) 110 | self.writeLong(14, 0) # Double Token Event 111 | self.writeLong(79, 149999) 112 | self.writeLong(80, 160000) 113 | self.writeLong(28, 4) 114 | self.writeLong(74, 1) 115 | 116 | self.writeVint(3) # Timed Int Value Entry 117 | 118 | self.writeVint(14) 119 | self.writeVint(1) 120 | self.writeVint(0) 121 | self.writeVint(739760) # Time left 122 | 123 | self.writeVint(29) 124 | self.writeVint(7) 125 | self.writeVint(0) 126 | self.writeVint(746960) # Time left 127 | 128 | self.writeVint(29) 129 | self.writeVint(10) 130 | self.writeVint(0) 131 | self.writeVint(1330340) # Time left 132 | 133 | self.writeVint(0) # Custom Event 134 | 135 | self.writeVint(0) 136 | 137 | self.writeVint(0) 138 | 139 | self.writeVint(0) -------------------------------------------------------------------------------- /Logic/Classes/LogicDailyData.py: -------------------------------------------------------------------------------- 1 | from Logic.Helpers.ForcedDrops import ForcedDrops 2 | from Logic.Data.DataManager import Writer 3 | 4 | 5 | class LogicDailyData: 6 | def encode(self: Writer): 7 | self.writeVint(0) 8 | self.writeVint(0) 9 | self.writeVint(self.player.trophies) 10 | self.writeVint(self.player.highestTrophies) 11 | self.writeVint(self.player.highestTrophies) 12 | self.writeVint(self.player.trophy_road_tier) 13 | self.writeVint(self.player.experience) 14 | self.writeDataReference(28, self.player.thumbnails) 15 | self.writeDataReference(43, self.player.nameColor) 16 | 17 | # Array 18 | self.writeVint(0) 19 | 20 | # Selected Skins 21 | skinsList = [] 22 | for v in self.player.selectedSkin.values(): 23 | if v != 0: 24 | skinsList.append(v) 25 | 26 | self.writeVint(len(skinsList)) 27 | for v in skinsList: 28 | self.writeDataReference(29, v) # SkinID 29 | 30 | # Skin Selected For Random Skin 31 | self.writeVint(len(self.player.allSkins)) 32 | for i in self.player.allSkins: 33 | self.writeDataReference(29, i) 34 | 35 | # Current Random Skin 36 | self.writeVint(0) 37 | for i in range(0): 38 | self.writeDataReference(29, 0) # SkinID 39 | 40 | # Selected Group Skin 41 | self.writeVint(1) # Skin Count 42 | for i in range(1): 43 | self.writeVint(1) # Group Index 44 | self.writeDataReference(29, 18) # SkinID 45 | 46 | # Unlocked Skin 47 | # self.writeVint(len(self.player.allSkins)) 48 | self.writeVint(0) 49 | # for i in self.player.allSkins: 50 | # self.writeDataReference(29, i) 51 | 52 | # Unlocked Skin Purchase Option 53 | self.writeVint(1) 54 | for i in range(1): 55 | self.writeDataReference(29, 357) # SkinID 56 | 57 | # New Item 58 | self.writeVint(0) 59 | for i in range(0): 60 | self.writeDataReference(23, 0) # ItemID 61 | 62 | self.writeVint(0) # Leaderboard Region | 0 = Global, 1 = Asia 63 | self.writeVint(self.player.highestTrophies) # Trophy Road Highest Trophies 64 | self.writeVint(0) 65 | self.writeVint(1) 66 | self.writeBoolean(True) 67 | self.writeVint(999999) # Tokens Doubler 68 | self.writeVint(0) 69 | self.writeVint(0) 70 | self.writeVint(0) 71 | 72 | ForcedDrops.encode(self) 73 | 74 | self.writeByte(4) # Shop Token Doubler 75 | self.writeVint(2) # Token Doubler New Tag State 76 | self.writeVint(2) # Event Tickets New Tag State 77 | self.writeVint(2) # Coin Packs New Tag State 78 | self.writeVint(0) # Change Name Cost 79 | self.writeVint(0) # Timer For the Next Name Change 80 | 81 | self.writeVint(0) # Shop Offers 82 | 83 | self.writeVint(0) # Array 84 | 85 | self.writeVint(200) # Available tokens from battles 86 | self.writeVint(-64) # Timer for new tokens 87 | 88 | self.writeVint(0) 89 | 90 | self.writeVint(0) 91 | self.writeVint(0) 92 | self.writeDataReference(16, self.player.brawlerID) 93 | self.writeString('CA') 94 | self.writeString("Project BSDS") 95 | 96 | self.writeVint(17) 97 | self.writeLong(3, 0) # TokensGained 98 | self.writeLong(4, 0) # TrophiesGained 99 | self.writeLong(6, 0) # DemoAccount 100 | self.writeLong(7, 0) # InvitesBlocked 101 | self.writeLong(8, 0) # StarPointsGained 102 | self.writeLong(9, 1) # ShowStarPoints 103 | self.writeLong(10, 0) # PowerPlayTrophiesGained 104 | self.writeLong(12, 1) # Unknown 105 | self.writeLong(14, 0) # CoinsGained 106 | self.writeLong(15, 0) # AgeScreen | 3 = underage (disable social media) | 1 = age popup 107 | self.writeLong(16, 1) # AgeScreen | 3 = underage (disable social media) | 1 = age popup 108 | self.writeLong(17, 1) # TeamChatMuted 109 | self.writeLong(18, 1) # EsportButton 110 | self.writeLong(19, 1) # ChampionShipLivesBuyPopup 111 | self.writeLong(20, 0) # GemsGained 112 | self.writeLong(21, 1) # LookingForTeamState 113 | self.writeLong(22, 1) 114 | 115 | self.writeVint(0) 116 | 117 | self.writeVint(9) # Brawlpass 118 | for i in range(9): 119 | self.writeVint(i) 120 | if i != 0: 121 | self.writeVint(34500) 122 | else: 123 | self.writeVint(29000) 124 | self.writeBoolean(True) 125 | self.writeVint(0) 126 | 127 | self.writeByte(2) 128 | self.writeInt(4294967292) 129 | self.writeInt(4294967295) 130 | self.writeInt(511) 131 | self.writeInt(0) 132 | 133 | self.writeByte(1) 134 | self.writeInt(4294967292) 135 | self.writeInt(4294967295) 136 | self.writeInt(511) 137 | self.writeInt(0) 138 | 139 | self.writeVint(0) 140 | 141 | self.writeBoolean(True) # Quest 142 | self.writeVint(0) 143 | 144 | self.writeBoolean(True) 145 | self.writeVint(len(self.player.allPins) + len(self.player.allThumbnailsReward)) # Vanity Count 146 | for i in self.player.allPins: 147 | self.writeDataReference(52, i) 148 | self.writeVint(1) 149 | for i in range(1): 150 | self.writeVint(1) 151 | self.writeVint(1) 152 | 153 | for i in self.player.allThumbnailsReward: 154 | self.writeDataReference(28, i) 155 | self.writeVint(1) 156 | for i in range(1): 157 | self.writeVint(1) 158 | self.writeVint(1) 159 | 160 | 161 | self.writeBoolean(False) 162 | 163 | self.writeInt(0) -------------------------------------------------------------------------------- /Logic/Files/Classes/Skins.py: -------------------------------------------------------------------------------- 1 | import csv 2 | 3 | 4 | class Skins: 5 | 6 | def getSkinsID(): 7 | 8 | SkinsID = [] 9 | 10 | with open('Logic/Files/assets/csv_logic/skins.csv') as csv_file: 11 | csv_reader = csv.reader(csv_file, delimiter=',') 12 | line_count = 0 13 | for row in csv_reader: 14 | 15 | if line_count == 0 or line_count == 1: 16 | line_count += 1 17 | else: 18 | if row[2].lower() != "true": 19 | (line_count - 2) 20 | SkinsID.append(line_count - 2) 21 | if row[0] != "": 22 | line_count += 1 23 | 24 | return SkinsID 25 | 26 | def getBrawlerBySkin(self, skinID): 27 | with open('Logic/Files/assets/csv_logic/skins.csv') as csv_file: 28 | csv_reader = csv.reader(csv_file, delimiter=',') 29 | line_count = 0 30 | for row in csv_reader: 31 | 32 | if line_count == 0 or line_count == 1: 33 | line_count += 1 34 | else: 35 | if line_count - 2 == skinID: 36 | confName = row[1] 37 | with open('Logic/Files/assets/csv_logic/skin_confs.csv') as csv_file: 38 | csv_reader = csv.reader(csv_file, delimiter=',') 39 | line_count2 = 0 40 | for row2 in csv_reader: 41 | 42 | if line_count2 == 0 or line_count2 == 1: 43 | line_count2 += 1 44 | else: 45 | if row2[0] == confName: 46 | brawlerName = row2[1] 47 | with open('Logic/Files/assets/csv_logic/characters.csv') as csv_file: 48 | csv_reader = csv.reader(csv_file, delimiter=',') 49 | line_count3 = 0 50 | for row3 in csv_reader: 51 | if line_count3 == 0 or line_count3 == 1: 52 | line_count3 += 1 53 | else: 54 | if row3[0] == brawlerName: 55 | return line_count3 - 2 56 | if row3[0] != "": 57 | line_count3 += 1 58 | if row2[0] != "": 59 | line_count2 += 1 60 | if row[0] != "": 61 | line_count += 1 62 | 63 | def getSkinInfoByID(id): 64 | with open('Logic/Files/assets/csv_logic/skins.csv') as csv_file: 65 | csv_reader = csv.reader(csv_file, delimiter=',') 66 | line_count = 0 67 | for row in csv_reader: 68 | 69 | if line_count == 0 or line_count == 1: 70 | line_count += 1 71 | else: 72 | if line_count - 2 == id: 73 | formatedRow = [] 74 | formatedRow.append(line_count - 2) 75 | for i in row: 76 | if i != '': 77 | formatedRow.append(i) 78 | print(formatedRow) 79 | break 80 | line_count += 1 81 | 82 | def getSkinsForBrawler(name): 83 | name = name + '_' 84 | with open('Logic/Files/assets/csv_logic/skins.csv') as csv_file: 85 | csv_reader = csv.reader(csv_file, delimiter=',') 86 | line_count = 0 87 | for row in csv_reader: 88 | 89 | if line_count == 0 or line_count == 1: 90 | line_count += 1 91 | else: 92 | if row[2].lower() != "true" and row[20].startswith(name.lower()): 93 | formatedRow = [] 94 | formatedRow.append(line_count - 2) 95 | for i in row: 96 | if i != '': 97 | formatedRow.append(i) 98 | print(formatedRow) 99 | line_count += 1 100 | 101 | def getSkinInfoByName(name): 102 | with open('Logic/Files/assets/csv_logic/skins.csv') as csv_file: 103 | csv_reader = csv.reader(csv_file, delimiter=',') 104 | line_count = 0 105 | for row in csv_reader: 106 | 107 | if line_count == 0 or line_count == 1: 108 | line_count += 1 109 | else: 110 | if row[0] == name: 111 | formatedRow = [] 112 | formatedRow.append(line_count - 2) 113 | for i in row: 114 | if i != '': 115 | formatedRow.append(i) 116 | print(formatedRow) 117 | break 118 | line_count += 1 119 | 120 | def getSkinsInfo(): 121 | with open('Logic/Files/assets/csv_logic/skins.csv') as csv_file: 122 | csv_reader = csv.reader(csv_file, delimiter=',') 123 | line_count = 0 124 | for row in csv_reader: 125 | 126 | if line_count == 0 or line_count == 1: 127 | line_count += 1 128 | else: 129 | formatedRow = [] 130 | formatedRow.append(line_count - 2) 131 | for i in row: 132 | if i != '': 133 | formatedRow.append(i) 134 | print(formatedRow) 135 | line_count += 1 136 | -------------------------------------------------------------------------------- /Logic/Files/assets/csv_logic/game_mode_variations.csv: -------------------------------------------------------------------------------- 1 | "Name","Variation","Disabled","ShortName","TID","ChatSuggestionItemName","GameModeRoomIconName","GameModeIconName","BannerOverrideSWF","BannerOverrideExportName","SquareBannerOverrideSWF","SquareBannerOverrideExportName","ScoreSfx","OpponentScoreSfx","ScoreText","ScoreOpponentText","ScoreTextEnd","ScoreOpponentTextEnd","FriendlyMenuOrder","IntroText","IntroDescText","IntroDescText2","StartNotification","EndNotification","Color","BgColor","FallbackPlayerMapEnvironment","TeamEntryItemName","PanelTeamOnlineName" 2 | "string","int","Boolean","String","string","string","string","string","string","string","string","string","string","string","string","string","string","string","int","string","string","string","String","String","string","string","string","string","string" 3 | "GemGrab",0,,"GemGrab","TID_GAME_MODE_0","chat_letsplay_gemgrab","event_gameroom_gemgrab","event_icon_gemgrab",,,,"event_gemgrab_banner_square",,,,,,,1,"TID_GAME_MODE_0","TID_COIN_RUSH_INTRO_TEXT",,"CoinRushStart",,"0xffd852ff","0xff9A3DF3","MineEnvironment","event_teamentry_gemgrab","panel_team_online_gemgrab" 4 | "Deleted1",1,"TRUE","Del1",,,,"event_icon_gemgrab",,,,,,,,,,,,,,,,,,,,, 5 | "Heist",2,,"Heist","TID_GAME_MODE_2","chat_letsplay_heist","event_gameroom_heist","event_icon_heist",,,,"event_heist_banner_square",,,,,,,3,"TID_GAME_MODE_2","TID_ATTACK_DEFEND_INTRO_TEXT_ATTACK","TID_ATTACK_DEFEND_INTRO_TEXT_DEFEND","AttackDefendStart",,"0xffd852ff","0xff9A3DF3","DefaultEnvironment","event_teamentry_heist","panel_team_online_heist" 6 | "Bounty",3,,"Bounty","TID_GAME_MODE_3","chat_letsplay_wanted","event_gameroom_wanted","event_icon_wanted",,,,"event_wanted_banner_square",,,,,,,4,"TID_GAME_MODE_3","TID_BOUNTY_HUNTER_INTRO_TEXT",,"BountyStart",,"0xff24d6ff","0xff00CFFF","DefaultEnvironment","event_teamentry_wanted","panel_team_online_wanted" 7 | "Deleted2",4,"TRUE","Del 2",,,,"event_icon_gemgrab",,,,,,,,,,,,,,,,,,,,, 8 | "BrawlBall",5,,"BrawlBall","TID_GAME_MODE_5","chat_letsplay_brawlball","event_gameroom_brawlball","event_icon_brawlball",,,,"event_brawlball_banner_square","Brawlbawl_goal","Brawlbawl_other_goal","TID_GOAL","TID_GOAL","TID_GOAL_MATCH_OVER","TID_GOAL_MATCH_OVER",5,"TID_GAME_MODE_5","TID_LASER_BALL_INTRO_TEXT",,"LaserBallStart",,"0xff9ab1fd","0xff8CA0E0","GrassfieldEnvironment","event_teamentry_brawlball","panel_team_online_brawlball" 9 | "Showdown",6,,"Solo SD","TID_GAME_MODE_6","chat_letsplay_survival","event_gameroom_survival","event_icon_survival",,,,,,,,,,,2,"TID_GAME_MODE_6","TID_BATTLE_ROYALE_INTRO_TEXT",,"BRStart",,"0xff91e136","0xff81D621","DefaultEnvironment","event_teamentry_survival","panel_team_online_survival" 10 | "BigGame",7,,"BigGame","TID_GAME_MODE_7","chat_letsplay_bossmode","event_gameroom_bossmode","event_icon_bossmode","sc/events.sc","event_boss_banner","sc/events.sc","event_boss_banner_square",,,,,,,10,"TID_GAME_MODE_7","TID_BOSS_INTRO_TEXT_ATTACK","TID_BOSS_INTRO_TEXT_DEFEND","BossStart",,"0xffff6847","0xffDC2423",,"event_teamentry_bossmode","panel_team_online_bossmode" 11 | "RoboRumble",8,,"RoboR","TID_GAME_MODE_8","chat_letsplay_coop","event_gameroom_coop","event_icon_coop","sc/ui.sc","event_coop_banner","sc/events.sc","event_coop_banner_square",,,,,,,11,"TID_GAME_MODE_8","TID_COOP_INTRO_TEXT",,"CoopStart",,"0xffff6847","0xffDC2423",,"event_teamentry_coop","panel_team_online_coop" 12 | "DuoShowdown",9,,"Duo SD","TID_GAME_MODE_9","chat_letsplay_teamsurvival","event_gameroom_teamsurvival","event_icon_teamsurvival",,,,"event_teamsurvival_banner_square",,,,,,,,"TID_GAME_MODE_9","TID_BATTLE_ROYALE_TEAM_INTRO_TEXT",,,,"0xff91e136","0xff81D621","DefaultEnvironment","event_teamentry_teamsurvival","panel_team_online_teamsurvival" 13 | "BossFight",10,,"BossF","TID_GAME_MODE_10","chat_letsplay_raid","event_gameroom_raid","event_icon_raid","sc/ui.sc","event_raid_banner","sc/events.sc","event_raid_banner_square",,,,,,,12,"TID_GAME_MODE_10","TID_RAID_BOSS_INTRO_TEXT",,"RaidBossStart",,"0xffff6847","0xffDC2423",,"event_teamentry_raid","panel_team_online_raid" 14 | "Siege",11,,"Siege","TID_GAME_MODE_11","chat_letsplay_robowars","event_gameroom_robowars","event_icon_robowars","sc/events.sc","event_robowars_banner",,"event_robowars_banner_square",,,,,,,7,"TID_GAME_MODE_11","TID_ROBO_WARS_INTRO_TEXT",,"RoboWarsStart",,"0xffff6847","0xffF05031","ScrapyardEnvironment","event_teamentry_robowars","panel_team_online_robowars" 15 | "Tutorial",12,,"Tutorial",,,,"event_icon_gemgrab",,,,,,,,,,,,,,,,,,,,, 16 | "Training",13,,"Training",,,,"event_icon_gemgrab",,,,,,,,,,,,,,,,,,,,, 17 | "Takedown",14,"TRUE","TakeD","TID_GAME_MODE_14","chat_letsplay_takedown","event_gameroom_takedown","event_icon_takedown","sc/events.sc","event_takedown_banner","sc/events.sc","event_takedown_banner_square",,,,,,,8,"TID_GAME_MODE_14","TID_BOSS_RACE_INTRO_TEXT",,"TakedownStart",,"0xff3891ff","0xffB606B0",,"event_teamentry_takedown","panel_team_online_takedown" 18 | "LoneStar",15,"TRUE","LoneS","TID_GAME_MODE_15","chat_letsplay_lone_star","event_gameroom_lonestar","event_icon_lone_star","sc/events.sc","event_lone_star_banner","sc/events.sc","event_lone_star_banner_square",,,,,,,9,"TID_GAME_MODE_15","TID_BOUNTY_HUNTER_INTRO_TEXT",,"LoneStarStart",,"0xffe24e5a","0xff56CDEA",,"event_teamentry_lonestar","panel_team_online_lonestar" 19 | "CTF",16,,"PresentP","TID_GAME_MODE_16","chat_letsplay_trophy_thieves","event_gameroom_trophy_thieves","event_icon_trophy_thieves","sc/events.sc","event_trophythieves_banner","sc/events.sc","event_trophythieves_banner_square","Brawl_xmas_flag_win","Brawl_xmas_flag_lose","TID_CTF_GOAL","TID_CTF_GOAL","TID_CTF_GOAL_MATCH_OVER","TID_CTF_GOAL_MATCH_OVER",6,"TID_GAME_MODE_16","TID_CTF_INTRO_TEXT",,"CTFStart",,"0xff2ef3e0","0xff00DA48",,"event_teamentry_trophy_thieves","panel_team_online_trophy_thieves" 20 | "KingOfHill",17,,"HotZone","TID_GAME_MODE_17","chat_letsplay_king_of_hill","event_gameroom_king_of_hill","event_icon_king_of_hill",,,,"event_king_of_hill_banner_square",,,,,,,13,"TID_GAME_MODE_17","TID_KING_OF_HILL_INTRO_TEXT",,"KOHStart",,"0xffff4343","0xffE33B50","ArcadeEnvironment","event_teamentry_king_of_hill","panel_team_online_king_of_hill" 21 | "BossFight_TownCrush",18,,"Rampage","TID_GAME_MODE_18","chat_letsplay_rampage","event_gameroom_rampage","event_icon_rampage","sc/ui.sc","event_rampage_banner","sc/events.sc","event_rampage_banner_square",,,,,,,14,"TID_GAME_MODE_18","TID_RAID_BOSS_INTRO_TEXT",,"TownCrusherStart",,"0xffff6847","0xffDC2423",,"event_teamentry_rampage","panel_team_online_rampage" 22 | "ProtectKing",19,"TRUE","ProtectKing","TID_GAME_MODE_19","chat_letsplay_heist","event_gameroom_heist","event_icon_heist",,,,"event_heist_banner_square",,,,,,,3,"TID_GAME_MODE_19","TID_PROTECT_KING_INTRO_TEXT",,"AttackDefendStart",,"0xffd852ff","0xff9A3DF3",,"event_teamentry_heist","panel_team_online_heist" 23 | "Knockout",20,,"Knockout","TID_GAME_MODE_20","chat_letsplay_knockout","event_gameroom_knockout","event_icon_knockout",,,,"event_knockout_banner_square",,,,,,,15,"TID_GAME_MODE_20","TID_KNOCKOUT_INTRO_TEXT",,"KnockoutStart",,"0xfffd9b0e","0xffF7831C",,"event_teamentry_knockedout","panel_team_online_knockedout" 24 | "HoldTheBall",21,"TRUE","HoldTheBall","TID_GAME_MODE_21","chat_letsplay_holdthetrophy","event_gameroom_holdthetrophy","event_icon_holdthetrophy","sc/events.sc","event_holdthetrophy_banner","sc/events.sc","event_holdthetrophy_banner_square",,,,,,,16,"TID_GAME_MODE_21","TID_HOLD_THE_BALL_INTRO_TEXT",,"KnockoutStart",,"0xfffd9b0e","0xffE337C1",,"event_teamentry_holdthetrophy","panel_team_online_holdthetrophy" 25 | "BasketBrawl",22,"TRUE","BasketBrawl","TID_GAME_MODE_22","chat_letsplay_basketbrawl","event_gameroom_basketbrawl","event_icon_basketbrawl","sc/events.sc","event_basketbrawl_banner","sc/events.sc","event_basketbrawl_banner_square","Basketbrawl_goal","Basketbrawl_other_goal","TID_HOOP_GOAL","TID_HOOP_GOAL","TID_HOOP_GOAL_MATCH_OVER","TID_HOOP_GOAL_MATCH_OVER",17,"TID_GAME_MODE_22","TID_BASKET_BRAWL_INTRO_TEXT",,"KnockoutStart",,"0xff2fc4f9","0xff2FC4F9",,"event_teamentry_basketbrawl","panel_team_online_basketbrawl" 26 | "VolleyBrawl",23,"TRUE","VolleyBrawl","TID_GAME_MODE_23","chat_letsplay_volleybrawl","event_gameroom_volleybrawl","event_icon_volleybrawl","sc/events.sc","event_volleybrawl_banner","sc/events.sc","event_volleybrawl_banner_square","Volleybrawl_goal","Volleybrawl_other_goal","TID_TEAM_GOAL","TID_OPPONENT_GOAL","TID_TEAM_GOAL_MATCH_OVER","TID_OPPONENT_GOAL_MATCH_OVER",18,"TID_GAME_MODE_23","TID_VOLLEY_BRAWL_INTRO_TEXT",,"KnockoutStart",,"0xffc2ed00","0xffB8FB26",,"event_teamentry_volleybrawl","panel_team_online_volleybrawl" 27 | -------------------------------------------------------------------------------- /Logic/Data/DataManager.py: -------------------------------------------------------------------------------- 1 | from io import BufferedReader, BytesIO 2 | import socket 3 | 4 | from Logic.Utility.Utils import Utils 5 | from Logic.Client.ClientsManager import ClientsManager 6 | 7 | import zlib 8 | 9 | class cryptoInfo: 10 | cryptobytesPosition = -1 11 | changed = False 12 | 13 | class Writer: 14 | def __init__(self, client, endian: str = 'big'): 15 | self.client = client 16 | self.endian = endian 17 | self.buffer = b'' 18 | 19 | 20 | def writeIntLE(self, data, length=4): 21 | self.buffer += data.to_bytes(length, 'little') 22 | 23 | def writeInt8(self, data): 24 | self.writeInt(data, 1) 25 | 26 | def writeInt16(self, data): 27 | self.writeInt(data, 2) 28 | 29 | def writeInt24(self, data): 30 | self.writeInt(data, 3) 31 | 32 | def writeMultiBool(self, *args): 33 | boolean = 0 34 | i = 0 35 | for value in args: 36 | if value: 37 | boolean |= 1 << i 38 | i += 1 39 | self.writeByte(boolean) 40 | 41 | def writeInt(self, data: int, length: int = 4): 42 | if data > 0: 43 | self.buffer += data.to_bytes(length, 'big', signed=False) 44 | else: 45 | self.buffer += data.to_bytes(length, 'big', signed=True) 46 | 47 | def writeUInteger(self, data: int, length: int = 1): 48 | self.buffer += data.to_bytes(length, 'big', signed=False) 49 | 50 | def writeUInt8(self, integer: int): 51 | self.writeUInteger(integer) 52 | 53 | def writeLong(self, high, low): 54 | self.buffer += high.to_bytes(4, 'big') + low.to_bytes(4, 'big') 55 | 56 | def writeVLong(self, high, low): 57 | self.writeVint(high) 58 | self.writeVint(low) 59 | 60 | def writeArrayVint(self, vintArray: list): 61 | self.writeVint(len(vintArray)) 62 | for i in vintArray: 63 | self.writeVint(i) 64 | 65 | def writeBoolean(self, *args): 66 | if len(args) == 1: 67 | self.writeUInt8(args[0]) 68 | else: 69 | self.writeMultiBool(args) 70 | 71 | def writeCompressedString(self, data: bytes): 72 | compressed = zlib.compress(data) 73 | self.writeInt(len(compressed) + 4) 74 | self.writeIntLE(len(data)) 75 | self.buffer += compressed 76 | 77 | def writeHexa(self, data): 78 | if data: 79 | if data.startswith('0x'): 80 | data = data[2:] 81 | self.buffer += bytes.fromhex(''.join(data.split()).replace('-', '')) 82 | 83 | def writeVint(self, data, rotate: bool = True): 84 | final = b'' 85 | if data == 0: 86 | self.writeByte(0) 87 | elif data < 0: 88 | self.writeVint((2147483648 * 2) + data) 89 | else: 90 | data = (data << 1) ^ (data >> 31) 91 | while data: 92 | b = data & 0x7f 93 | 94 | if data >= 0x80: 95 | b |= 0x80 96 | if rotate: 97 | rotate = False 98 | lsb = b & 0x1 99 | msb = (b & 0x80) >> 7 100 | b >>= 1 101 | b = b & ~0xC0 102 | b = b | (msb << 7) | (lsb << 6) 103 | final += b.to_bytes(1, 'big') 104 | data >>= 7 105 | self.buffer += final 106 | 107 | def writeString(self, string = None): 108 | if string is None: 109 | self.writeInt((2 ** 32) - 1) 110 | else: 111 | if type(string) == bytes: 112 | encoded = string 113 | else: 114 | encoded = string.encode('utf-8') 115 | self.writeInt(len(encoded)) 116 | self.buffer += encoded 117 | 118 | def writeStringReference(self, string: str = None): 119 | encoded = string.encode('utf-8') 120 | self.writeInt16(0) 121 | self.writeVint(len(encoded)) 122 | self.buffer += encoded 123 | 124 | def writeByte(self, data): 125 | if data > 255: 126 | self.buffer += data.to_bytes(2, 'big', signed=False) 127 | elif data > 127: 128 | self.buffer += data.to_bytes(1, 'big', signed=False) 129 | else: 130 | self.buffer += data.to_bytes(1, 'big', signed=True) 131 | 132 | def writeBytes(self, data): 133 | self.buffer += data 134 | 135 | def writeDataReference(self, x, y = 0): 136 | if x == 0: 137 | self.writeVint(0) 138 | else: 139 | self.writeVint(x) 140 | self.writeVint(y) 141 | 142 | def writeArrayVint(self, array): 143 | self.writeVint(len(array)) 144 | for i in array: 145 | self.writeVint(i) 146 | 147 | def send(self, PlayerLowID, cryptoBytesEnd: int = 1): 148 | self.encode() 149 | packet = self.buffer 150 | self.buffer = self.id.to_bytes(2, 'big', signed=True) 151 | self.writeInt24(len(packet)) 152 | if hasattr(self, 'version'): 153 | self.writeInt16(self.version) 154 | else: 155 | self.version = 0 156 | self.writeInt16(0) 157 | print(f"---------------------------------------------------------------------------------------------") 158 | print(f"\033[92m[{Utils.GetTime(self)}] [CLIENT] PacketID: {self.id} Name: {self.__class__.__name__} Length: {len(packet)} Version: {self.version}") 159 | crypto_bytes = b'\xff\xff\x00\x00\x00\x00\x00' 160 | if cryptoInfo.changed == False: 161 | cryptoInfo.cryptobytesPosition = cryptoBytesEnd 162 | cryptoInfo.changed = True 163 | 164 | if cryptoInfo.cryptobytesPosition == 0: 165 | crypto_bytes += self.buffer + packet 166 | elif cryptoInfo.cryptobytesPosition == 1: 167 | crypto_bytes = self.buffer + packet + crypto_bytes 168 | elif cryptoInfo.cryptobytesPosition == 2: 169 | crypto_bytes = self.buffer + packet 170 | 171 | try: 172 | if self.id == 23457: 173 | self.client.sendall(crypto_bytes) 174 | return 175 | ClientsManager.SocketsList["Sockets"][PlayerLowID].sendall(crypto_bytes) 176 | except KeyError: 177 | pass 178 | 179 | class Reader(BufferedReader): 180 | def __init__(self, header_bytes): 181 | super().__init__(BytesIO(header_bytes)) 182 | self.bytes_of_packets = header_bytes 183 | 184 | def readByte(self): 185 | return int.from_bytes(self.read(1), "big") 186 | 187 | def readBytes(self, length): 188 | return self.read(length) 189 | 190 | def readBoolean(self): 191 | result = bool.from_bytes(bytes=self.read(1), byteorder='big', signed=False) 192 | if result == True: 193 | return True 194 | else: 195 | return False 196 | 197 | def readIntLE(self): 198 | return int.from_bytes(self.read(4), "little") 199 | 200 | def readInt(self): 201 | return int.from_bytes(self.read(4), "big") 202 | 203 | def readInt8(self): 204 | return int.from_bytes(self.read(1), "big") 205 | 206 | def readInt16(self): 207 | return int.from_bytes(self.read(2), "big") 208 | 209 | def readInt24(self): 210 | return int.from_bytes(self.read(3), "big") 211 | 212 | def readVint(self): 213 | n = self.readVarint(True) 214 | return (n >> 1) ^ (-(n & 1)) 215 | 216 | def readVLong(self): 217 | ID = [] 218 | ID.append(self.readVint()) 219 | ID.append(self.readVint()) 220 | return ID 221 | 222 | def readShort(self, length=2): 223 | return int.from_bytes(self.read(length), "big") 224 | 225 | def readLong(self): 226 | high = self.readInt() 227 | low = self.readInt() 228 | return [high, low] 229 | 230 | def readCompressedString(self): 231 | self.readInt() 232 | data_length = self.readIntLE() 233 | 234 | compressed = self.readBytes(data_length) 235 | 236 | return zlib.decompress(compressed) 237 | 238 | def readStringReference(self): 239 | return self.readString() 240 | 241 | def readUInt8(self): 242 | return self.readUInteger() 243 | 244 | def readUInteger(self, length: int = 1, endian: str = 'big'): 245 | result = 0 246 | i = 0 247 | for x in range(length): 248 | byte = self.bytes_of_packets[i] 249 | 250 | bit_padding = x * 8 251 | if endian == 'big': 252 | bit_padding = (8 * (length - 1)) - bit_padding 253 | 254 | result |= byte << bit_padding 255 | i += 1 256 | 257 | return result 258 | 259 | def readStringBot(self): 260 | lenght = self.readVint() 261 | if lenght == pow(2, 32) - 1: 262 | return b"" 263 | else: 264 | try: 265 | decoded = self.read(lenght) 266 | except MemoryError: 267 | raise IndexError("String out of range.") 268 | else: 269 | return decoded.decode('utf-8') 270 | 271 | def readString(self): 272 | lenght = self.readInt() 273 | (pow(2, 32) - 1) 274 | if lenght == pow(2, 32) - 1: 275 | return b"" 276 | else: 277 | try: 278 | decoded = self.read(lenght) 279 | except MemoryError: 280 | raise IndexError("String out of range.") 281 | else: 282 | return decoded.decode('utf-8') 283 | 284 | def readDataReference(self): 285 | high = self.readVint() 286 | low = self.readVint() 287 | if (high): 288 | return high * 1000000 + low 289 | else: 290 | return 0 291 | 292 | def readDataReferenceDouble(self): 293 | high = self.readVint() 294 | if high == 0: 295 | return 0 296 | low = self.readVint() 297 | return [high, low] 298 | 299 | def readDataReferenceDouble(self, retList = True): 300 | high = self.readVint() 301 | if retList == True and high == 0: 302 | return [0, 0] 303 | elif high == 0: 304 | return 0 305 | low = self.readVint() 306 | return [high, low] 307 | 308 | def readVarint(self, rotate: bool = True): 309 | result = 0 310 | shift = 0 311 | while True: 312 | byte = self.readByte() 313 | if rotate and shift == 0: 314 | seventh = (byte & 0x40) >> 6 # save 7th bit 315 | msb = (byte & 0x80) >> 7 # save msb 316 | n = byte << 1 # rotate to the left 317 | n = n & ~0x181 # clear 8th and 1st bit and 9th if any 318 | byte = n | (msb << 7) | seventh # insert msb and 6th back in 319 | result |= (byte & 0x7f) << shift 320 | shift += 7 321 | if not (byte & 0x80): 322 | break 323 | return result -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /Messaging/LogicMessageFactory.py: -------------------------------------------------------------------------------- 1 | from Messaging.Packets.Client.Authentication.LoginMessage import LoginMessage 2 | from Messaging.Packets.Client.Devices.AnalyticEventMessage import AnalyticEventMessage 3 | from Messaging.Packets.Client.Game.EndClientTurnMessage import EndClientTurnMessage 4 | from Messaging.Packets.Client.Home.AskForBattleEndMessage import AskForBattleEndMessage 5 | from Messaging.Packets.Client.Home.ChangeAvatarNameMessage import ChangeAvatarNameMessage 6 | from Messaging.Packets.Client.Home.GetPlayerProfileMessage import GetPlayerProfileMessage 7 | from Messaging.Packets.Client.Home.GoHomeFromOfflinePractiseMessage import GoHomeFromOfflinePractiseMessage 8 | from Messaging.Packets.Client.Socket.KeepAliveMessage import KeepAliveMessage 9 | 10 | identifiers = { 11 | 10101: LoginMessage, 12 | 10108: KeepAliveMessage, 13 | 10110: AnalyticEventMessage, 14 | 10212: ChangeAvatarNameMessage, 15 | 14102: EndClientTurnMessage, 16 | 14109: GoHomeFromOfflinePractiseMessage, 17 | 14110: AskForBattleEndMessage, 18 | 14113: GetPlayerProfileMessage 19 | } 20 | 21 | knownList = { 22 | 10055: 'AskPlayerJWTokenMessage', 23 | 10099: 'ClientCryptoErrorMessage', 24 | 10100: 'ClientHelloMessage', 25 | 10101: 'LoginMessage', 26 | 10102: 'LoginUsingSessionMessage', 27 | 10103: 'CreateAccountMessage', 28 | 10107: 'ClientCapabilitiesMessage', 29 | 10108: 'KeepAliveMessage', 30 | 10109: 'UdpCheckConnectionMessage', 31 | 10110: 'AnalyticEventMessage', 32 | 10111: 'AccountIdentifiersMessage', 33 | 10112: 'AuthenticationCheckMessage', 34 | 10113: 'SetDeviceTokenMessage', 35 | 10116: 'ResetAccountMessage', 36 | 10117: 'ReportUserMessage', 37 | 10118: 'AccountSwitchedMessage', 38 | 10119: 'ReportAllianceStreamMessage', 39 | 10121: 'UnlockAccountMessage', 40 | 10150: 'AppleBillingRequestMessage', 41 | 10151: 'GoogleBillingRequestMessage', 42 | 10152: 'TencentBillingRequestMessage', 43 | 10153: 'CafeBazaarBillingRequestMessage', 44 | 10159: 'KunlunBillingRequestMessage', 45 | 10160: 'BillingCancelledByClientMessage', 46 | 10177: 'ClientInfoMessage', 47 | 10212: 'ChangeAvatarNameMessage', 48 | 10309: 'GetAllianceInviteTokenMessage', 49 | 10321: 'AttributionEventMessage', 50 | 10401: 'CreateGameMessage', 51 | 10501: 'AcceptFriendMessage', 52 | 10502: 'AddFriendMessage', 53 | 10503: 'AskForAddableFriendsMessage', 54 | 10504: 'AskForFriendListMessage', 55 | 10506: 'RemoveFriendMessage', 56 | 10507: 'AddFriendByEmailMessage', 57 | 10509: 'AddFriendByAvatarNameAndCodeMessage', 58 | 10512: 'AskForPlayingGamecenterFriendsMessage', 59 | 10513: 'AskForPlayingFacebookFriendsMessage', 60 | 10514: 'AskForPlayingKakaoFriendsMessage', 61 | 10515: 'AskForPlayingTencentFriendsMessage', 62 | 10516: 'AskForPlayingLineFriendsMessage', 63 | 10517: 'AskForPlayingSupercellFriendsMessage', 64 | 10523: 'YoozooBillingRequestMessage', 65 | 10555: 'ClientInputMessage', 66 | 10576: 'SetBlockFriendRequestsMessage', 67 | 10599: 'AskForFriendSuggestionsMessage', 68 | 10636: 'SCIDBindAccountMessage', 69 | 11736: 'SCIDLogoutAllDevicesMessage', 70 | 12100: 'CreatePlayerMapMessage', 71 | 12101: 'DeletePlayerMapMessage', 72 | 12102: 'GetPlayerMapsMessage', 73 | 12103: 'UpdatePlayerMapMessage', 74 | 12104: 'SubmitPlayerMapMessage', 75 | 12105: 'PublishPlayerMapMessage', 76 | 12106: 'ChangePlayerMapNameMessage', 77 | 12107: 'EnterMapEditorMessage', 78 | 12108: 'GoHomeFromMapEditorMessage', 79 | 12110: 'TeamSetPlayerMapMessage', 80 | 12111: 'SignoffPlayerMapMessage', 81 | 12125: 'ReportPlayerMapMessage', 82 | 12152: 'RankedMatchBanHeroMessage', 83 | 12155: 'RankedMatchPickHeroMessage', 84 | 12157: 'RankedMatchUpdateHeroDataMessage', 85 | 12905: 'GetCurrentBattleReplayDataMessage', 86 | 12998: 'SetCountryMessage', 87 | 13922: 'AcceptTokenFriendMessage', 88 | 14101: 'GoHomeMessage', 89 | 14102: 'EndClientTurnMessage', 90 | 14103: 'StartGameMessage', 91 | 14104: 'StartSpectateMessage', 92 | 14105: 'HomeLogicStoppedMessage', 93 | 14106: 'CancelMatchmakingMessage', 94 | 14107: 'StopSpectateMessage', 95 | 14108: 'GoHomeFromSpectateMessage', 96 | 14109: 'GoHomeFromOfflinePractiseMessage', 97 | 14110: 'AskForBattleEndMessage', 98 | 14113: 'GetPlayerProfileMessage', 99 | 14114: 'GetBattleLogMessage', 100 | 14115: 'BattleLogViewReplayMessage', 101 | 14116: 'ViewReplayByStringMessage', 102 | 14117: 'RequestMatchCancelMessage', 103 | 14118: 'SinglePlayerMatchRequestMessage', 104 | 14167: 'ChronosEventSeenMessage', 105 | 14177: 'PlayAgainMessage', 106 | 14178: 'DebugCommandMessage', 107 | 14211: 'UnbindFacebookAccountMessage', 108 | 14201: 'BindFacebookAccountMessage', 109 | 14202: 'BindKakaoAccountMessage', 110 | 14203: 'BingLineAccountMessage', 111 | 14212: 'BindGamecenterAccountMessage', 112 | 14213: 'UnbindKakaoAccountMessage', 113 | 14214: 'UnbindLineAccountMessage', 114 | 14262: 'BindGoogleServiceAccountMessage', 115 | 14266: 'BindTencentAccountMessage', 116 | 14268: 'TencentCheckCanPayMessage', 117 | 14276: 'TencentAntiAddictionInstructionExecutedMessage', 118 | 14277: 'GetSeasonRewardsMessage', 119 | 14299: 'SetAllianceCountryMessage', 120 | 14301: 'CreateAllianceMessage', 121 | 14302: 'AskForAllianceDataMessage', 122 | 14303: 'AskForJoinableAlliancesListMessage', 123 | 14304: 'AskForAllianceStreamMessage', 124 | 14305: 'JoinAllianceMessage', 125 | 14306: 'ChangeAllianceMemberRoleMessage', 126 | 14307: 'KickAllianceMemberMessage', 127 | 14308: 'LeaveAllianceMessage', 128 | 14315: 'ChatToAllianceStreamMessage', 129 | 14316: 'ChangeAllianceSettingsMessage', 130 | 14317: 'RequestJoinAllianceMessage', 131 | 14321: 'RespondToAllianceJoinRequestMessage', 132 | 14322: 'SendAllianceInvitationMessage', 133 | 14323: 'JoinAllianceUsingInvitationMessage', 134 | 14324: 'SearchAlliancesMessage', 135 | 14326: 'SendAllianceInvitationToFriendMessage', 136 | 14330: 'SendAllianceMailMessage', 137 | 14350: 'TeamCreateMessage', 138 | 14351: 'TeamJoinMessage', 139 | 14352: 'TeamKickMessage', 140 | 14353: 'TeamLeaveMessage', 141 | 14354: 'TeamChangeMemberSettingsMessage', 142 | 14355: 'TeamSetMemberReadyMessage', 143 | 14356: 'TeamTogglePractiseMessage', 144 | 14357: 'TeamToggleMemberSideMessage', 145 | 14358: 'TeamSpectateMessage', 146 | 14359: 'TeamChatMessage', 147 | 14360: 'TeamPostAdMessage', 148 | 14361: 'TeamMemberStatusMessage', 149 | 14362: 'TeamSetEventMessage', 150 | 14363: 'TeamSetLocationMessage', 151 | 14364: 'TeamReportChatMessage', 152 | 14365: 'TeamInviteMessage', 153 | 14366: 'PlayerStatusMessage', 154 | 14367: 'TeamClearInviteMessage', 155 | 14368: 'TeamInviteResponseMessage', 156 | 14369: 'TeamPremadeChatMessage', 157 | 14370: 'TeamAllianceMemberInviteMessage', 158 | 14371: 'TeamJoinOrCreateGameRoomMessage', 159 | 14372: 'TeamToggleSettingsMessage', 160 | 14373: 'TeamBotSlotDisableMessage', 161 | 14403: 'GetLeaderboardMessage', 162 | 14405: 'AskForAvatarStreamMessage', 163 | 14406: 'AskForBattleReplayStreamMessage', 164 | 14418: 'RemoveAvatarStreamEntryMessage', 165 | 14479: 'TeamInvitationResponseMessage', 166 | 14600: 'AvatarNameCheckRequestMessage', 167 | 14700: 'ListBrawlTvChannelsMessage', 168 | 14701: 'TuneBrawlTvChannelMessage', 169 | 14715: 'SendGlobalChatLineMessage', 170 | 14777: 'SetInvitesBlockedMessage', 171 | 14778: 'SetTeamChatMutedMessage', 172 | 14867: 'SetRegionMessage', 173 | 14880: 'TeamRequestJoinCancelMessage', 174 | 14881: 'TeamRequestJoinMessage', 175 | 14882: 'TeamRequestJoinApproveMessage', 176 | 15793: 'GetTokenFriendMessage', 177 | 16000: 'LogicDeviceLinkCodeRequestMessage', 178 | 16001: 'LogicDeviceLinkMenuClosedMessage', 179 | 16002: 'LogicDeviceLinkEnterCodeMessage', 180 | 16003: 'LogicDeviceLinkConfirmYesMessage', 181 | 16939: 'AskApiTokenMessage', 182 | 17000: 'LogicAccountTransferCodeRequestMessage', 183 | 17190: 'JoinAllianceUsingTokenMessage', 184 | 17337: 'UnbotifyReportMessage', 185 | 17338: 'AdjustPackageMessage', 186 | 18686: 'SetSupportedCreatorMessage', 187 | 19001: 'LatencyTestResultMessage', 188 | 19002: 'UdpLatencyTestRequestMessage', 189 | 19003: 'TriggerStartLatencyTestMessage', 190 | 19004: 'RequestLatencyTestStatusMessage', 191 | 20000: 'SetEncryptionMessage', 192 | 20100: 'ServerHelloMessage', 193 | 20101: 'CreateAccountOkMessage', 194 | 20103: 'LoginFailedMessage', 195 | 20104: 'LoginOkMessage', 196 | 20105: 'FriendListMessage', 197 | 20106: 'FriendListUpdateMessage', 198 | 20107: 'AddableFriendsMessage', 199 | 20108: 'KeepAliveServerMessage', 200 | 20109: 'FriendOnlineStatusMessage', 201 | 20110: 'FriendLoggedInMessage', 202 | 20111: 'FriendLoggedOutMessage', 203 | 20112: 'AddFriendFailedMessage', 204 | 20117: 'ReportUserStatusMessage', 205 | 20118: 'ChatAccountBanStatusMessage', 206 | 20121: 'BillingRequestFailedMessage', 207 | 20132: 'UnlockAccountOkMessage', 208 | 20133: 'UnlockAccountFailedMessage', 209 | 20151: 'AppleBillingProcessedByServerMessage', 210 | 20152: 'GoogleBillingProcessedByServerMessage', 211 | 20153: 'TencentBillingProcessedByServerMessage', 212 | 20154: 'CafeBazaarBillingProcessedByServerMessage', 213 | 20156: 'KunlunBillingProcessedByServerMessage', 214 | 20161: 'ShutdownStartedMessage', 215 | 20171: 'PersonalBreakStartedMessage', 216 | 20173: 'YoozooBillingProcessedByServerMessage', 217 | 20199: 'FriendSuggestionsMessage', 218 | 20205: 'AvatarNameChangeFailedMessage', 219 | 20206: 'AvatarOnlineStatusUpdated', 220 | 20207: 'AllianceOnlineStatusUpdatedMessage', 221 | 20300: 'AvatarNameCheckResponseMessage', 222 | 20402: 'CreateGameFailedMessage', 223 | 20405: 'MatchMakingStatusMessage', 224 | 20406: 'MatchMakingCancelledMessage', 225 | 20501: 'AcceptFriendFailedMessage', 226 | 20523: 'YoozooOrderAvailableMessage', 227 | 20545: 'YoozooOrderDeliveryFailedMessage', 228 | 20559: 'StartLoadingMessage', 229 | 20801: 'NotificationMessage', 230 | 20802: 'OpponentRejoinsMatchNotificationMessage', 231 | 20931: 'AntiAddictionDataUpdatedMessage', 232 | 22089: 'GetTokenFriendResultMessage', 233 | 22100: 'CreatePlayerMapResponseMessage', 234 | 22101: 'DeletePlayerMapResponseMessage', 235 | 22102: 'PlayerMapsMessage', 236 | 22103: 'UpdatePlayerMapResponseMessage', 237 | 22104: 'SubmitPlayerMapResponseMessage', 238 | 22105: 'PublishPlayerMapResponseMessage', 239 | 22106: 'ChangePlayerMapNameMResponseMessage', 240 | 22107: 'PlayerMapInfoUpdatedMessage', 241 | 22109: 'DebugPlayerMapReviewResultOverrideSetMessage', 242 | 22111: 'PlayerMapGreenlightedMessage', 243 | 22125: 'ReportPlayerMapResponseMessage', 244 | 22150: 'RankedMatchStartMessage', 245 | 22151: 'RankedMatchBanStartedMessage', 246 | 22152: 'RankedMatchBanHeroResponseMessage', 247 | 22153: 'RankedMatchBanEndedMessage', 248 | 22154: 'RankedMatchPickStartedMessage', 249 | 22155: 'RankedMatchPickHeroFailedMessage', 250 | 22156: 'RankedMatchHeroPickedMessage', 251 | 22157: 'RankedMatchHeroDataUpdatedMessage', 252 | 22158: 'RankedMatchFinalPreparationStartedMessage', 253 | 22159: 'RankedMatchTerminatedMessage', 254 | 22202: 'MapPreviewMessage', 255 | 22377: 'GoogleServiceAccountBoundMessage', 256 | 22687: 'GamecenterAccountAlreadyBoundMessage', 257 | 22957: 'PvpMatchmakeNotificationMessage', 258 | 23067: 'SCIDLogoutAllDevicesResultMessage', 259 | 23302: 'GetAllianceInviteTokenResultMessage', 260 | 23456: 'BattleEndMessage', 261 | 23457: 'LobbyInfoMessage', 262 | 23458: 'BattleLogMessage', 263 | 23459: 'BattleLogReplayAvailableMessage', 264 | 23494: 'GoogleServiceAccountAlreadyBoundMessage', 265 | 23774: 'PlayerJWTokenMessage', 266 | 24101: 'OwnHomeDataMessage', 267 | 24104: 'OutOfSyncMessage', 268 | 24105: 'SpectacleFailedMessage', 269 | 24106: 'StopHomeLogicMessage', 270 | 24108: 'MatchmakeFailedMessage', 271 | 24109: 'VisionUpdateMessage', 272 | 24111: 'AvailableServerCommandMessage', 273 | 24112: 'UdpConnectionInfoMessage', 274 | 24113: 'PlayerProfileMessage', 275 | 24114: 'HomeBattleReplayDataMessage', 276 | 24115: 'ServerErrorMessage', 277 | 24116: 'HomeBattleReplayFailedMessage', 278 | 24117: 'HomeBattleReplayViewedMessage', 279 | 24123: 'SeasonRewardsMessage', 280 | 24124: 'TeamMessage', 281 | 24125: 'TeamLeftMessage', 282 | 24129: 'TeamErrorMessage', 283 | 24130: 'TeamGameStartingMessage', 284 | 24131: 'TeamStreamMessage', 285 | 24177: 'SetRegionResponseMessage', 286 | 24178: 'SetCountryResponseMessage', 287 | 24199: 'LookForGameRoomRequestMessage', 288 | 24201: 'FacebookAccountBoundMessage', 289 | 24202: 'FacebookAccountAlreadyBoundMessage', 290 | 24203: 'KakaoAccountBoundMessage', 291 | 24204: 'KakaoAccountAlreadyBoundMessage', 292 | 24205: 'LineAccountAlreadyBoundMessage', 293 | 24206: 'LineAccountBoundMessage', 294 | 24214: 'FacebookAccountUnboundMessage', 295 | 24215: 'KakaoAccountUnboundMessage', 296 | 24216: 'LineAccountUnboundMessage', 297 | 24220: 'TencentAccountBoundMessage', 298 | 24221: 'TencentAccountAlreadyBoundMessage', 299 | 24223: 'tencentCheckCanPayResponseMessage', 300 | 24301: 'AllianceDataMessage', 301 | 24304: 'JoinableAllianceListMessage', 302 | 24308: 'AllianceMemberMessage', 303 | 24309: 'AllianceMemberRemovedMessage', 304 | 24310: 'AllianceListMessage', 305 | 24311: 'AllianceStreamMessage', 306 | 24312: 'AllianceStreamEntryMessage', 307 | 24313: 'ChangeAllianceSettingsOkMessage', 308 | 24318: 'AllianceStreamEntryRemovedMessage', 309 | 24319: 'TeamStreamEntryRemovedMessage', 310 | 24321: 'AllianceInvitationSendFailedMessage', 311 | 24333: 'AllianceResponseMessage', 312 | 24364: 'AllianceTeamsMessage', 313 | 24365: 'AllianceTeamRemovedMessage', 314 | 24399: 'MyAllianceMessage', 315 | 24403: 'LeaderboardMessage', 316 | 24411: 'AvatarStreamMessage', 317 | 24412: 'AvatarStreamEntryMessage', 318 | 24413: 'BattleReportStreamMessage', 319 | 24418: 'AvatarStreamEntryRemovedMessage', 320 | 24555: 'FriendOnlineStatusEntryMessage', 321 | 24582: 'TeamInviteStatusMessage', 322 | 24589: 'TeamInvitationMessage', 323 | 24700: 'BrawlTvChannelListMessage', 324 | 24701: 'BrawlTvChannelNextUpMessage', 325 | 24715: 'GlobalChatLineMessage', 326 | 24758: 'ApiTokenMessage', 327 | 24776: 'AllianceWarMessage', 328 | 24777: 'PlayAgainStatusMessage', 329 | 25165: 'SCIDAccountBoundMessage', 330 | 25892: 'DisconnectedMessage', 331 | 26002: 'LogicDeviceLinkCodeResponseMessage', 332 | 26003: 'LogicDeviceLinkNewDeviceLinkedMessage', 333 | 26004: 'LogicDeviceLinkCodeDeactivatedMessage', 334 | 26005: 'LogicDeviceLinkResponseMessage', 335 | 26007: 'LogicDeviceLinkDoneMessage', 336 | 26008: 'LogicDeviceLinkErrorMessage', 337 | 26085: 'GamecenterAccountBoundMessage', 338 | 27002: 'LogicAccountTransferCodeResponseMessage', 339 | 28363: 'BuyBundleBillingPackResponseMessage', 340 | 28686: 'SetSupportedCreatorResponseMessage', 341 | 28689: 'SCIDAccountAlreadyBoundMessage', 342 | 29001: 'StartLatencyTestRequestMessage', 343 | 29002: 'UdpLatencyTestResponseMessage', 344 | 29003: 'LatencyTestStatusMessage', 345 | 29900: 'SupercellIdNotificationMessage', 346 | 29997: 'CryptoErrorMessage', 347 | 30000: 'AttributionMessage', 348 | 40000: 'AdUpdateConversionValueMessage' 349 | } -------------------------------------------------------------------------------- /Logic/Files/assets/csv_logic/locations.csv: -------------------------------------------------------------------------------- 1 | "Name","Disabled","TID","LocationTheme","SupportingCampaignGround","BannerOverrideSWF","BannerOverrideExportName","GameModeVariation","Map","CommunityCredit" 2 | "string","boolean","string","string","boolean","string","string","string","string","string" 3 | "Wanted1","true","TID_WANTED_1","DarrylsShip",,,,"Bounty","Wanted_1", 4 | "Wanted3","true","TID_WANTED_3","Arcade",,,,"Bounty","Wanted_3", 5 | "Wanted4","true","TID_WANTED_4","Default",,,,"Bounty","Gemgrab_3", 6 | "Wanted5","true","TID_WANTED_5","Default",,,,"Bounty","Gemgrab_2", 7 | "Wanted6","true","TID_WANTED_6","Default",,,,"Bounty","Wanted_6", 8 | "Wanted7",,"TID_WANTED_7","Brawlywood",,,,"Bounty","Wanted_7", 9 | "Wanted2","true","TID_WANTED_2","Oasis",,,,"Bounty","Wanted_2", 10 | "Gemgrab1",,"TID_GOLDRUSH_1","Mine",,,,"GemGrab","Gemgrab_1", 11 | "Gemgrab2",,"TID_GOLDRUSH_2","Arcade",,,,"GemGrab","Gemgrab_2", 12 | "Gemgrab3",,"TID_WANTED_4","Brawlywood",,,,"GemGrab","Gemgrab_3", 13 | "Gemgrab4",,"TID_WANTED_3B","CastleCourtyard",,,,"GemGrab","Wanted_3", 14 | "Gemgrab5",,"TID_GOLDRUSH_5","Mine",,,,"GemGrab","Gemgrab_5", 15 | "Gemgrab6",,"TID_GOLDRUSH_6","Mine",,,,"GemGrab","Gemgrab_4", 16 | "Survival1",,"TID_BATTLE_ROYALE_1","DefaultShowdown",,,,"Showdown","Survival_1", 17 | "Survival2",,"TID_BATTLE_ROYALE_2","DefaultShowdown",,,,"Showdown","Survival_2","OwenReds" 18 | "Survival3",,"TID_BATTLE_ROYALE_3","DefaultShowdown",,,,"Showdown","Survival_3", 19 | "Survival4",,"TID_BATTLE_ROYALE_4","MortuaryShowdown",,,,"Showdown","Survival_4", 20 | "Heist1","true","TID_BANKHEIST_1","Minicity",,,,"Heist","Bankheist_1", 21 | "Heist2",,"TID_BANKHEIST_2","Default",,,,"Heist","Bankheist_2", 22 | "Heist3",,"TID_BANKHEIST_3","Brawlywood",,,,"Heist","Bankheist_3", 23 | "Tutorial","true",,"OldTownTutorial",,,,"Tutorial","Tutorial", 24 | "BossFight1","true","TID_BOSS_4","Default",,,,"BigGame","BossFight_1", 25 | "Wanted8",,"TID_WANTED_8","CastleCourtyard",,,,"Bounty","Wanted_8", 26 | "Heist4","true","TID_BANKHEIST_4","CastleCourtyard",,,,"Heist","Bankheist_4", 27 | "Ball1",,"TID_BALL_1","Grassfield",,,,"BrawlBall","Laserball_1", 28 | "Ball2",,"TID_BALL_2","Grassfield",,,,"BrawlBall","Laserball_2", 29 | "Ball3",,"TID_BALL_3","Grassfield",,,,"BrawlBall","Laserball_3", 30 | "Coop1","true","TID_COOP_1","Default",,,,"RoboRumble","Coop_1", 31 | "SurvivalTeam7",,"TID_BATTLE_ROYALE_7","MortuaryShowdown",,,,"DuoShowdown","Survival_7", 32 | "Coop2","true","TID_COOP_2","Default",,,,"RoboRumble","Coop_2", 33 | "BossFight2","true","TID_BOSS_3","Mine",,,,"BigGame","BossFight_2", 34 | "Gemgrab8","true","TID_GOLDRUSH_8","Default",,,,"GemGrab","Gemgrab_8", 35 | "Survival5",,"TID_BATTLE_ROYALE_5","MortuaryShowdown",,,,"Showdown","Survival_5","Mordeus" 36 | "Survival6",,"TID_BATTLE_ROYALE_6","DefaultShowdown",,,,"Showdown","Survival_6", 37 | "SurvivalTeam1",,"TID_BATTLE_ROYALE_1","DefaultShowdown",,,,"DuoShowdown","Survival_1", 38 | "SurvivalTeam2",,"TID_BATTLE_ROYALE_2","DefaultShowdown",,,,"DuoShowdown","Survival_2","OwenReds" 39 | "SurvivalTeam3",,"TID_BATTLE_ROYALE_3","DefaultShowdown",,,,"DuoShowdown","Survival_3", 40 | "SurvivalTeam4",,"TID_BATTLE_ROYALE_4","MortuaryShowdown",,,,"DuoShowdown","Survival_4", 41 | "SurvivalTeam5",,"TID_BATTLE_ROYALE_5","MortuaryShowdown",,,,"DuoShowdown","Survival_5","Mordeus" 42 | "Coop3","true","TID_COOP_6","DefaultShowdown",,,,"RoboRumble","Coop_3", 43 | "Gemgrab7","true","TID_GOLDRUSH_7","CastleCourtyard",,,,"GemGrab","Gemgrab_7","DarkKnight" 44 | "Gemgrab10","true","TID_GOLDRUSH_10","Mine",,,,"GemGrab","Gemgrab_10","Lewinham" 45 | "Heist5","true","TID_BANKHEIST_5","Default",,,,"Heist","Bankheist_5","Rushalisk" 46 | "Survival7",,"TID_BATTLE_ROYALE_7","MortuaryShowdown",,,,"Showdown","Survival_7", 47 | "SurvivalTeam6",,"TID_BATTLE_ROYALE_6","DefaultShowdown",,,,"DuoShowdown","Survival_6", 48 | "Survival8","true","TID_BATTLE_ROYALE_8","IslandShowdown",,,,"Showdown","Survival_8","Rushalisk" 49 | "SurvivalTeam8","true","TID_BATTLE_ROYALE_8","IslandShowdown",,,,"DuoShowdown","Survival_8","Rushalisk" 50 | "Heist6","true","TID_BANKHEIST_6","Default",,,,"Heist","Bankheist_6","Mordeus" 51 | "Gemgrab11",,"TID_GOLDRUSH_11","Mine",,,,"GemGrab","Gemgrab_11","FatBubblyDragon" 52 | "Heist7","true","TID_BANKHEIST_7","Default",,,,"Heist","Bankheist_7","Schmedricks" 53 | "Ball4",,"TID_BALL_4","Grassfield",,,,"BrawlBall","Laserball_4","Lex" 54 | "Ball6",,"TID_BALL_6","BBArena",,,,"BrawlBall","Laserball_6","Mordeus" 55 | "Ball7","true","TID_BALL_7","Grassfield",,,,"BrawlBall","Laserball_7","Lewinham" 56 | "Heist8",,"TID_BANKHEIST_18","Mortuary",,,,"Heist","Bankheist_8","AlexEsteAdevarat" 57 | "Wanted9","true","TID_WANTED_9","Brawlywood",,,,"Bounty","Wanted_9","thelucas2000" 58 | "Survival12","true","TID_BATTLE_ROYALE_12","DefaultShowdown",,,,"Showdown","Survival_12","Tony_A9" 59 | "SurvivalTeam12","true","TID_BATTLE_ROYALE_12","DefaultShowdown",,,,"DuoShowdown","Survival_12","Tony_A9" 60 | "Raid1","true","TID_RAID_2","DefaultShowdown",,,,"BossFight","Raid_1", 61 | "GGxmas1","true","TID_GOLDRUSH_XMAS_1","CastleCourtyard",,,,"GemGrab","Wanted_3", 62 | "GGxmas2","true","TID_GOLDRUSH_XMAS_2","CastleCourtyard",,,,"GemGrab","Gemgrab_7", 63 | "GGxmas3","true","TID_GOLDRUSH_XMAS_3","CastleCourtyard",,,,"GemGrab","Gemgrab_5", 64 | "GGxmas4","true","TID_GOLDRUSH_XMAS_4","CastleCourtyard",,,,"GemGrab","Gemgrab_1", 65 | "GGxmas5","true","TID_GOLDRUSH_XMAS_5","CastleCourtyard",,,,"GemGrab","Gemgrab_4", 66 | "GGxmas6","true","TID_GOLDRUSH_XMAS_6","CastleCourtyard",,,,"GemGrab","Gemgrab_9", 67 | "GGxmas7","true","TID_GOLDRUSH_XMAS_7","CastleCourtyard",,,,"GemGrab","Gemgrab_3", 68 | "BossFight3","true","TID_BOSS_6","Default",,,,"BigGame","BossFight_3", 69 | "BossFight4","true","TID_BOSS_5","Mine",,,,"BigGame","BossFight_4", 70 | "Raid2","true","TID_RAID_3","DefaultShowdown",,,,"BossFight","Raid_2", 71 | "Coop4","true","TID_COOP_3","DefaultShowdown",,,,"RoboRumble","Coop_4", 72 | "Heist9","true","TID_BANKHEIST_9","OldTown",,,,"Heist","Bankheist_9", 73 | "Heist10","true","TID_BANKHEIST_10","OldTown",,,,"Heist","Bankheist_10", 74 | "Heist11","true","TID_BANKHEIST_11","Default",,,,"Heist","Bankheist_11","AeroNautikks" 75 | "Heist12",,"TID_BANKHEIST_12","CastleCourtyard",,,,"Heist","Bankheist_12","Zagibulenka" 76 | "Heist13","true","TID_BANKHEIST_13","OldTown",,,,"Heist","Bankheist_13", 77 | "LNYHeist1","true","TID_BANKHEIST_9","OldTownLNY",,,,"Heist","Bankheist_9", 78 | "LNYHeist2","true","TID_BANKHEIST_10","OldTownLNY",,,,"Heist","Bankheist_10", 79 | "LNYHeist3","true","TID_BANKHEIST_11","OldTownLNY",,,,"Heist","Bankheist_11","AeroNautikks" 80 | "LNYHeist4","true","TID_BANKHEIST_12","OldTownLNY",,,,"Heist","Bankheist_12","Zagibulenka" 81 | "LNYHeist5","true","TID_BANKHEIST_13","OldTownLNY",,,,"Heist","Bankheist_13", 82 | "Wanted10","true","TID_WANTED_9","OldTown",,,,"Bounty","Wanted_10", 83 | "Wanted11","true","TID_WANTED_11","OldTown",,,,"Bounty","Wanted_11", 84 | "Wanted12",,"TID_WANTED_12","Mortuary",,,,"Bounty","Wanted_12", 85 | "Wanted13",,"TID_WANTED_13","Arcade",,,,"Bounty","Wanted_13","OwenReds" 86 | "Wanted14",,"TID_WANTED_14","Default",,,,"Bounty","Wanted_14", 87 | "LNYWanted1","true","TID_WANTED_9","OldTownLNY",,,,"Bounty","Wanted_10", 88 | "LNYWanted2","true","TID_WANTED_11","OldTownLNY",,,,"Bounty","Wanted_11", 89 | "LNYWanted3","true","TID_WANTED_12","OldTownLNY",,,,"Bounty","Wanted_12", 90 | "LNYWanted4","true","TID_WANTED_13","OldTownLNY",,,,"Bounty","Wanted_13","OwenReds" 91 | "LNYWanted5","true","TID_WANTED_14","OldTownLNY",,,,"Bounty","Wanted_14", 92 | "LNYGemgrab1","true","TID_GOLDRUSH_4","OldTownLNY",,,,"GemGrab","Wanted_3", 93 | "LNYGemgrab2","true","TID_GOLDRUSH_5","OldTownLNY",,,,"GemGrab","Gemgrab_5_LNY", 94 | "LNYGemgrab3","true","TID_GOLDRUSH_6","OldTownLNY",,,,"GemGrab","Gemgrab_4_LNY", 95 | "Ball8","true","TID_WANTED_10","Grassfield",,,,"BrawlBall","Laserball_8", 96 | "Survival10","true","TID_BATTLE_ROYALE_10","DefaultShowdown",,,,"Showdown","Survival_10","Binnyboy" 97 | "SurvivalTeam10","true","TID_BATTLE_ROYALE_10","DefaultShowdown",,,,"DuoShowdown","Survival_10","Binnyboy" 98 | "Survival13","true","TID_BATTLE_ROYALE_D2","DefaultShowdown",,,,"Showdown","Survival_13", 99 | "SurvivalTeam13","true","TID_BATTLE_ROYALE_D2","DefaultShowdown",,,,"DuoShowdown","Survival_13", 100 | "Siege1",,"TID_ROBO_WARS_6","Scrapyard",,,,"Siege","Siege_1", 101 | "Siege2",,"TID_ROBO_WARS_8","Scrapyard",,,,"Siege","Siege_2", 102 | "Siege3",,"TID_ROBO_WARS_7","Scrapyard",,,,"Siege","Siege_3", 103 | "CRoyale","true","TID_BANKHEIST_14","Oasis",,,,"Heist","CRoyale","DuccioCh" 104 | "Survival14",,"TID_BATTLE_ROYALE_17","MortuaryShowdown",,,,"Showdown","Survival_14","Maxymus" 105 | "SurvivalTeam14",,"TID_BATTLE_ROYALE_17","MortuaryShowdown",,,,"DuoShowdown","Survival_14","Maxymus" 106 | "Survival15","true","TID_BATTLE_ROYALE_13","DefaultShowdown",,,,"Showdown","Survival_15","Mordeus" 107 | "SurvivalTeam15","true","TID_BATTLE_ROYALE_13","DefaultShowdown",,,,"DuoShowdown","Survival_15","Mordeus" 108 | "Survival16","true","TID_BATTLE_ROYALE_19","DefaultShowdown",,,,"Showdown","Survival_16","Meme-grabbee" 109 | "SurvivalTeam16","true","TID_BATTLE_ROYALE_19","DefaultShowdown",,,,"DuoShowdown","Survival_16","Meme-grabbee" 110 | "Survival17","true","TID_BATTLE_ROYALE_23","DefaultShowdown",,,,"Showdown","Survival_17","OwenReds" 111 | "SurvivalTeam17","true","TID_BATTLE_ROYALE_23","DefaultShowdown",,,,"DuoShowdown","Survival_17","OwenReds" 112 | "Survival18","true","TID_BATTLE_ROYALE_21","DefaultShowdown",,,,"Showdown","Survival_18","Pentagonal Cubes" 113 | "SurvivalTeam18","true","TID_BATTLE_ROYALE_21","DefaultShowdown",,,,"DuoShowdown","Survival_18","Pentagonal Cubes" 114 | "Gemgrab12","true","TID_GOLDRUSH_12","CastleCourtyard",,,,"GemGrab","Gemgrab_12","ash" 115 | "Gemgrab13",,"TID_GOLDRUSH_13","CastleCourtyard",,,,"GemGrab","Gemgrab_13","Electra Drake" 116 | "Gemgrab14","true","TID_GOLDRUSH_23","CastleCourtyard",,,,"GemGrab","Gemgrab_10","Lewinham" 117 | "Gemgrab15","true","TID_GOLDRUSH_17","Minicity",,,,"GemGrab","Gemgrab_15","Mordeus" 118 | "Gemgrab16",,"TID_GOLDRUSH_25","Mortuary",,,,"GemGrab","Gemgrab_16","benci" 119 | "Gemgrab17","true","TID_GOLDRUSH_24","Mortuary",,,,"GemGrab","Gemgrab_17","Lab2point0" 120 | "Gemgrab18","true","TID_GOLDRUSH_19","Mine",,,,"GemGrab","Gemgrab_18","freezeemilk" 121 | "Ball9",,"TID_BALL_15","Grassfield",,,,"BrawlBall","Laserball_9","Mordeus" 122 | "Biggame1","true","TID_BOSS_4","DefaultShowdown",,,,"BigGame","Biggame_1","OwenReds" 123 | "Biggame2","true","TID_BOSS_3","DefaultShowdown",,,,"BigGame","Biggame_2","OwenReds" 124 | "Training","true",,"OldTownTutorial",,,,"Training","Training", 125 | "Gemgrab19",,"TID_GOLDRUSH_31","MineTrainTracks",,,,"GemGrab","Gemgrab_19", 126 | "Survival19","true","TID_BATTLE_ROYALE_28","DefaultShowdown",,,,"Showdown","Survival_19","Mordeus" 127 | "SurvivalTeam19","true","TID_BATTLE_ROYALE_28","DefaultShowdown",,,,"DuoShowdown","Survival_19","Mordeus" 128 | "Survival20","true","TID_BATTLE_ROYALE_31","DefaultShowdown",,,,"Showdown","Survival_20","OwenReds" 129 | "SurvivalTeam20","true","TID_BATTLE_ROYALE_31","DefaultShowdown",,,,"DuoShowdown","Survival_20","OwenReds" 130 | "Siege4",,"TID_ROBO_WARS_13","Scrapyard",,,,"Siege","Siege_4","OwenReds" 131 | "Siege5","true","TID_ROBO_WARS_11","Scrapyard",,,,"Siege","Siege_5","Binnyboy" 132 | "Siege6","true","TID_ROBO_WARS_10","Scrapyard",,,,"Siege","Siege_6","Binnyboy" 133 | "Siege7","true","TID_ROBO_WARS_4","Scrapyard",,,,"Siege","Siege_7","OwenReds" 134 | "Siege8","true","TID_ROBO_WARS_12","Scrapyard",,,,"Siege","Siege_8","Mordeus" 135 | "Ball10",,"TID_BALL_17","BBArena",,,,"BrawlBall","Laserball_10","Mordeus" 136 | "Raid4","true","TID_ROBO_WARS_14","DefaultShowdown",,,,"BossFight","Raid_4", 137 | "Ball11","true","TID_BALL_21","Grassfield",,,,"BrawlBall","Laserball_11","ash" 138 | "Survival21","true","TID_BATTLE_ROYALE_16","DefaultShowdown",,,,"Showdown","Survival_21","Mordeus" 139 | "SurvivalTeam21","true","TID_BATTLE_ROYALE_16","DefaultShowdown",,,,"DuoShowdown","Survival_21","Mordeus" 140 | "Heist14",,"TID_BANKHEIST_14B","Brawlywood",,,,"Heist","Bankheist_14","Lex" 141 | "Heist15","true","TID_BANKHEIST_15","Retropolis",,,,"Heist","Bankheist_15","OwenReds" 142 | "Gemgrab20","true","TID_GOLDRUSH_21","CastleCourtyard",,,,"GemGrab","Gemgrab_20", 143 | "Gemgrab21","true","TID_GOLDRUSH_21C","Retropolis",,,,"GemGrab","Gemgrab_21","Frep" 144 | "Siege9","true","TID_ROBO_WARS_2","Scrapyard",,,,"Siege","Siege_9","Mr. Lee" 145 | "Siege10",,"TID_ROBO_WARS_3","Scrapyard",,,,"Siege","Siege_10","G.W.B.S." 146 | "Ball12","true","TID_BALL_22","GrassfieldBeachBall",,,,"BrawlBall","Laserball_12","FeFaLah" 147 | "Ball13","true","TID_BALL_23","Grassfield",,,,"BrawlBall","Laserball_13","Chief Pekka" 148 | "Heist16","true","TID_BANKHEIST_16","CastleCourtyard",,,,"Heist","Bankheist_16","Thomas P." 149 | "Heist17","true","TID_BANKHEIST_17B","CastleCourtyard",,,,"Heist","Bankheist_17","Sir.Hocus" 150 | "Gemgrab22",,"TID_GOLDRUSH_22","Brawlywood",,,,"GemGrab","Gemgrab_22","Milan R." 151 | "Gemgrab23","true","TID_GOLDRUSH_33","Brawlywood",,,,"GemGrab","Gemgrab_23","OwenReds" 152 | "Wanted15","true","TID_WANTED_16","OasisBeach",,,,"Bounty","Wanted_15","Justin W." 153 | "Wanted16","true","TID_WANTED_17","OasisBeach",,,,"Bounty","Wanted_16","Ossama H." 154 | "Heist18","true","TID_BANKHEIST_18B","GiftShop",,,,"Heist","Bankheist_18","Mordeus" 155 | "Survival22","true","TID_BATTLE_ROYALE_22A","DefaultShowdown",,,,"Showdown","Survival_22","feimao" 156 | "SurvivalTeam22","true","TID_BATTLE_ROYALE_22A","DefaultShowdown",,,,"DuoShowdown","Survival_22","feimao" 157 | "Survival23","true","TID_BATTLE_ROYALE_23A","DefaultShowdown",,,,"Showdown","Survival_23","Cloudy" 158 | "SurvivalTeam23","true","TID_BATTLE_ROYALE_23A","DefaultShowdown",,,,"DuoShowdown","Survival_23","Cloudy" 159 | "Survival24","true","TID_BATTLE_ROYALE_24A","DefaultShowdown",,,,"Showdown","Survival_24","OwenReds" 160 | "SurvivalTeam24","true","TID_BATTLE_ROYALE_24A","DefaultShowdown",,,,"DuoShowdown","Survival_24","OwenReds" 161 | "Gemgrab24","true","TID_GOLDRUSH_24A","Retropolis",,,,"GemGrab","Gemgrab_24","Milan Ryba" 162 | "Wanted17","true","TID_WANTED_17B","CastleCourtyard",,,,"Bounty","Wanted_17","ToxinLab" 163 | "Ball14",,"TID_BALL_14A","Grassfield",,,,"BrawlBall","Laserball_14","OwenReds" 164 | "Ball15","true","TID_BALL_15A","Grassfield",,,,"BrawlBall","Laserball_15","Silver Beast" 165 | "Ball16",,"TID_BALL_16A","Grassfield",,,,"BrawlBall","Laserball_16","Binnyboy" 166 | "Ball17","true","TID_BALL_17A","Grassfield",,,,"BrawlBall","Laserball_17","Ellisimo" 167 | "Ball18",,"TID_BALL_18A","Grassfield",,,,"BrawlBall","Laserball_18","Frep" 168 | "Survival25","true","TID_BATTLE_ROYALE_30A","DefaultShowdown",,,,"Showdown","Survival_25","Mordeus" 169 | "SurvivalTeam25","true","TID_BATTLE_ROYALE_30A","DefaultShowdown",,,,"DuoShowdown","Survival_25","Mordeus" 170 | "BossRace1","true","TID_BOSS_RACE_1","DefaultShowdown",,,,"Takedown","BossRace_1", 171 | "BossRace2","true","TID_BOSS_RACE_2","DefaultShowdown",,,,"Takedown","BossRace_2","Mordeus" 172 | "BossRace3","true","TID_BOSS_RACE_3","DefaultShowdown",,,,"Takedown","BossRace_3", 173 | "BossRace4","true","TID_BOSS_RACE_4","DefaultShowdown",,,,"Takedown","BossRace_4", 174 | "BossRace5","true","TID_BOSS_RACE_5","IslandShowdown",,,,"Takedown","BossRace_5", 175 | "BossRace6","true","TID_BOSS_RACE_6","DefaultShowdown",,,,"Takedown","BossRace_6", 176 | "BossRace7","true","TID_BOSS_RACE_7","DefaultShowdown",,,,"Takedown","BossRace_7", 177 | "SoloBounty1","true","TID_LONESTAR_02","DefaultShowdown",,,,"LoneStar","Solobounty_2","_Shqdowz_" 178 | "SoloBounty2","true","TID_LONESTAR_03","DefaultShowdown",,,,"LoneStar","Solobounty_3","Cindy" 179 | "SoloBounty3","true","TID_LONESTAR_04","DefaultShowdown",,,,"LoneStar","Solobounty_4","iEnjoy" 180 | "SoloBounty4","true","TID_LONESTAR_05","DefaultShowdown",,,,"LoneStar","Solobounty_5","DustyBud" 181 | "SoloBounty5","true","TID_LONESTAR_06","DefaultShowdown",,,,"LoneStar","Solobounty_6","Frep" 182 | "SoloBounty6","true","TID_LONESTAR_07","DefaultShowdown",,,,"LoneStar","Solobounty_7","ToxinLab" 183 | "SoloBounty7","true","TID_LONESTAR_08","DefaultShowdown",,,,"LoneStar","Solobounty_8","OwenReds" 184 | "BossRace8","true","TID_BOSS_RACE_8","DefaultShowdown",,,,"Takedown","BossRace_8","-iLast" 185 | "BossRace9","true","TID_BOSS_RACE_9","DefaultShowdown",,,,"Takedown","BossRace_9","Binnyboy" 186 | "BossRace10","true","TID_BOSS_RACE_10","DefaultShowdown",,,,"Takedown","BossRace_10","OwenReds" 187 | "BossRace11","true","TID_BOSS_RACE_11","DefaultShowdown",,,,"Takedown","BossRace_11","Mordeus" 188 | "BossRace12","true","TID_BATTLE_ROYALE_18","DefaultShowdown",,,,"Takedown","BossRace_12","Chief Pekka" 189 | "BossRace13","true","TID_BOSS_RACE_13","DefaultShowdown",,,,"Takedown","BossRace_13","_Shqdowz_" 190 | "BossRace14","true","TID_BOSS_RACE_14","DefaultShowdown",,,,"Takedown","BossRace_14","Cloudy" 191 | "Graves1","true","TID_BATTLE_ROYALE_1","MortuaryShowdown",,,,"Showdown","Survival_1", 192 | "GravesTeam1","true","TID_BATTLE_ROYALE_1","MortuaryShowdown",,,,"DuoShowdown","Survival_1", 193 | "Graves2","true","TID_BATTLE_ROYALE_12","MortuaryShowdown",,,,"Showdown","Survival_12","Tony_A9" 194 | "GravesTeam2","true","TID_BATTLE_ROYALE_12","MortuaryShowdown",,,,"DuoShowdown","Survival_12","Tony_A9" 195 | "Graves3","true","TID_BATTLE_ROYALE_5","MortuaryShowdown",,,,"Showdown","Survival_33","Mordeus" 196 | "GravesTeam3","true","TID_BATTLE_ROYALE_5","MortuaryShowdown",,,,"DuoShowdown","Survival_33","Mordeus" 197 | "Graves4","true","TID_BATTLE_ROYALE_13","MortuaryShowdown",,,,"Showdown","Survival_15","Mordeus" 198 | "GravesTeam4","true","TID_BATTLE_ROYALE_13","MortuaryShowdown",,,,"DuoShowdown","Survival_15","Mordeus" 199 | "Graves5","true","TID_LONESTAR_01","MortuaryShowdown",,,,"Showdown","Solobounty_1","ash" 200 | "GravesTeam5","true","TID_LONESTAR_01","MortuaryShowdown",,,,"DuoShowdown","Solobounty_1","ash" 201 | "Graves6","true","TID_BATTLE_ROYALE_17","MortuaryShowdown",,,,"Showdown","Survival_14","Maxymus" 202 | "GravesTeam6","true","TID_BATTLE_ROYALE_17","MortuaryShowdown",,,,"DuoShowdown","Survival_14","Maxymus" 203 | "Graves7","true","TID_BATTLE_ROYALE_21","MortuaryShowdown",,,,"Showdown","Survival_18","Pentagonal Cubes" 204 | "GravesTeam7","true","TID_BATTLE_ROYALE_21","MortuaryShowdown",,,,"DuoShowdown","Survival_18","Pentagonal Cubes" 205 | "CaptureTheFlag2","true","TID_TROPHYTHIEVES_01","Arcade",,,,"CTF","CaptureTheFlag_2", 206 | "CaptureTheFlag3","true","TID_TROPHYTHIEVES_02","Arcade",,,,"CTF","CaptureTheFlag_3","Binnyboy" 207 | "CaptureTheFlag4","true","TID_TROPHYTHIEVES_03","Arcade",,,,"CTF","CaptureTheFlag_4","Binnyboy" 208 | "CaptureTheFlag5","true","TID_TROPHYTHIEVES_04","Arcade",,,,"CTF","CaptureTheFlag_5","OwenReds" 209 | "CaptureTheFlag6","true","TID_TROPHYTHIEVES_05","Arcade",,,,"CTF","CaptureTheFlag_6","ToxinLab" 210 | "CaptureTheFlag7","true","TID_TROPHYTHIEVES_06","Arcade",,,,"CTF","CaptureTheFlag_7","DustyBud" 211 | "CaptureTheFlag8","true","TID_TROPHYTHIEVES_07","Arcade",,,,"CTF","CaptureTheFlag_8","Cloudy" 212 | "Gemgrab25","true","TID_GOLDRUSH_35","DarrylsShip",,,,"GemGrab","Gemgrab_25","Cloudy" 213 | "Gemgrab26","true","TID_GOLDRUSH_37","DarrylsShip",,,,"GemGrab","Gemgrab_26","Cindy" 214 | "Gemgrab27","true","TID_GOLDRUSH_38","DarrylsShip",,,,"GemGrab","Gemgrab_27","ToxinLab" 215 | "Gemgrab28","true","TID_GOLDRUSH_43","Bazaar",,,,"GemGrab","Gemgrab_28","DustyBud" 216 | "Gemgrab29","true","TID_GOLDRUSH_44","DarrylsShip",,,,"GemGrab","Gemgrab_29","OwenReds" 217 | "Gemgrab30","true","TID_GOLDRUSH_45","DarrylsShip",,,,"GemGrab","Gemgrab_30","Chief Pekka" 218 | "Gemgrab31","true","TID_GOLDRUSH_36","DarrylsShip",,,,"GemGrab","Gemgrab_31","gradient33" 219 | "Heist19","true","TID_BANKHEIST_23","Oasis",,,,"Heist","Bankheist_19","Chief Pekka" 220 | "Heist20","true","TID_BANKHEIST_20","Oasis",,,,"Heist","Bankheist_20","gradient33" 221 | "Wanted18","true","TID_WANTED_23","Brawlywood",,,,"Bounty","Wanted_18","Biono" 222 | "Wanted19","true","TID_WANTED_20","Brawlywood",,,,"Bounty","Wanted_19","TCGLouis" 223 | "Survival26","true","TID_BATTLE_ROYALE_41","DefaultShowdown",,,,"Showdown","Survival_26","Frep" 224 | "SurvivalTeam26","true","TID_BATTLE_ROYALE_41","DefaultShowdown",,,,"DuoShowdown","Survival_26","Frep" 225 | "Survival27","true","TID_BATTLE_ROYALE_35","DefaultShowdown",,,,"Showdown","Survival_27","The Red Brawler" 226 | "SurvivalTeam27","true","TID_BATTLE_ROYALE_35","DefaultShowdown",,,,"DuoShowdown","Survival_27","The Red Brawler" 227 | "Survival28","true","TID_BATTLE_ROYALE_40","DefaultShowdown",,,,"Showdown","Survival_28","Gavyn1114" 228 | "SurvivalTeam28","true","TID_BATTLE_ROYALE_40","DefaultShowdown",,,,"DuoShowdown","Survival_28","Gavyn1114" 229 | "Survival29",,"TID_BATTLE_ROYALE_43","DefaultShowdown",,,,"Showdown","Survival_29","OwenReds" 230 | "SurvivalTeam29",,"TID_BATTLE_ROYALE_43","DefaultShowdown",,,,"DuoShowdown","Survival_29","OwenReds" 231 | "Survival30",,"TID_BATTLE_ROYALE_34","MortuaryShowdown",,,,"Showdown","Survival_30","Cloudy" 232 | "SurvivalTeam30",,"TID_BATTLE_ROYALE_34","MortuaryShowdown",,,,"DuoShowdown","Survival_30","Cloudy" 233 | "Survival31","true","TID_BATTLE_ROYALE_37","DefaultShowdown",,,,"Showdown","Survival_31","Binnyboy" 234 | "SurvivalTeam31","true","TID_BATTLE_ROYALE_37","DefaultShowdown",,,,"DuoShowdown","Survival_31","Binnyboy" 235 | "Survival32","true","TID_BATTLE_ROYALE_38","DefaultShowdown",,,,"Showdown","Survival_32","gradient33" 236 | "SurvivalTeam32","true","TID_BATTLE_ROYALE_38","DefaultShowdown",,,,"DuoShowdown","Survival_32","gradient33" 237 | "Survival33","true","TID_GOLDRUSH_46","MortuaryShowdown",,,,"Showdown","Survival_33","Mordeus" 238 | "SurvivalTeam33","true","TID_GOLDRUSH_46","MortuaryShowdown",,,,"DuoShowdown","Survival_33","Mordeus" 239 | "Ball19","true","TID_BALL_8","Grassfield",,,,"BrawlBall","Laserball_19", 240 | "Ball20","true","TID_BALL_9","Grassfield",,,,"BrawlBall","Laserball_20", 241 | "Ball21","true","TID_BALL_10","Grassfield",,,,"BrawlBall","Laserball_21", 242 | "Ball22","true","TID_BALL_11","Grassfield",,,,"BrawlBall","Laserball_22", 243 | "Ball23","true","TID_BALL_12","Grassfield",,,,"BrawlBall","Laserball_23", 244 | "Ball24","true","TID_BALL_13","Grassfield",,,,"BrawlBall","Laserball_24", 245 | "Ball25","true","TID_BALL_16","Grassfield",,,,"BrawlBall","Laserball_25", 246 | "Graves8","true","TID_BATTLE_ROYALE_6","MortuaryShowdown",,,,"Showdown","Survival_6", 247 | "GravesTeam8","true","TID_BATTLE_ROYALE_6","MortuaryShowdown",,,,"DuoShowdown","Survival_6", 248 | "KingOfHill1","true","TID_KING_OF_HILL_9","Arcade",,,,"KingOfHill","KingOfHill_1", 249 | "KingOfHill2","true","TID_KING_OF_HILL_11","Arcade",,,,"KingOfHill","KingOfHill_2", 250 | "KingOfHill3","true","TID_KING_OF_HILL_3","Arcade",,,,"KingOfHill","KingOfHill_3","Mordeus" 251 | "KingOfHill4","true","TID_KING_OF_HILL_4","CastleCourtyard",,,,"KingOfHill","KingOfHill_4","Mordeus" 252 | "KingOfHill5",,"TID_KING_OF_HILL_5","CastleCourtyard",,,,"KingOfHill","KingOfHill_5","Mordeus" 253 | "KingOfHill6","true","TID_KING_OF_HILL_6","Arcade",,,,"KingOfHill","KingOfHill_6","Mordeus" 254 | "KingOfHill7","true","TID_KING_OF_HILL_7","Arcade",,,,"KingOfHill","KingOfHill_7","Mordeus" 255 | "Ball26","true","TID_BALL_30","BBArena",,,,"BrawlBall","Laserball_26","Hypahn" 256 | "Ball27","true","TID_BALL_31","BBArena",,,,"BrawlBall","Laserball_27","DustyBud" 257 | "Ball28","true","TID_BALL_32","BBArena",,,,"BrawlBall","Laserball_28","S3nNy ツ" 258 | "Ball29",,"TID_BALL_33","BBArena",,,,"BrawlBall","Laserball_29","brawl123456789" 259 | "Ball30","true","TID_BALL_34","BBArena",,,,"BrawlBall","Laserball_30","Cloudy" 260 | "Survival34","true","TID_BATTLE_ROYALE_44","DefaultShowdown",,,,"Showdown","Survival_34","Mordeus" 261 | "SurvivalTeam34","true","TID_BATTLE_ROYALE_44","DefaultShowdown",,,,"DuoShowdown","Survival_34","Mordeus" 262 | "Ball6_PSG","true","TID_BALL_6","BBArena",,,,"BrawlBall","Laserball_6","Mordeus" 263 | "Ball9_PSG","true","TID_BALL_15","BBArena",,,,"BrawlBall","Laserball_9","Mordeus" 264 | "Ball26_PSG","true","TID_BALL_30","BBArena",,,,"BrawlBall","Laserball_26","Hypahn" 265 | "Siege15","true","TID_ROBO_WARS_15","Scrapyard",,,,"Siege","Siege_15","ChichoRD" 266 | "Siege16","true","TID_ROBO_WARS_16","Scrapyard",,,,"Siege","Siege_16","Joop" 267 | "Siege17","true","TID_ROBO_WARS_17","Scrapyard",,,,"Siege","Siege_17","OliveOil" 268 | "Wanted27","true","TID_WANTED_27","Bazaar",,,,"Bounty","Wanted_27","DustyBud" 269 | "Wanted28","true","TID_WANTED_28","Bazaar",,,,"Bounty","Wanted_28","tentien" 270 | "Heist27","true","TID_BANKHEIST_27","Bazaar",,,,"Heist","Bankheist_27","Chief Pekka" 271 | "Heist28","true","TID_BANKHEIST_28","Bazaar",,,,"Heist","Bankheist_28","ChichoRD" 272 | "Raid_TownCrush1","true","TID_RAID_TOWN_CRUSH_1","Minicity",,,,"BossFight_TownCrush","RaidTownCrush_1", 273 | "Survival45","true","TID_BATTLE_ROYALE_45","MortuaryShowdown",,,,"Showdown","Survival_45","PEACH" 274 | "SurvivalTeam45","true","TID_BATTLE_ROYALE_45","MortuaryShowdown",,,,"DuoShowdown","Survival_45","PEACH" 275 | "Survival47","true","TID_BATTLE_ROYALE_47","DefaultShowdown",,,,"Showdown","Survival_47","❤❤❤" 276 | "SurvivalTeam47","true","TID_BATTLE_ROYALE_47","DefaultShowdown",,,,"DuoShowdown","Survival_47","❤❤❤" 277 | "Survival49","true","TID_BATTLE_ROYALE_49","MortuaryShowdown",,,,"Showdown","Survival_49","iLast" 278 | "SurvivalTeam49","true","TID_BATTLE_ROYALE_49","MortuaryShowdown",,,,"DuoShowdown","Survival_49","iLast" 279 | "Survival50","true","TID_BATTLE_ROYALE_50","MortuaryShowdown",,,,"Showdown","Survival_50","Granny Smith" 280 | "SurvivalTeam50","true","TID_BATTLE_ROYALE_50","MortuaryShowdown",,,,"DuoShowdown","Survival_50","Granny Smith" 281 | "Survival51","true","TID_BATTLE_ROYALE_51","MortuaryShowdown",,,,"Showdown","Survival_51","Binnyboy" 282 | "SurvivalTeam51","true","TID_BATTLE_ROYALE_51","MortuaryShowdown",,,,"DuoShowdown","Survival_51","Binnyboy" 283 | "Survival52","true","TID_BATTLE_ROYALE_52","DefaultShowdown",,,,"Showdown","Survival_52","kawaiishark" 284 | "SurvivalTeam52","true","TID_BATTLE_ROYALE_52","DefaultShowdown",,,,"DuoShowdown","Survival_52","kawaiishark" 285 | "Survival53","true","TID_BATTLE_ROYALE_53","DefaultShowdown",,,,"Showdown","Survival_53","BubbyDraggo" 286 | "SurvivalTeam53","true","TID_BATTLE_ROYALE_53","DefaultShowdown",,,,"DuoShowdown","Survival_53","BubbyDraggo" 287 | "Survival54","true","TID_GOLDRUSH_46","MortuaryShowdown",,,,"Showdown","Survival_54","Mordeus" 288 | "SurvivalTeam54","true","TID_GOLDRUSH_46","MortuaryShowdown",,,,"DuoShowdown","Survival_54","Mordeus" 289 | "Survival48","true","TID_BATTLE_ROYALE_46","DefaultShowdown",,,,"Showdown","Survival_46","Nita!" 290 | "SurvivalTeam48","true","TID_BATTLE_ROYALE_46","DefaultShowdown",,,,"DuoShowdown","Survival_46","Nita!" 291 | "KingOfHill8","true","TID_GOLDRUSH_XMAS_3","CastleCourtyard",,,,"KingOfHill","KingOfHill_8", 292 | "KingOfHill9","true","TID_GOLDRUSH_55","Arcade",,,,"KingOfHill","KingOfHill_9", 293 | "KingOfHill10","true","TID_KING_OF_HILL_28","Arcade",,,,"KingOfHill","KingOfHill_10","Collab❤" 294 | "KingOfHill11","true","TID_KING_OF_HILL_18","Arcade",,,,"KingOfHill","KingOfHill_11","Mordeus" 295 | "KingOfHill12","true","TID_KING_OF_HILL_22","CastleCourtyard",,,,"KingOfHill","KingOfHill_12","Mordeus" 296 | "KingOfHill13",,"TID_KING_OF_HILL_23","Arcade",,,,"KingOfHill","KingOfHill_13","Mordeus" 297 | "KingOfHill14",,"TID_KING_OF_HILL_20","Brawlywood",,,,"KingOfHill","KingOfHill_14","Mordeus" 298 | "Wanted29",,"TID_GOLDRUSH_63","Brawlywood",,,,"Bounty","Wanted_29","Frank™" 299 | "Gemgrab32","true","TID_GOLDRUSH_32T","Arcade",,,,"GemGrab","Gemgrab_32", 300 | "Gemgrab33","true","TID_GOLDRUSH_33T","Bazaar",,,,"GemGrab","Gemgrab_33", 301 | "Gemgrab34","true","TID_GOLDRUSH_34T","Bazaar",,,,"GemGrab","Gemgrab_34", 302 | "KingOfHill15","true","TID_KING_OF_HILL_15F","Bazaar",,,,"KingOfHill","KingOfHill_15F", 303 | "KingOfHill16",,"TID_KING_OF_HILL_16F","Mortuary",,,,"KingOfHill","KingOfHill_16F", 304 | "Wanted30","true","TID_WANTED_30T","Bazaar",,,,"Bounty","Wanted_30", 305 | "Heist29","true","TID_BANKHEIST_29T","Default",,,,"Heist","Bankheist_29", 306 | "KingOfHill17","true","TID_KING_OF_HILL_30","Arcade",,,,"KingOfHill","KingOfHill_17", 307 | "KingOfHill18","true","TID_KING_OF_HILL_31","Arcade",,,,"KingOfHill","KingOfHill_18", 308 | "PlayerMapTemplate","true","TID_GOLDRUSH_1","Default",,,,"GemGrab","Gemgrab_1", 309 | "KingOfHill20",,"TID_KING_OF_HILL_20F","Mortuary",,,,"KingOfHill","KingOfHill_20F", 310 | "Graves9","true","TID_BATTLE_ROYALE_47","MortuaryShowdownHW",,,,"Showdown","Survival_47","❤❤❤" 311 | "GravesTeam9","true","TID_BATTLE_ROYALE_47","MortuaryShowdownHW",,,,"DuoShowdown","Survival_47","❤❤❤" 312 | "Graves10","true","TID_BATTLE_ROYALE_49","MortuaryShowdownHW",,,,"Showdown","Survival_49","iLast" 313 | "GravesTeam10","true","TID_BATTLE_ROYALE_49","MortuaryShowdownHW",,,,"DuoShowdown","Survival_49","iLast" 314 | "Graves11","true","TID_BATTLE_ROYALE_50","MortuaryShowdownHW",,,,"Showdown","Survival_50","Granny Smith" 315 | "GravesTeam11","true","TID_BATTLE_ROYALE_50","MortuaryShowdownHW",,,,"DuoShowdown","Survival_50","Granny Smith" 316 | "Graves12","true","TID_BATTLE_ROYALE_51","MortuaryShowdownHW",,,,"Showdown","Survival_51","Binnyboy" 317 | "GravesTeam12","true","TID_BATTLE_ROYALE_51","MortuaryShowdownHW",,,,"DuoShowdown","Survival_51","Binnyboy" 318 | "Graves13","true","TID_BATTLE_ROYALE_52","MortuaryShowdownHW",,,,"Showdown","Survival_52","kawaiishark" 319 | "GravesTeam13","true","TID_BATTLE_ROYALE_52","MortuaryShowdownHW",,,,"DuoShowdown","Survival_52","kawaiishark" 320 | "Graves14","true","TID_BATTLE_ROYALE_53","MortuaryShowdownHW",,,,"Showdown","Survival_53","BubbyDraggo" 321 | "GravesTeam14","true","TID_BATTLE_ROYALE_53","MortuaryShowdownHW",,,,"DuoShowdown","Survival_53","BubbyDraggo" 322 | "Graves15","true","TID_BATTLE_ROYALE_46","MortuaryShowdownHW",,,,"Showdown","Survival_46","Nita!" 323 | "GravesTeam15","true","TID_BATTLE_ROYALE_46","MortuaryShowdownHW",,,,"DuoShowdown","Survival_46","Nita!" 324 | "Coop5","true","TID_COOP_7","DefaultShowdown",,,,"RoboRumble","Coop_5", 325 | "Coop6","true","TID_COOP_8","MortuaryShowdown",,,,"RoboRumble","Coop_6", 326 | "BossFight5","true","TID_BOSS_8","Default",,,,"BigGame","BossFight_5", 327 | "BossFight6","true","TID_BOSS_7","Default",,,,"BigGame","BossFight_6", 328 | "Raid5","true","TID_RAID_4","DefaultShowdown",,,,"BossFight","Raid_5", 329 | "Raid6","true","TID_RAID_5","MortuaryShowdown",,,,"BossFight","Raid_6", 330 | "Gemgrab35","true","TID_GOLDRUSH_35C","CastleCourtyard",,,,"GemGrab","Gemgrab_35","*.+Ľûpųş+.*" 331 | "CaptureTheFlag9","true","TID_TROPHYTHIEVES_08","Arcade",,,,"CTF","CaptureTheFlag_9", 332 | "CaptureTheFlag10","true","TID_TROPHYTHIEVES_09","Arcade",,,,"CTF","CaptureTheFlag_10", 333 | "CaptureTheFlag11","true","TID_TROPHYTHIEVES_10","Arcade",,,,"CTF","CaptureTheFlag_11", 334 | "CaptureTheFlag12","true","TID_TROPHYTHIEVES_11","Arcade",,,,"CTF","CaptureTheFlag_12","Mordeus" 335 | "CaptureTheFlag13","true","TID_TROPHYTHIEVES_12","Arcade",,,,"CTF","CaptureTheFlag_13","Mordeus" 336 | "CaptureTheFlag14","true","TID_TROPHYTHIEVES_13","Arcade",,,,"CTF","CaptureTheFlag_14","Mordeus" 337 | "CaptureTheFlag15","true","TID_TROPHYTHIEVES_14","Arcade",,,,"CTF","CaptureTheFlag_15", 338 | "Siege19","true","TID_JAN2021MAPS_21","Scrapyard",,,,"Siege","Siege_19","Q16D (aka Świerszczu)" 339 | "Wanted20","true","TID_JAN2021MAPS_22","Brawlywood",,,,"Bounty","Wanted_20","AJ ( ˘ ³˘)" 340 | "Ball31","true","TID_JAN2021MAPS_5","Grassfield",,,,"BrawlBall","Laserball_31","McBastos" 341 | "Ball32","true","TID_JAN2021MAPS_2","BBArena",,,,"BrawlBall","Laserball_32","⚡MićoGamer⚡" 342 | "Ball33","true","TID_JAN2021MAPS_6","BBArena",,,,"BrawlBall","Laserball_33","No i Wont" 343 | "Ball34","true","TID_JAN2021MAPS_31","Grassfield",,,,"BrawlBall","Laserball_34","Mordeus" 344 | "Ball35","true","TID_JAN2021MAPS_7","BBArena",,,,"BrawlBall","Laserball_35","Frep" 345 | "Ball36","true","TID_JAN2021MAPS_8","BBArena",,,,"BrawlBall","Laserball_36","Ellisimo" 346 | "Gemgrab36","true","TID_JAN2021MAPS_4","CastleCourtyard",,,,"GemGrab","Gemgrab_36","TR | Miqu3" 347 | "Gemgrab37","true","TID_JAN2021MAPS_3","Brawlywood",,,,"GemGrab","Gemgrab_37","BK|PoneySwagg" 348 | "Gemgrab38","true","TID_JAN2021MAPS_17","Brawlywood",,,,"GemGrab","Gemgrab_38","RealCanadian" 349 | "Heist21","true","TID_JAN2021MAPS_19","CastleCourtyard",,,,"Heist","Bankheist_21","FeFaLah" 350 | "Heist22","true","TID_JAN2021MAPS_20","CastleCourtyard",,,,"Heist","Bankheist_22","BiohazarD" 351 | "KingOfHill21","true","TID_JAN2021MAPS_15","Arcade",,,,"KingOfHill","KingOfHill_21","TooManyPelican" 352 | "KingOfHill22","true","TID_JAN2021MAPS_9","Brawlywood",,,,"KingOfHill","KingOfHill_22","TCGLLight" 353 | "KingOfHill23","true","TID_JAN2021MAPS_10","Brawlywood",,,,"KingOfHill","KingOfHill_23","LynxRo" 354 | "KingOfHill24","true","TID_JAN2021MAPS_32","Brawlywood",,,,"KingOfHill","KingOfHill_24","captaincto" 355 | "Survival55","true","TID_JAN2021MAPS_33","MortuaryShowdown",,,,"Showdown","Survival_55","AmirKaka" 356 | "SurvivalTeam55","true","TID_JAN2021MAPS_33","MortuaryShowdown",,,,"DuoShowdown","Survival_55","AmirKaka" 357 | "ProtectKing1","true","MAP 1","Brawlywood",,,,"ProtectKing","Wanted_17", 358 | "ProtectKing2","true","MAP 2","Default",,,,"ProtectKing","KingOfHill_1", 359 | "ProtectKing3","true","MAP 3","Arcade",,,,"ProtectKing","KingOfHill_3", 360 | "ProtectKing4","true","MAP 4","CastleCourtyard",,,,"ProtectKing","Gemgrab_4", 361 | "ProtectKing5","true","MAP 5","Default",,,,"ProtectKing","Wanted_9", 362 | "ProtectKing6","true","MAP 6","Bazaar",,,,"ProtectKing","Gemgrab_7", 363 | "Knockout1",,"TID_KNOCKOUT_01","CastleCourtyard",,,,"Knockout","Knockout_1", 364 | "Knockout2",,"TID_KNOCKOUT_02","Mortuary",,,,"Knockout","Knockout_2", 365 | "Knockout3","true","TID_KNOCKOUT_03","CastleCourtyard",,,,"Knockout","Knockout_3", 366 | "Knockout4","true","TID_KNOCKOUT_04","CastleCourtyard",,,,"Knockout","Knockout_4", 367 | "Knockout5","true","TID_KNOCKOUT_05","CastleCourtyard",,,,"Knockout","Knockout_5", 368 | "Knockout6","true","TID_KNOCKOUT_06","CastleCourtyard",,,,"Knockout","Knockout_6", 369 | "Knockout7","true","TID_KNOCKOUT_07","CastleCourtyard",,,,"Knockout","Knockout_7", 370 | "Knockout8",,"TID_MAR2021MAPS_14","CastleCourtyard",,,,"Knockout","Knockout_8", 371 | "Knockout9",,"TID_MAR2021MAPS_10","Brawlywood",,,,"Knockout","Knockout_9", 372 | "Knockout10","true","TID_MAR2021MAPS_8","CastleCourtyard",,,,"Knockout","Knockout_10", 373 | "HoldTheBall6","true","TID_HOLDTROPHY_06","Arcade",,,,"HoldTheBall","Dribble_06", 374 | "HoldTheBall7","true","TID_HOLDTROPHY_07","Arcade",,,,"HoldTheBall","Dribble_07", 375 | "HoldTheBall8","true","TID_HOLDTROPHY_08","Arcade",,,,"HoldTheBall","Dribble_08", 376 | "HoldTheBall9","true","TID_HOLDTROPHY_09","Arcade",,,,"HoldTheBall","Dribble_09", 377 | "HoldTheBall10","true","TID_HOLDTROPHY_10","Arcade",,,,"HoldTheBall","Dribble_10", 378 | "HoldTheBall11","true","TID_HOLDTROPHY_11","Arcade",,,,"HoldTheBall","Dribble_11", 379 | "HoldTheBall12","true","TID_HOLDTROPHY_05","Arcade",,,,"HoldTheBall","Dribble_12", 380 | "VolleyBrawl1","true","TID_VOLLEY_01","BBArenaVolley",,,,"VolleyBrawl","VolleyBrawl_1", 381 | "VolleyBrawl2","true","TID_VOLLEY_02","BBArenaVolley",,,,"VolleyBrawl","VolleyBrawl_2", 382 | "VolleyBrawl3","true","TID_VOLLEY_03","BBArenaVolley",,,,"VolleyBrawl","VolleyBrawl_3", 383 | "VolleyBrawl4","true","TID_VOLLEY_04","BBArenaVolley",,,,"VolleyBrawl","VolleyBrawl_4", 384 | "VolleyBrawl5","true","TID_VOLLEY_05","BBArenaVolley",,,,"VolleyBrawl","VolleyBrawl_5", 385 | "VolleyBrawl6","true","TID_VOLLEY_06","BBArenaVolley",,,,"VolleyBrawl","VolleyBrawl_6", 386 | "VolleyBrawl7","true","TID_VOLLEY_07","BBArenaVolley",,,,"VolleyBrawl","VolleyBrawl_7", 387 | "BasketBrawl1","true","TID_BASKET_01","ArcadeBasket",,,,"BasketBrawl","BasketBrawl_1", 388 | "BasketBrawl2","true","TID_BASKET_02","ArcadeBasket",,,,"BasketBrawl","BasketBrawl_2", 389 | "BasketBrawl3","true","TID_BASKET_03","ArcadeBasket",,,,"BasketBrawl","BasketBrawl_3", 390 | "BasketBrawl4","true","TID_BASKET_04","ArcadeBasket",,,,"BasketBrawl","BasketBrawl_4", 391 | "BasketBrawl5","true","TID_BASKET_05","ArcadeBasket",,,,"BasketBrawl","BasketBrawl_5", 392 | "BasketBrawl6","true","TID_BASKET_06","ArcadeBasket",,,,"BasketBrawl","BasketBrawl_6", 393 | "BasketBrawl7","true","TID_BASKET_07","ArcadeBasket",,,,"BasketBrawl","BasketBrawl_7", 394 | "Survival56",,"TID_SD_JUNE21_1","MortuaryShowdown",,,,"Showdown","Survival_56","Mordeus" 395 | "SurvivalTeam56",,"TID_SD_JUNE21_1","MortuaryShowdown",,,,"DuoShowdown","Survival_56","Mordeus" 396 | "Survival58","true","TID_SD_JUNE21_3","DefaultShowdown",,,,"Showdown","Survival_58","DarkKnight" 397 | "SurvivalTeam58","true","TID_SD_JUNE21_3","DefaultShowdown",,,,"DuoShowdown","Survival_58","DarkKnight" 398 | "Survival59","true","TID_SD_JUNE21_4","MortuaryShowdown",,,,"Showdown","Survival_59","nitis" 399 | "SurvivalTeam59","true","TID_SD_JUNE21_4","MortuaryShowdown",,,,"DuoShowdown","Survival_59","nitis" 400 | "Survival60",,"TID_SD_JUNE21_5","MortuaryShowdown",,,,"Showdown","Survival_60","Vortex12" 401 | "SurvivalTeam60",,"TID_SD_JUNE21_5","MortuaryShowdown",,,,"DuoShowdown","Survival_60","Vortex12" 402 | "Survival61","true","TID_SD_JUNE21_6","DefaultShowdown",,,,"Showdown","Survival_61", 403 | "SurvivalTeam61","true","TID_SD_JUNE21_6","DefaultShowdown",,,,"DuoShowdown","Survival_61", 404 | "Survival62","true","JUNEMAP7_PLACEHOLDER","MortuaryShowdown",,,,"Showdown","Survival_62", 405 | "SurvivalTeam62","true","JUNEMAP7_PLACEHOLDER","MortuaryShowdown",,,,"DuoShowdown","Survival_62", 406 | "Gemgrab39","true","TID_GG_JUNE21_1","Brawlywood",,,,"GemGrab","Gemgrab_39","PhotonWinz" 407 | "Gemgrab40",,"TID_GG_JUNE21_2","Mortuary",,,,"GemGrab","Gemgrab_40","Pufferfish" 408 | "Gemgrab41","true","TID_GG_JUNE21_3","Arcade",,,,"GemGrab","Gemgrab_41","Imfernol" 409 | "Gemgrab42","true","TID_GG_JUNE21_4","CastleCourtyard",,,,"GemGrab","Gemgrab_42","Goomy4" 410 | "Gemgrab43","true","TID_GG_JUNE21_5","Arcade",,,,"GemGrab","Gemgrab_43", 411 | "Gemgrab44","true","JUNEMAP6_PLACEHOLDER","Mine",,,,"GemGrab","Gemgrab_44", 412 | "Ball37","true","TID_BB_JUNE21_1","BBArena",,,,"BrawlBall","Laserball_37","OwenReds" 413 | "Ball38","true","TID_BB_JUNE21_2","BBArena",,,,"BrawlBall","Laserball_38","Ellisimo" 414 | "Ball39","true","TID_BB_JUNE21_3","BBArena",,,,"BrawlBall","Laserball_39","Cloudy" 415 | "Ball40","true","TID_BB_JUNE21_4","BBArena",,,,"BrawlBall","Laserball_40","Galactic" 416 | "Ball41",,"TID_BB_JUNE21_5","BBArena",,,,"BrawlBall","Laserball_41","amazingSuper" 417 | "Ball42","true","JUNEMAP6_PLACEHOLDER","BBArena",,,,"BrawlBall","Laserball_42", 418 | "Ball43","true","JUNEMAP7_PLACEHOLDER","BBArena",,,,"BrawlBall","Laserball_43", 419 | "Heist23","true","TID_HEIST_JUNE21_1","CastleCourtyard",,,,"Heist","Bankheist_23","STB" 420 | "Heist24","true","TID_HEIST_JUNE21_2","CastleCourtyard",,,,"Heist","Bankheist_24","DarkKnight" 421 | "Heist25","true","TID_HEIST_JUNE21_3","CastleCourtyard",,,,"Heist","Bankheist_25","DarkAngel_821" 422 | "Heist26","true","JUNEMAP4_PLACEHOLDER","CastleCourtyard",,,,"Heist","Bankheist_26", 423 | "KingOfHill25","true","TID_HZ_JUNE21_1","Brawlywood",,,,"KingOfHill","KingOfHill_25","Koolreaper" 424 | "KingOfHill26","true","TID_HZ_JUNE21_2","Brawlywood",,,,"KingOfHill","KingOfHill_26","RealCanadian ;D" 425 | "KingOfHill27","true","TID_HZ_JUNE21_3","Brawlywood",,,,"KingOfHill","KingOfHill_27","Sarangwon" 426 | "KingOfHill28","true","JUNEMAP4_PLACEHOLDER","Brawlywood",,,,"KingOfHill","KingOfHill_28", 427 | "Wanted21","true","TID_BOUNTY_JUNE21_1","CastleCourtyard",,,,"Bounty","Wanted_21","Vortex12" 428 | "Wanted22","true","TID_BOUNTY_JUNE21_2","CastleCourtyard",,,,"Bounty","Wanted_22", 429 | "Siege20","true","TID_SIEGE_JUNE21_1","Scrapyard",,,,"Siege","Siege_20","RealCanadian ;D" 430 | "Siege21","true","TID_SIEGE_JUNE21_2","Scrapyard",,,,"Siege","Siege_21", 431 | "Knockout11","true","TID_KO_JUNE21_1","Brawlywood",,,,"Knockout","Knockout_11", 432 | "Knockout12",,"TID_KO_JUNE21_2","Brawlywood",,,,"Knockout","Knockout_12", 433 | "Survival63",,"TID_SHOWDOWN_63","DefaultShowdown",,,,"Showdown","Survival_63","DeterminedDaaf" 434 | "SurvivalTeam63",,"TID_SHOWDOWN_63","DefaultShowdown",,,,"DuoShowdown","Survival_63","DeterminedDaaf" 435 | "Survival64","true","SD_AUGCOMP3","DefaultShowdown",,,,"Showdown","Survival_64", 436 | "SurvivalTeam64","true","SD_AUGCOMP4","DefaultShowdown",,,,"DuoShowdown","Survival_64", 437 | "Survival65","true","SD_AUGCOMP5","DefaultShowdown",,,,"Showdown","Survival_65", 438 | "SurvivalTeam65","true","SD_AUGCOMP6","DefaultShowdown",,,,"DuoShowdown","Survival_65", 439 | "Survival66",,"TID_SHOWDOWN_66","DefaultShowdown",,,,"Showdown","Survival_66","Pon4ik" 440 | "SurvivalTeam66",,"TID_SHOWDOWN_66","DefaultShowdown",,,,"DuoShowdown","Survival_66","Pon4ik" 441 | "Knockout13",,"TID_KNOCKOUT_13","Retropolis",,,,"Knockout","Knockout_13","Poierg" 442 | "Knockout14","true","KO_AUGCOMP2","Retropolis",,,,"Knockout","Knockout_14", 443 | "Knockout15",,"TID_KNOCKOUT_15","Retropolis",,,,"Knockout","Knockout_15","JavQuek" 444 | "Heist30",,"TID_HEIST_30","Retropolis",,,,"Heist","Bankheist_30","my name is.." 445 | "Heist31","true","HEIST_AUGCOMP2","Retropolis",,,,"Heist","Bankheist_31", 446 | "Heist32",,"TID_HEIST_32","Retropolis",,,,"Heist","Bankheist_32","TooManyPelican" 447 | "Wanted23",,"TID_BOUNTY_23","Retropolis",,,,"Bounty","Wanted_23","MagicalAz1" 448 | "Wanted24",,"TID_BOUNTY_24","Retropolis",,,,"Bounty","Wanted_24","Edy" 449 | "Wanted25","true","BOUNTY_AUGCOMP2","Retropolis",,,,"Bounty","Wanted_25", 450 | "Siege22","true","SIEGE_AUGCOMP1","Scrapyard",,,,"Siege","Siege_22", 451 | "Siege23",,"TID_SIEGE_23","Scrapyard",,,,"Siege","Siege_23","fatbeandee" 452 | "Siege24",,"TID_SIEGE_24","Scrapyard",,,,"Siege","Siege_24","DustyBud" 453 | "KingOfHill29",,"TID_HOTZONE_29","Retropolis",,,,"KingOfHill","KingOfHill_29","TooManyPelican" 454 | "KingOfHill30","true","HZ_AUGCOMP2","Retropolis",,,,"KingOfHill","KingOfHill_30", 455 | "KingOfHill31",,"TID_HOTZONE_31","Retropolis",,,,"KingOfHill","KingOfHill_31","Oblivious | Vibez" 456 | "Ball44","true","BB_AUGCOMP1","Grassfield",,,,"BrawlBall","Laserball_44", 457 | "Ball45",,"TID_BRAWLBALL_45","Grassfield",,,,"BrawlBall","Laserball_45","IAmBread" 458 | "Ball46",,"TID_BRAWLBALL_46","Grassfield",,,,"BrawlBall","Laserball_46","Oski_01" 459 | "Gemgrab45",,"TID_GEMGRAB_45","Retropolis",,,,"GemGrab","Gemgrab_45","Brunoistrash" 460 | "Gemgrab46",,"TID_GEMGRAB_46","Retropolis",,,,"GemGrab","Gemgrab_46","Lost Lukas" 461 | "Gemgrab47","true","GG_AUGCOMP3","Retropolis",,,,"GemGrab","Gemgrab_47", 462 | --------------------------------------------------------------------------------