ddnet/datasrc/seven/network.py

472 lines
11 KiB
Python

from .datatypes import Enum, Flags, NetArray, NetBool, NetEnum, NetEvent, NetFlag, NetIntAny, NetIntRange, NetMessage, NetObject, NetString, NetStringStrict, NetTick
Pickups = Enum("PICKUP", ["HEALTH", "ARMOR", "GRENADE", "SHOTGUN", "LASER", "NINJA", "GUN", "HAMMER"])
Emotes = Enum("EMOTE", ["NORMAL", "PAIN", "HAPPY", "SURPRISE", "ANGRY", "BLINK"])
Emoticons = Enum("EMOTICON", ["OOP", "EXCLAMATION", "HEARTS", "DROP", "DOTDOT", "MUSIC", "SORRY", "GHOST", "SUSHI", "SPLATTEE", "DEVILTEE", "ZOMG", "ZZZ", "WTF", "EYES", "QUESTION"])
Votes = Enum("VOTE", ["UNKNOWN", "START_OP", "START_KICK", "START_SPEC", "END_ABORT", "END_PASS", "END_FAIL"]) # todo 0.8: add RUN_OP, RUN_KICK, RUN_SPEC; rem UNKNOWN
ChatModes = Enum("CHAT", ["NONE", "ALL", "TEAM", "WHISPER"])
PlayerFlags = Flags("PLAYERFLAG", ["ADMIN", "CHATTING", "SCOREBOARD", "READY", "DEAD", "WATCHING", "BOT", "AIM"])
GameFlags = Flags("GAMEFLAG", ["TEAMS", "FLAGS", "SURVIVAL", "RACE"])
GameStateFlags = Flags("GAMESTATEFLAG", ["WARMUP", "SUDDENDEATH", "ROUNDOVER", "GAMEOVER", "PAUSED", "STARTCOUNTDOWN"])
CoreEventFlags = Flags("COREEVENTFLAG", ["GROUND_JUMP", "AIR_JUMP", "HOOK_ATTACH_PLAYER", "HOOK_ATTACH_GROUND", "HOOK_HIT_NOHOOK"])
RaceFlags = Flags("RACEFLAG", ["HIDE_KILLMSG", "FINISHMSG_AS_CHAT", "KEEP_WANTED_WEAPON"])
GameMsgIds = Enum("GAMEMSG", ["TEAM_SWAP", "SPEC_INVALIDID", "TEAM_SHUFFLE", "TEAM_BALANCE", "CTF_DROP", "CTF_RETURN",
"TEAM_ALL", "TEAM_BALANCE_VICTIM", "CTF_GRAB",
"CTF_CAPTURE",
"GAME_PAUSED"]) # todo 0.8: sort (1 para)
RawHeader = '''
enum
{
INPUT_STATE_MASK=0x3f
};
enum
{
TEAM_SPECTATORS=-1,
TEAM_RED,
TEAM_BLUE,
NUM_TEAMS,
FLAG_MISSING=-3,
FLAG_ATSTAND,
FLAG_TAKEN,
SPEC_FREEVIEW=0,
SPEC_PLAYER,
SPEC_FLAGRED,
SPEC_FLAGBLUE,
NUM_SPECMODES,
SKINPART_BODY = 0,
SKINPART_MARKING,
SKINPART_DECORATION,
SKINPART_HANDS,
SKINPART_FEET,
SKINPART_EYES,
NUM_SKINPARTS,
};
'''
Enums = [
Pickups,
Emotes,
Emoticons,
Votes,
ChatModes,
GameMsgIds,
]
Flags = [
PlayerFlags,
GameFlags,
GameStateFlags,
CoreEventFlags,
RaceFlags,
]
Objects = [
NetObject("PlayerInput", [
NetIntRange("m_Direction", -1, 1),
NetIntAny("m_TargetX"),
NetIntAny("m_TargetY"),
NetBool("m_Jump"),
NetIntAny("m_Fire"),
NetBool("m_Hook"),
NetFlag("m_PlayerFlags", PlayerFlags),
NetIntRange("m_WantedWeapon", 0, 'NUM_WEAPONS-1'),
NetIntAny("m_NextWeapon"),
NetIntAny("m_PrevWeapon"),
]),
NetObject("Projectile", [
NetIntAny("m_X"),
NetIntAny("m_Y"),
NetIntAny("m_VelX"),
NetIntAny("m_VelY"),
NetIntRange("m_Type", 0, 'NUM_WEAPONS-1'),
NetTick("m_StartTick"),
]),
NetObject("Laser", [
NetIntAny("m_X"),
NetIntAny("m_Y"),
NetIntAny("m_FromX"),
NetIntAny("m_FromY"),
NetTick("m_StartTick"),
]),
NetObject("Pickup", [
NetIntAny("m_X"),
NetIntAny("m_Y"),
NetEnum("m_Type", Pickups),
]),
NetObject("Flag", [
NetIntAny("m_X"),
NetIntAny("m_Y"),
NetIntRange("m_Team", 'TEAM_RED', 'TEAM_BLUE')
]),
NetObject("GameData", [
NetTick("m_GameStartTick"),
NetFlag("m_GameStateFlags", GameStateFlags),
NetTick("m_GameStateEndTick"),
]),
NetObject("GameDataTeam", [
NetIntAny("m_TeamscoreRed"),
NetIntAny("m_TeamscoreBlue"),
]),
NetObject("GameDataFlag", [
NetIntRange("m_FlagCarrierRed", 'FLAG_MISSING', 'MAX_CLIENTS-1'),
NetIntRange("m_FlagCarrierBlue", 'FLAG_MISSING', 'MAX_CLIENTS-1'),
NetTick("m_FlagDropTickRed"),
NetTick("m_FlagDropTickBlue"),
]),
NetObject("CharacterCore", [
NetTick("m_Tick"),
NetIntAny("m_X"),
NetIntAny("m_Y"),
NetIntAny("m_VelX"),
NetIntAny("m_VelY"),
NetIntAny("m_Angle"),
NetIntRange("m_Direction", -1, 1),
NetIntRange("m_Jumped", 0, 3),
NetIntRange("m_HookedPlayer", -1, 'MAX_CLIENTS-1'),
NetIntRange("m_HookState", -1, 5),
NetIntRange("m_HookTick", 0, 'max_int'),
NetIntAny("m_HookX"),
NetIntAny("m_HookY"),
NetIntAny("m_HookDx"),
NetIntAny("m_HookDy"),
]),
NetObject("Character:CharacterCore", [
NetIntRange("m_Health", 0, 10),
NetIntRange("m_Armor", 0, 10),
NetIntAny("m_AmmoCount"),
NetIntRange("m_Weapon", 0, 'NUM_WEAPONS-1'),
NetEnum("m_Emote", Emotes),
NetTick("m_AttackTick"),
NetFlag("m_TriggeredEvents", CoreEventFlags),
]),
NetObject("PlayerInfo", [
NetFlag("m_PlayerFlags", PlayerFlags),
NetIntAny("m_Score"),
NetIntAny("m_Latency"),
]),
NetObject("SpectatorInfo", [
NetIntRange("m_SpecMode", 0, 'NUM_SPECMODES-1'),
NetIntRange("m_SpectatorId", -1, 'MAX_CLIENTS-1'),
NetIntAny("m_X"),
NetIntAny("m_Y"),
]),
## Demo
NetObject("De_ClientInfo", [
NetBool("m_Local"),
NetIntRange("m_Team", 'TEAM_SPECTATORS', 'TEAM_BLUE'),
NetArray(NetIntAny("m_aName"), 4),
NetArray(NetIntAny("m_aClan"), 3),
NetIntAny("m_Country"),
NetArray(NetArray(NetIntAny("m_aaSkinPartNames"), 6), 6),
NetArray(NetBool("m_aUseCustomColors"), 6),
NetArray(NetIntAny("m_aSkinPartColors"), 6),
]),
NetObject("De_GameInfo", [
NetFlag("m_GameFlags", GameFlags),
NetIntRange("m_ScoreLimit", 0, 'max_int'),
NetIntRange("m_TimeLimit", 0, 'max_int'),
NetIntRange("m_MatchNum", 0, 'max_int'),
NetIntRange("m_MatchCurrent", 0, 'max_int'),
]),
NetObject("De_TuneParams", [
# todo: should be done differently
NetArray(NetIntAny("m_aTuneParams"), 32),
]),
## Events
NetEvent("Common", [
NetIntAny("m_X"),
NetIntAny("m_Y"),
]),
NetEvent("Explosion:Common", []),
NetEvent("Spawn:Common", []),
NetEvent("HammerHit:Common", []),
NetEvent("Death:Common", [
NetIntRange("m_ClientId", 0, 'MAX_CLIENTS-1'),
]),
NetEvent("SoundWorld:Common", [
NetIntRange("m_SoundId", 0, 'NUM_SOUNDS-1'),
]),
NetEvent("Damage:Common", [ # Unused yet
NetIntRange("m_ClientId", 0, 'MAX_CLIENTS-1'),
NetIntAny("m_Angle"),
NetIntRange("m_HealthAmount", 0, 9),
NetIntRange("m_ArmorAmount", 0, 9),
NetBool("m_Self"),
]),
## Race
# todo 0.8: move up
NetObject("PlayerInfoRace", [
NetTick("m_RaceStartTick"),
]),
NetObject("GameDataRace", [
NetIntRange("m_BestTime", -1, 'max_int'),
NetIntRange("m_Precision", 0, 3),
NetFlag("m_RaceFlags", RaceFlags),
]),
]
Messages = [
### Server messages
NetMessage("Sv_Motd", [
NetString("m_pMessage"),
]),
NetMessage("Sv_Broadcast", [
NetString("m_pMessage"),
]),
NetMessage("Sv_Chat", [
NetIntRange("m_Mode", 0, 'NUM_CHATS-1'),
NetIntRange("m_ClientId", -1, 'MAX_CLIENTS-1'),
NetIntRange("m_TargetId", -1, 'MAX_CLIENTS-1'),
NetStringStrict("m_pMessage"),
]),
NetMessage("Sv_Team", [
NetIntRange("m_ClientId", -1, 'MAX_CLIENTS-1'),
NetIntRange("m_Team", 'TEAM_SPECTATORS', 'TEAM_BLUE'),
NetBool("m_Silent"),
NetTick("m_CooldownTick"),
]),
NetMessage("Sv_KillMsg", [
NetIntRange("m_Killer", -2, 'MAX_CLIENTS-1'),
NetIntRange("m_Victim", 0, 'MAX_CLIENTS-1'),
NetIntRange("m_Weapon", -3, 'NUM_WEAPONS-1'),
NetIntAny("m_ModeSpecial"),
]),
NetMessage("Sv_TuneParams", []),
NetMessage("Unused", []),
NetMessage("Sv_ReadyToEnter", []),
NetMessage("Sv_WeaponPickup", [
NetIntRange("m_Weapon", 0, 'NUM_WEAPONS-1'),
]),
NetMessage("Sv_Emoticon", [
NetIntRange("m_ClientId", 0, 'MAX_CLIENTS-1'),
NetEnum("m_Emoticon", Emoticons),
]),
NetMessage("Sv_VoteClearOptions", []),
NetMessage("Sv_VoteOptionListAdd", []),
NetMessage("Sv_VoteOptionAdd", [
NetStringStrict("m_pDescription"),
]),
NetMessage("Sv_VoteOptionRemove", [
NetStringStrict("m_pDescription"),
]),
NetMessage("Sv_VoteSet", [
NetIntRange("m_ClientId", -1, 'MAX_CLIENTS-1'),
NetEnum("m_Type", Votes),
NetIntRange("m_Timeout", 0, 60),
NetStringStrict("m_pDescription"),
NetStringStrict("m_pReason"),
]),
NetMessage("Sv_VoteStatus", [
NetIntRange("m_Yes", 0, 'MAX_CLIENTS'),
NetIntRange("m_No", 0, 'MAX_CLIENTS'),
NetIntRange("m_Pass", 0, 'MAX_CLIENTS'),
NetIntRange("m_Total", 0, 'MAX_CLIENTS'),
]),
NetMessage("Sv_ServerSettings", [
NetBool("m_KickVote"),
NetIntRange("m_KickMin", 0, 'MAX_CLIENTS'),
NetBool("m_SpecVote"),
NetBool("m_TeamLock"),
NetBool("m_TeamBalance"),
NetIntRange("m_PlayerSlots", 0, 'MAX_CLIENTS'),
]),
NetMessage("Sv_ClientInfo", [
NetIntRange("m_ClientId", 0, 'MAX_CLIENTS-1'),
NetBool("m_Local"),
NetIntRange("m_Team", 'TEAM_SPECTATORS', 'TEAM_BLUE'),
NetStringStrict("m_pName"),
NetStringStrict("m_pClan"),
NetIntAny("m_Country"),
NetArray(NetStringStrict("m_apSkinPartNames"), 6),
NetArray(NetBool("m_aUseCustomColors"), 6),
NetArray(NetIntAny("m_aSkinPartColors"), 6),
NetBool("m_Silent"),
]),
NetMessage("Sv_GameInfo", [
NetFlag("m_GameFlags", GameFlags),
NetIntRange("m_ScoreLimit", 0, 'max_int'),
NetIntRange("m_TimeLimit", 0, 'max_int'),
NetIntRange("m_MatchNum", 0, 'max_int'),
NetIntRange("m_MatchCurrent", 0, 'max_int'),
]),
NetMessage("Sv_ClientDrop", [
NetIntRange("m_ClientId", 0, 'MAX_CLIENTS-1'),
NetStringStrict("m_pReason"),
NetBool("m_Silent"),
]),
NetMessage("Sv_GameMsg", []),
## Demo messages
NetMessage("De_ClientEnter", [
NetStringStrict("m_pName"),
NetIntRange("m_ClientId", -1, 'MAX_CLIENTS-1'),
NetIntRange("m_Team", 'TEAM_SPECTATORS', 'TEAM_BLUE'),
]),
NetMessage("De_ClientLeave", [
NetStringStrict("m_pName"),
NetIntRange("m_ClientId", -1, 'MAX_CLIENTS-1'),
NetStringStrict("m_pReason"),
]),
### Client messages
NetMessage("Cl_Say", [
NetIntRange("m_Mode", 0, 'NUM_CHATS-1'),
NetIntRange("m_Target", -1, 'MAX_CLIENTS-1'),
NetStringStrict("m_pMessage"),
]),
NetMessage("Cl_SetTeam", [
NetIntRange("m_Team", 'TEAM_SPECTATORS', 'TEAM_BLUE'),
]),
NetMessage("Cl_SetSpectatorMode", [
NetIntRange("m_SpecMode", 0, 'NUM_SPECMODES-1'),
NetIntRange("m_SpectatorId", -1, 'MAX_CLIENTS-1'),
]),
NetMessage("Cl_StartInfo", [
NetStringStrict("m_pName"),
NetStringStrict("m_pClan"),
NetIntAny("m_Country"),
NetArray(NetStringStrict("m_apSkinPartNames"), 6),
NetArray(NetBool("m_aUseCustomColors"), 6),
NetArray(NetIntAny("m_aSkinPartColors"), 6),
]),
NetMessage("Cl_Kill", []),
NetMessage("Cl_ReadyChange", []),
NetMessage("Cl_Emoticon", [
NetEnum("m_Emoticon", Emoticons),
]),
NetMessage("Cl_Vote", [
NetIntRange("m_Vote", -1, 1),
]),
NetMessage("Cl_CallVote", [
NetStringStrict("m_pType"),
NetStringStrict("m_pValue"),
NetStringStrict("m_pReason"),
NetBool("m_Force"),
]),
# todo 0.8: move up
NetMessage("Sv_SkinChange", [
NetIntRange("m_ClientId", 0, 'MAX_CLIENTS-1'),
NetArray(NetStringStrict("m_apSkinPartNames"), 6),
NetArray(NetBool("m_aUseCustomColors"), 6),
NetArray(NetIntAny("m_aSkinPartColors"), 6),
]),
NetMessage("Cl_SkinChange", [
NetArray(NetStringStrict("m_apSkinPartNames"), 6),
NetArray(NetBool("m_aUseCustomColors"), 6),
NetArray(NetIntAny("m_aSkinPartColors"), 6),
]),
## Race
NetMessage("Sv_RaceFinish", [
NetIntRange("m_ClientId", 0, 'MAX_CLIENTS-1'),
NetIntRange("m_Time", -1, 'max_int'),
NetIntAny("m_Diff"),
NetBool("m_RecordPersonal"),
NetBool("m_RecordServer", default=False),
]),
NetMessage("Sv_Checkpoint", [
NetIntAny("m_Diff"),
]),
NetMessage("Sv_CommandInfo", [
NetStringStrict("m_pName"),
NetStringStrict("m_pArgsFormat"),
NetStringStrict("m_pHelpText")
]),
NetMessage("Sv_CommandInfoRemove", [
NetStringStrict("m_pName")
]),
NetMessage("Cl_Command", [
NetStringStrict("m_pName"),
NetStringStrict("m_pArguments")
]),
]