diff --git a/README.md b/README.md index 663ae94c..7a8fd1f0 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,7 @@ sudo brew install cmake freetype sdl2 | sv_random_spawn | 1 | 0 | 1 | Activates random spawns | | sv_random_spawn_tries | 100 | 0 | 9999 | Tries for players to spawn randomly | | sv_random_spawn_max_score | 100 | 0 | 9999 | Tries for players to spawn randomly | +| sv_party_mode | 0 | 0 | 1 | Random Weapons each round | ## Contributing diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index ac526c52..c81f276d 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -148,19 +148,8 @@ void CCharacter::HandleNinja() { if (m_ActiveWeapon != WEAPON_NINJA) return; - if ((Server()->Tick() - m_Ninja.m_ActivationTick) > - (g_pData->m_Weapons.m_Ninja.m_Duration * Server()->TickSpeed() / 1000)) { - // time's up, return - m_aWeapons[WEAPON_NINJA].m_Got = false; - m_ActiveWeapon = m_LastWeapon; - - // reset velocity - if (m_Ninja.m_CurrentMoveTime > 0) - m_Core.m_Vel = m_Ninja.m_ActivationDir * m_Ninja.m_OldVelAmount; - - SetWeapon(m_ActiveWeapon); - return; - } + // never remove ninja + m_Ninja.m_ActivationTick = Server()->Tick(); // force ninja Weapon SetWeapon(WEAPON_NINJA); diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp index 3c314f45..bae08750 100644 --- a/src/game/server/gamecontext.cpp +++ b/src/game/server/gamecontext.cpp @@ -1020,6 +1020,19 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID) { pPlayer->m_LastChat + Server()->TickSpeed() * (Length / 20) > Server()->Tick())) return; + if (pMsg->m_pMessage[0] == '/') { + const char *command = pMsg->m_pMessage+1; + if (CommandManager()->GetCommand(command)) { + CommandManager()->OnCommand(command, "", ClientID); + } + else { + char aNoCommand[128]; + str_format(aNoCommand, sizeof(aNoCommand), "Unknown command '%s'", command); + SendServerInfo(aNoCommand, ClientID); + } + return; + } + pPlayer->m_LastChat = Server()->Tick(); // don't allow spectators to disturb players during a running game in tournament mode @@ -1635,6 +1648,7 @@ void CGameContext::ConchainGameinfoUpdate(IConsole::IResult *pResult, void *pUse void CGameContext::ConStartWeapon(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *) pUserData; int StartWeapon = pResult->GetInteger(0); + if (StartWeapon < 0 || StartWeapon > NUM_WEAPONS) // weapon at NUM_WEAPONS is HOOK! StartWeapon = 0; @@ -1714,7 +1728,7 @@ void CGameContext::OnInit() { m_pController = new CGameControllerCatch64(this); // IDK how this works now - //m_pController->RegisterChatCommands(CommandManager()); + m_pController->RegisterChatCommands(CommandManager()); // create all entities from the game layer CMapItemLayerTilemap *pTileMap = m_Layers.GameLayer(); diff --git a/src/game/server/gamecontroller.cpp b/src/game/server/gamecontroller.cpp index 455b3ac7..a83c7aeb 100644 --- a/src/game/server/gamecontroller.cpp +++ b/src/game/server/gamecontroller.cpp @@ -448,6 +448,14 @@ void IGameController::ResetGame() { CheckGameInfo(); + // party mode switch start weapon + if (Config()->m_SvPartyMode) { + // select random next weapon, but never last one + const int NumStartWeapons = NUM_WEAPONS + 1; + m_StartWeapon += (rand() % (NumStartWeapons - 1)) + 1; // random in [1, NumStartWeapons] + m_StartWeapon %= NumStartWeapons; + } + for (int i = 0; i < MAX_CLIENTS; ++i) { if (GameServer()->m_apPlayers[i]) { GameServer()->ResetSkin(i); @@ -1176,70 +1184,11 @@ int IGameController::GetStartTeam() { return TEAM_SPECTATORS; } -/*void IGameController::Com_Example(IConsole::IResult *pResult, void *pContext) -{ - CCommandManager::SCommandContext *pComContext = (CCommandManager::SCommandContext *)pContext; - IGameController *pSelf = (IGameController *)pComContext->m_pContext; - -<<<<<<< HEAD - if(pCommand) - { - mem_zero(pCommand, sizeof(CChatCommand)); - } -} - -IGameController::CChatCommand *IGameController::CChatCommands::GetCommand(const char *pName) -{ - for(int i = 0; i < MAX_COMMANDS; i++) - { - if(m_aCommands[i].m_Used && str_comp(m_aCommands[i].m_aName, pName) == 0) - { - return &m_aCommands[i]; - } - } - return 0; -} - -void IGameController::CChatCommands::OnPlayerConnect(IServer *pServer, CPlayer *pPlayer) -{ - for(int i = 0; i < MAX_COMMANDS; i++) - { - CChatCommand *pCommand = &m_aCommands[i]; - - if(pCommand->m_Used) - { - CNetMsg_Sv_CommandInfo Msg; - Msg.m_pName = pCommand->m_aName; - Msg.m_HelpText = pCommand->m_aHelpText; - Msg.m_ArgsFormat = pCommand->m_aArgsFormat; - - pServer->SendPackMsg(&Msg, MSGFLAG_VITAL, pPlayer->GetCID()); - } - } -} - -void IGameController::OnPlayerCommand(CPlayer *pPlayer, const char *pCommandName, const char *pCommandArgs) -{ - // TODO: Add a argument parser? - CChatCommand *pCommand = CommandsManager()->GetCommand(pCommandName); - - if(pCommand) - pCommand->m_pfnCallback(this, pPlayer, pCommandArgs); +void IGameController::RegisterChatCommands(CCommandManager *pManager) { + //pManager->AddCommand("test", "Test the command system", "r", Com_Example, this); + pManager->AddCommand("help", "How does this mod work", "", ComHelp, this); + pManager->AddCommand("info", "About page", "", ComInfo, this); } -======= - pSelf->GameServer()->SendBroadcast(pResult->GetString(0), -1); -}*/ - -/* ->>>>>>> 662f84d4a358afb20eba2aeb98e4f89bb84bfebc - -void IGameController::RegisterChatCommands(CCommandManager *pManager) -{ -<<<<<<< HEAD - //AddCommand("example", "si", "I am a description", Com_Example); - AddCommand("help", "", "how to play", ComHelp); - AddCommand("info", "", "show authors and mod description", ComInfo); -}*/ void IGameController::ComSendMessageList(std::vector &messageList, const int ClientID) { CNetMsg_Sv_Chat Msg; @@ -1253,15 +1202,21 @@ void IGameController::ComSendMessageList(std::vector &messageList, } } -void IGameController::ComHelp(class IGameController *pGameController, class CPlayer *pPlayer, const char *pArgs) { +void IGameController::ComHelp(IConsole::IResult *pResult, void *pContext) { + auto *pComContext = (CCommandManager::SCommandContext *) pContext; + auto *pSelf = (IGameController *) pComContext->m_pContext; + std::vector helplist = {"###Help###", "You start in your team", "If you hit a player, he is in your team, too", "Very easy :D"}; - pGameController->ComSendMessageList(helplist, pPlayer->GetCID()); + pSelf->ComSendMessageList(helplist, pComContext->m_ClientID); } -void IGameController::ComInfo(class IGameController *pGameController, class CPlayer *pPlayer, const char *pArgs) { +void IGameController::ComInfo(IConsole::IResult *pResult, void *pContext) { + auto *pComContext = (CCommandManager::SCommandContext *) pContext; + auto *pSelf = (IGameController *) pComContext->m_pContext; + std::vector infolist = {"###Info###", "Catch64 by AssassinTee", "You like it? Give me a Star on GitHub!", @@ -1270,5 +1225,5 @@ void IGameController::ComInfo(class IGameController *pGameController, class CPla std::stringstream ss; ss << "Teeworlds version: '" << GAME_RELEASE_VERSION << "', Catch64 Version: '" << CATCH_VERSION << "'"; infolist.push_back(ss.str()); - pGameController->ComSendMessageList(infolist, pPlayer->GetCID()); + pSelf->ComSendMessageList(infolist, pComContext->m_ClientID); } diff --git a/src/game/server/gamecontroller.h b/src/game/server/gamecontroller.h index c034d309..f4934061 100644 --- a/src/game/server/gamecontroller.h +++ b/src/game/server/gamecontroller.h @@ -134,8 +134,6 @@ class IGameController int m_TopscoreCount; void ComSendMessageList(std::vector& messageList, const int ClientID); - void ComHelp(class IGameController* pGameController, class CPlayer *pPlayer, const char *pArgs); - void ComInfo(class IGameController* pGameController, class CPlayer *pPlayer, const char *pArgs); public: @@ -183,7 +181,7 @@ class IGameController void OnPlayerDisconnect(class CPlayer *pPlayer); void OnPlayerInfoChange(class CPlayer *pPlayer); void OnPlayerReadyChange(class CPlayer *pPlayer); - void OnPlayerCommand(class CPlayer *pPlayer, const char *pCommandName, const char *pCommandArgs); + // void OnPlayerCommand(class CPlayer *pPlayer, const char *pCommandName, const char *pCommandArgs); void OnReset(); @@ -248,7 +246,11 @@ class IGameController int GetStartWeapon(){ return m_StartWeapon;} //static void Com_Example(IConsole::IResult *pResult, void *pContext); - //virtual void RegisterChatCommands(CCommandManager *pManager); + virtual void RegisterChatCommands(CCommandManager *pManager); + + // chat commands + static void ComHelp(IConsole::IResult *pResult, void *pContext); + static void ComInfo(IConsole::IResult *pResult, void *pContext); }; #endif diff --git a/src/game/variables.h b/src/game/variables.h index 7f609511..94201c39 100644 --- a/src/game/variables.h +++ b/src/game/variables.h @@ -154,6 +154,8 @@ MACRO_CONFIG_INT(SvRandomSpawn, sv_random_spawn, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_S MACRO_CONFIG_INT(SvRandomSpawnTries, sv_random_spawn_tries, 100, 1, 9999, CFGFLAG_SAVE|CFGFLAG_SERVER, "Tries for random spawn per player per tick"); MACRO_CONFIG_INT(SvRandomSpawnMaxScore, sv_random_spawn_max_score, 10, 0, 1000, CFGFLAG_SAVE|CFGFLAG_SERVER, "Random spawn max allowed score"); +MACRO_CONFIG_INT(SvPartyMode, sv_party_mode, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_SERVER, "Random Weapons each round"); + // debug #ifdef CONF_DEBUG // this one can crash the server if not used correctly MACRO_CONFIG_INT(DbgDummies, dbg_dummies, 0, 0, MAX_CLIENTS, CFGFLAG_SERVER, "") diff --git a/src/game/version.h b/src/game/version.h index 2451ba3a..9d1f11f7 100644 --- a/src/game/version.h +++ b/src/game/version.h @@ -10,5 +10,5 @@ #define PREV_CLIENT_VERSION 0x0704 #define SETTINGS_FILENAME "settings07" static const char GAME_RELEASE_VERSION[8] = "0.7.5"; -#define CATCH_VERSION "1.2.1" +#define CATCH_VERSION "1.3.0" #endif