Skip to content

Commit

Permalink
Upgrade CGameControllerHunterN
Browse files Browse the repository at this point in the history
  • Loading branch information
Hu1night committed Apr 5, 2024
1 parent 4027efd commit 8a7ecca
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 98 deletions.
8 changes: 5 additions & 3 deletions src/game/server/classes.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
enum HUNTERN_CLASS_FLAG
{
CLASS_NONE = 0,
CLASS_CIVIC = 1,
CLASS_HUNTER = 2,
CLASS_JUGGERNAUT = 4,
CLASS_CIVIC,
CLASS_HUNTER,
CLASS_JUGGERNAUT,
CLASS_PUPPETEE,
NUM_CLASSES,
};

#endif
172 changes: 77 additions & 95 deletions src/game/server/gamemodes/huntern.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -233,14 +233,8 @@ void CGameControllerHunterN::OnWorldReset() // 重置部分值和职业选择
m_GameFlags = HUNTERN_GAMEFLAGS;
m_DoWinchenkClassTick = -1;

//int TeamClass[1];
//TeamClass[0] = CLASS_CIVIC; // TEAM_RED
//TeamClass[1] = CLASS_HUNTER; // TEAM_BLUE

//int PlayerCount = m_aTeamSize[TEAM_RED]; // 玩家计数
int PreselectPlayerCount = 0; // 最近没当过猎人的玩家的计数
int rHunter = 0; // 猎人选择随机数
// int m_NumHunter = 0; // 需要选择多少个猎人

for(int i = 0; i < MAX_CLIENTS; ++i) // 重置并计数玩家
{
Expand Down Expand Up @@ -315,17 +309,10 @@ void CGameControllerHunterN::OnWorldReset() // 重置部分值和职业选择
str_append(m_HunterList, Server()->ClientName(i), sizeof(m_HunterList));
str_append(m_HunterList, ", ", sizeof(m_HunterList));

//if(iHunter != 1) // 最后一次循环 要循环全体玩家
break;
break;
}
--rHunter;
}

/*if(iHunter == 1) // 最后一次循环 所有玩家都选择了职业
if(pPlayer->GetCharacter() && pPlayer->GetCharacter()->IsAlive()) // 这个玩家出生了 所以OnCharacterSpawn已经过了
{
OnResetClass(pPlayer->GetCharacter()); // 在这里给他们Class提示和武器
}*/
}
}
}
Expand Down Expand Up @@ -360,6 +347,8 @@ void CGameControllerHunterN::OnCharacterSpawn(CCharacter *pChr) // 给予生命
}

// 如果游戏在正常运行
pChr->m_SpawnTick = Server()->TickSpeed(); // for CGameControllerHunterN::OnEntitySnap()

if(pChr->GetPlayer()->m_Class == CLASS_CIVIC)
{
pChr->IncreaseHealth(10);
Expand Down Expand Up @@ -533,102 +522,95 @@ void CGameControllerHunterN::DoWincheckMatch() // Roundlimit 触发DoWincheckMat

int CGameControllerHunterN::OnCharacterDeath(class CCharacter *pVictim, class CPlayer *pKiller, int Weapon) // 杀手隐藏分增减 和受害人职业死亡消息 以及延时终局
{
if(m_GameState == IGS_GAME_RUNNING) // 如果游戏在正常运行
if(m_GameState != IGS_GAME_RUNNING) // 如果游戏在正常运行
return DEATH_SKIP_SCORE; // 跳过内置分数逻辑

if(pVictim->GetPlayer()->m_Class == CLASS_HUNTER) // 猎人死亡 进行计数和猎人死亡报告
{
if(pVictim->GetPlayer()->m_Class == CLASS_HUNTER) // 猎人死亡
{
--m_NumHunter; // 计数猎人死亡
--m_NumHunter; // 计数猎人死亡

if(m_EffectHunterDeath)
GameWorld()->CreatePlayerSpawn(pVictim->m_Pos); // 死亡给个出生烟
if(m_EffectHunterDeath)
GameWorld()->CreatePlayerSpawn(pVictim->m_Pos); // 死亡给个出生烟

char aBuf[64];
str_format(aBuf, sizeof(aBuf), "Hunter '%s' was defeated! ", Server()->ClientName(pVictim->GetPlayer()->GetCID()));
char aBuf[64];
str_format(aBuf, sizeof(aBuf), "Hunter '%s' was defeated! ", Server()->ClientName(pVictim->GetPlayer()->GetCID()));

if(m_BroadcastHunterDeath == 1 ||
!m_NumHunter) // 如果是最后一个Hunter
{
SendChatTarget(-1, aBuf); // 直接全体广播
GameWorld()->CreateSoundGlobal(SOUND_CTF_CAPTURE);
}
else
if(m_BroadcastHunterDeath == 1 ||
!m_NumHunter) // 如果是最后一个Hunter
{
SendChatTarget(-1, aBuf); // 直接全体广播
GameWorld()->CreateSoundGlobal(SOUND_CTF_CAPTURE);
}
else
{
char aBufEx[16];
str_format(aBufEx, sizeof(aBufEx), "%d Hunter left.", m_NumHunter);
str_append(aBuf, aBufEx, sizeof(aBuf));
for(int i = 0; i < MAX_CLIENTS; ++i) // 逐个给所有人根据职业发送死亡消息
{
char aBufEx[16];
str_format(aBufEx, sizeof(aBufEx), "%d Hunter left.", m_NumHunter);
str_append(aBuf, aBufEx, sizeof(aBuf));
for(int i = 0; i < MAX_CLIENTS; ++i) // 逐个给所有人根据职业发送死亡消息
CPlayer *pPlayer = GetPlayerIfInRoom(i);
if(pPlayer)
{
CPlayer *pPlayer = GetPlayerIfInRoom(i);
if(pPlayer)
if((m_BroadcastHunterDeath != -1 && pPlayer->m_Class == CLASS_HUNTER) || //
pPlayer->GetTeam() == TEAM_SPECTATORS || pPlayer->m_DeadSpecMode) // 观察者 和 死人
{
if((m_BroadcastHunterDeath != -1 && pPlayer->m_Class == CLASS_HUNTER) || //
pPlayer->GetTeam() == TEAM_SPECTATORS || pPlayer->m_DeadSpecMode) // 观察者 和 死人
{
SendChatTarget(pPlayer->GetCID(), aBuf); // 给所有猎人广播他们"队友"的死亡消息
GameWorld()->CreateSoundGlobal(SOUND_CTF_CAPTURE, CmaskOne(pPlayer->GetCID()));
}
else
GameWorld()->CreateSoundGlobal(SOUND_CTF_DROP, CmaskOne(pPlayer->GetCID()));
SendChatTarget(pPlayer->GetCID(), aBuf); // 给所有猎人广播他们"队友"的死亡消息
GameWorld()->CreateSoundGlobal(SOUND_CTF_CAPTURE, CmaskOne(pPlayer->GetCID()));
}
}
}

if(pKiller && pKiller != pVictim->GetPlayer()) // 不是自杀
{
if(pKiller->m_Class != CLASS_HUNTER) // 隐藏分添加
pKiller->m_HiddenScore += 4;
else
pKiller->m_HiddenScore -= 2; // Teamkill
}
}
else if(pVictim->GetPlayer()->m_Class == CLASS_CIVIC) // 平民死亡
{
if(pKiller && pKiller != pVictim->GetPlayer()) // 不是自杀
{
if(pKiller->m_Class != CLASS_CIVIC) // 隐藏分添加
pKiller->m_HiddenScore += 1;
else
pKiller->m_HiddenScore -= 1; // Teamkill
}

GameWorld()->CreateSoundGlobal(SOUND_CTF_DROP);
else
GameWorld()->CreateSoundGlobal(SOUND_CTF_DROP, CmaskOne(pPlayer->GetCID()));
}
}
}
/*else if(pVictim->GetPlayer()->m_Class == CLASS_JUGGERNAUT)
{
if(pKiller && pKiller != pVictim->GetPlayer())
{
if(pKiller->m_Class != CLASS_JUG) // 隐藏分添加
pKiller->m_HiddenScore += 8;
else // :P
pKiller->m_HiddenScore -= 114514; // Teamkill
}
}
else if(pVictim->GetPlayer()->m_Class == CLASS_CIVIC) // 平民死亡
{
GameWorld()->CreateSoundGlobal(SOUND_CTF_DROP);
}
/*else if(pVictim->GetPlayer()->m_Class == CLASS_JUGGERNAUT)
{
SendChatTarget(-1, "Juggernaut was defeated!");
GameWorld()->CreateSoundGlobal(SOUND_CTF_CAPTURE);
}*/

SendChatTarget(-1, "Juggernaut was defeated!");
GameWorld()->CreateSoundGlobal(SOUND_CTF_CAPTURE);
}*/
if(pKiller != pVictim->GetPlayer()) // 不是自杀
{
pKiller->m_HiddenScore += // 给予分数
m_aKillScore[pVictim->GetPlayer()->m_Class] // Class
[pKiller->m_Class == pVictim->GetPlayer()->m_Class]; // IsTeamKill

if(m_NumHunter) // 如果没有猎人(当然是全死光啦) 就不要发猎人列表 等EndMatch
if(Weapon >= WEAPON_WORLD)
{
if(Weapon >= WEAPON_WORLD)
{
char aBuf[64];
str_format(aBuf, sizeof(aBuf), "你被 '%s' 的%s所杀", Server()->ClientName(pKiller->GetCID()),
(Weapon == WEAPON_HAMMER ? "锤子"
: (Weapon == WEAPON_GUN ? "手枪"
: (Weapon == WEAPON_SHOTGUN ? "霰弹"
: (Weapon == WEAPON_GRENADE ? "榴弹"
: (Weapon == WEAPON_LASER ? "激光"
: (Weapon == WEAPON_NINJA ? "忍者刀"
: "地刺")))))));

SendChatTarget(pVictim->GetPlayer()->GetCID(), aBuf); // 给被弄死的人发
}
char aBuf[64];
str_format(aBuf, sizeof(aBuf), "你被 '%s' 的%s所杀", Server()->ClientName(pKiller->GetCID()), m_aWeaponName[Weapon + 1]);

SendChatTarget(pVictim->GetPlayer()->GetCID(), m_HunterList); // 给被弄死的人发
SendChatTarget(pVictim->GetPlayer()->GetCID(), aBuf); // 给被弄死的人发
}

m_DoWinchenkClassTick = ((Server()->TickSpeed() * m_Wincheckdeley) / 1000); // 延时终局
}

if(m_NumHunter) // 如果没有猎人(当然是全死光啦) 就不要发猎人列表 等EndMatch
SendChatTarget(pVictim->GetPlayer()->GetCID(), m_HunterList); // 给被弄死的人发猎人列表

m_DoWinchenkClassTick = ((Server()->TickSpeed() * m_Wincheckdeley) / 1000); // 延时终局

return DEATH_NO_REASON | DEATH_SKIP_SCORE; // 隐藏死因并跳过内置分数逻辑
}

void CGameControllerHunterN::OnPreEntitySnap(int SnappingClient, int OtherMode) // 出生用旗子显示自己队伍
{
CPlayer *pPlayer = GetPlayerIfInRoom(SnappingClient);
if(!pPlayer || pPlayer->GetCID() != SnappingClient) // 只对自己显示
return;

CCharacter *pChar = pPlayer->GetCharacter();
if(!pChar || pChar->m_SpawnTick + (Server()->TickSpeed() * 5) <= Server()->Tick()) // GameStart + 5 sec
return;

CNetObj_Flag *pFlag = (CNetObj_Flag *)Server()->SnapNewItem(NETOBJTYPE_FLAG, 0, sizeof(CNetObj_Flag));
if(!pFlag)
return;

pFlag->m_X = round_to_int(pChar->m_Pos.x);
pFlag->m_Y = round_to_int(pChar->m_Pos.y);
pFlag->m_Team = pPlayer->m_AmongUsTeam; // 显示玩家的队伍
}
18 changes: 18 additions & 0 deletions src/game/server/gamemodes/huntern.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#ifndef GAME_SERVER_GAMEMODES_HUNTERN_H
#define GAME_SERVER_GAMEMODES_HUNTERN_H
#include <game/server/gamecontroller.h>
#include <game/server/classes.h>

class CGameControllerHunterN : public IGameController
{
Expand Down Expand Up @@ -39,6 +40,7 @@ class CGameControllerHunterN : public IGameController
void DoWincheckRound() override;
void DoWincheckMatch() override;
int OnCharacterDeath(class CCharacter *pVictim, class CPlayer *pKiller, int Weapon) override;
void OnPreEntitySnap(int SnappingClient, int OtherMode) override;

private: // Intelnal function and value
int m_NumHunter; // 有多少个猎人
Expand All @@ -56,6 +58,22 @@ class CGameControllerHunterN : public IGameController
FLAG_WIN_TEAMRED = 2,
FLAG_WIN_TEAMBLUE = 4,
};

const int m_aKillScore[NUM_CLASSES][2] = { // Kill & TeamKill Score
{0, 0}, // CLASS_NONE
{1, -1}, // CLASS_CIVIC
{4, -2}, // CLASS_HUNTER
{8, -114514}, // CLASS_JUGGERNAUT
{4, -2},}; // CLASS_PUPPETEE

const char m_aWeaponName[7][16] = {
{"地刺"},
{"锤子"},
{"手枪"},
{"霰弹"},
{"榴弹"},
{"激光"},
{"忍者刀"},};
};

#endif

0 comments on commit 8a7ecca

Please sign in to comment.