diff --git a/CMakeLists.txt b/CMakeLists.txt index b939e05b12..b70473f2ce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1006,8 +1006,8 @@ set_src(GAME_SERVER GLOB_RECURSE src/game/server weapons/hammer.h weapons/hunthammer.cpp weapons/hunthammer.h - weapons/jugninja.cpp - weapons/jugninja.h +# weapons/jugninja.cpp +# weapons/jugninja.h weapons/lasergun.cpp weapons/lasergun.h weapons/ninja.cpp diff --git a/README.md b/README.md index 8eca9395c9..ac31268a1d 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,38 @@ -DDNet-PvP HunterN猎人杀 -=== -模式规则: +# DDNet-HunterN猎人杀 +[**DDNet-HunterN**](https://github.com/Hu1night/DDNet-HunterN)是一个基于[**DDNet-PvP**](https://github.com/TeeworldsCN/ddnet-pvp)(传统竞技)(基于DDNet 15.3.2)的[**DDNet**](https://github.com/DDNet/DDNet)模组项目 提供名为***HunterN***(猎人杀)的PvP模式 -1.每回合都会秘密随机选择猎人。猎人必须消灭所有平民。 +### HunterN的游戏规则: +1. 每局开始时会**秘密随机**选择玩家成为**猎人**或**平民** 且玩家只知道自己身份 猎人的目标是**消灭所有平民** +2. 猎人使用高伤武器、瞬杀追踪锤(20伤,长按追踪)和破片榴弹 **而平民没有锤子且只能使用常规武器** +3. 当玩家死时如为猎人死亡则通知其他猎人 且死亡原因和死后聊天**仅旁观/死人可见** -2.猎人造成双倍伤害,有一把瞬杀锤和破片榴弹,而平民没有锤子,只能使用常规武器。 - -3.活着的玩家看不到死去玩家的信息。 - -4.如果猎人死亡,将通知其他猎人。 - -5.在游戏开始时,玩家只知道自己的身份。 - -Rules: - -1.Each round will secretly randomly select Hunter(s). Hunter(s) must eliminate all the Civilians. - -2.The Hunter deals double damage and has an instant-kill hammer and fragmentation grenades, while Civilians have no hammer and can only use regular weapons. - -3.The living players cannot see messages from dead players. - -4.If the Hunter dies, the other Hunters will be notified. - -5.At the beginning of the game, players only know their own identity. - -在Ubuntu上使用CMake构建 ---- -1.安装依赖库 +## 在Ubuntu上使用CMake构建DDNet-HunterN +1. 使用apt安装***依*****赖***库* +``` +sudo apt install build-essential cmake python3 libsqlite3-dev libcurl4-openssl-dev zlib1g-dev ``` - sudo apt install build-essential cmake python3 libsqlite3-dev +2. 转到项目目录编译服务端 ``` -2.编译服务端 +cmake . +make -j16 ``` - cmake .. - make -j16 -``` \ No newline at end of file + +## DDNet-HunterN的服务端下载&配置 +* 你可以下载**正式发布包**于[Github Releases](https://github.com/Hu1night/DDNet-HunterN/releases) +* 或者下载**开发构建**于[Github Actions](https://github.com/Hu1night/DDNet-HunterN/actions/workflows/build.yaml?query=branch%3Amaster++)([几乎汉化分支构建](https://github.com/Hu1night/DDNet-HunterN/actions/workflows/build.yaml?query=branch%3Ahuntern-zh_cn++))(下载需Github账号) + +**关于DDNet-HunterN的一些配置指令** +* ```sv_room_commands```于控制台启用时才能使玩家创建/加入房间 +* ```room_setting 0```于控制台输入可查看0号房间可用的模式指令 房间指令使用实例:```room_setting 0 timelimit 3``` (设置0号房间每局限时3分钟) +* ```/setting```于(管理员)聊天栏输入可查看所在房间可用的模式指令 使用实例:```/setting map dm2``` (设置所在房间的子地图为dm2) + +**关于DDNet-HunterN的一些配置文件** +* 服务端启动时执行/autoexec.cfg +* HunterN房间启动时执行/room_config/modes/huntern.rcfg +* DDNet-HunterN的Mega_std_collection地图启动时执行/data/maps/huntern_msc.map.cfg +* 服务器资产定位使用/storage.cfg + +**关于DDNet-PvP的Mega map生成**
+使用[DDNet-PvP附加工具](https://github.com/Hu1night/DDNet-HunterN/releases/download/0.3a1/DDNet-PvP.Extra.tools.zip)中的map_merge程序进行Mega map的生成
+使用用法:```map_merge 输出地图名 输入地图1 输入地图2 输入地图3 ... 输入地图n```
+使用实例:```map_merge huntern.map hunter1.map hunter2.map hunter3.map hunter4.map hunter6.map```
\ No newline at end of file diff --git a/src/game/server/gamecontroller.cpp b/src/game/server/gamecontroller.cpp index 67d4c7103f..110a483793 100644 --- a/src/game/server/gamecontroller.cpp +++ b/src/game/server/gamecontroller.cpp @@ -2940,7 +2940,7 @@ void IGameController::SendKillMsg(int Killer, int Victim, int Weapon, int ModeSp for(int i = 0; i < MAX_CLIENTS; ++i) { if(GetPlayerIfInRoom(i)) - Server()->SendPackMsg((GameServer()->m_apPlayers[i]->GetTeam() != TEAM_SPECTATORS || !(GameServer()->m_apPlayers[i]->GetCharacter() && GameServer()->m_apPlayers[i]->GetCharacter()->IsAlive())) ? + Server()->SendPackMsg((GameServer()->m_apPlayers[i]->GetTeam() != TEAM_SPECTATORS || (GameServer()->m_apPlayers[i]->GetCharacter() && GameServer()->m_apPlayers[i]->GetCharacter()->IsAlive())) ? &PlayerMsg : &Msg, // Is Hide Reason MSGFLAG_VITAL, i); } diff --git a/src/game/server/gamemodes/huntern.cpp b/src/game/server/gamemodes/huntern.cpp index 8b2fcf3817..52d8b7c032 100644 --- a/src/game/server/gamemodes/huntern.cpp +++ b/src/game/server/gamemodes/huntern.cpp @@ -9,6 +9,63 @@ #include // HunterN commands +static void ConMapAdd(IConsole::IResult *pResult, void *pUserData) +{ + CGameControllerHunterN *pSelf = (CGameControllerHunterN *)pUserData; + + if(pResult->NumArguments() > 0) // 如果要加入地图 + { + for(int j = 0; j < pResult->NumArguments(); ++j) // 逐个加入地图到列表 + { + const char *pMapName = pResult->GetString(j); + + for(int i = 0; i < 64; ++i) // 循环所有子地图 + { + if(!pSelf->m_Maprotation[i]) // 在列表里找到了可用空位 + { + int MapIndex = pSelf->GameServer()->Teams()->GetMapIndex(pMapName); + if(MapIndex == 0) + break; // 跳出到错误提示 + + pSelf->m_Maprotation[i] = MapIndex; // 加入循环列表 + goto next_map; + } + } + + char aBuf[512]; + str_format(aBuf, sizeof(aBuf), "Cannot add map '%s'", pMapName); + pSelf->InstanceConsole()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "instance", aBuf); + + next_map:; + } + } + else // 显示列表 + { + char aBuf[1024]; + str_format(aBuf, sizeof(aBuf), "Value: "); + for(int i = 0; i < 64; ++i) // 循环所有子地图 + { + if(!pSelf->m_Maprotation[i]) // 列表走到了尽头 + break; + + const char *pMapName = pSelf->GameServer()->Teams()->GetMapName(pSelf->m_Maprotation[i]); + if(!pMapName) + continue; + + str_append(aBuf, pMapName, sizeof(aBuf)); + str_append(aBuf, ", ", sizeof(aBuf)); + } + pSelf->InstanceConsole()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "instance", aBuf); // 输出 + } +} + +static void ConMapClear(IConsole::IResult *pResult, void *pUserData) +{ + CGameControllerHunterN *pSelf = (CGameControllerHunterN *)pUserData; + + for(int i = 0; i < 64; ++i) pSelf->m_Maprotation[i] = {0}; +} + static void ConSetClass(IConsole::IResult *pResult, void *pUserData) { IGameController *pSelf = (IGameController *)pUserData; @@ -64,7 +121,7 @@ static void ConSetHeal(IConsole::IResult *pResult, void *pUserData) static void ConRevive(IConsole::IResult *pResult, void *pUserData) { - IGameController *pSelf = (IGameController *)pUserData;// CGameControllerHunterN *pSelf = (CGameControllerHunterN *)pUserData; // Warning // Use CGameControllerHunterN instead of IGameController + IGameController *pSelf = (IGameController *)pUserData;// CGameControllerHunterN *pSelf = (CGameControllerHunterN *)pUserData; // Use CGameControllerHunterN instead of IGameController CPlayer *pPlayer = pSelf->GetPlayerIfInRoom((pResult->NumArguments() > 0) ? pResult->GetInteger(0) : pResult->m_ClientID); if(!pPlayer) // If the player does not exist @@ -89,10 +146,14 @@ CGameControllerHunterN::CGameControllerHunterN() : INSTANCE_CONFIG_INT(&m_BroadcastHunterDeath, "htn_hunt_broadcast_death", 0, 0, 1, CFGFLAG_CHAT | CFGFLAG_INSTANCE, "是否全体广播猎人死亡(开关,默认0,限制0~1)"); INSTANCE_CONFIG_INT(&m_EffectHunterDeath, "htn_hunt_effert_death", 0, 0, 1, CFGFLAG_CHAT | CFGFLAG_INSTANCE, "猎人死亡是否使用出生烟(开关,默认0,限制0~1)"); INSTANCE_CONFIG_INT(&m_HuntFragNum, "htn_hunt_frag_num", 18, 0, 0xFFFFFFF, CFGFLAG_CHAT | CFGFLAG_INSTANCE, "猎人榴弹产生的破片数量(整数,默认18,限制0~268435455)"); - INSTANCE_CONFIG_INT(&m_HuntFragTrack, "htn_hunt_frag_track", 18, 0, 0xFFFFFFF, CFGFLAG_CHAT | CFGFLAG_INSTANCE, "猎人榴弹产生的破片数量(整数,默认18,限制0~268435455)"); + INSTANCE_CONFIG_INT(&m_HuntFragTrack, "htn_hunt_frag_track", 0, 0, 1, CFGFLAG_CHAT | CFGFLAG_INSTANCE, "猎人榴弹破片是否追踪定向(开关,默认0,限制0~1)"); INSTANCE_CONFIG_INT(&m_Wincheckdeley, "htn_wincheck_deley", 100, 0, 0xFFFFFFF, CFGFLAG_CHAT | CFGFLAG_INSTANCE, "终局判断延时毫秒(整数,默认100,限制0~268435455)"); INSTANCE_CONFIG_INT(&m_GameoverTime, "htn_gameover_time", 7, 0, 0xFFFFFFF, CFGFLAG_CHAT | CFGFLAG_INSTANCE, "结算界面时长秒数(整数,默认0,限制0~268435455)"); - //INSTANCE_CONFIG_INT(&m_RoundMode, "htn_round_mode", 0, 0, 1, CFGFLAG_CHAT | CFGFLAG_INSTANCE, "回合模式 正常0 娱乐1(整数,默认0,限制0~1)"); + //INSTANCE_CONFIG_INT(&m_RoundMode, "htn_round_mode", 0, 0, 1, CFGFLAG_CHAT | CFGFLAG_INSTANCE, "回合模式 正常0 娱乐1(整数,默认0,限制0~1)");; + + InstanceConsole()->Register("htn_map", "", CFGFLAG_CHAT | CFGFLAG_INSTANCE, ConMapAdd, this, "Maps to rotate between"); + InstanceConsole()->Register("htn_map_add", "?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps] ?s[maps]", CFGFLAG_CHAT | CFGFLAG_INSTANCE, ConMapAdd, this, "Add a map to the maps rotation list"); + InstanceConsole()->Register("htn_map_clear", "", CFGFLAG_CHAT | CFGFLAG_INSTANCE, ConMapClear, this, "Clear the maps rotation list"); InstanceConsole()->Register("htn_setclass", "i[class-id] ?i[CID] ?i[team-id] ?i[hunt-weapon]", CFGFLAG_CHAT | CFGFLAG_INSTANCE, ConSetClass, this, "给玩家设置职业(1平民,2猎人,4剑圣)"); InstanceConsole()->Register("htn_giveweapon", "i[weapon-id] i[slot] ?i[CID] ?i[ammo-num]", CFGFLAG_CHAT | CFGFLAG_INSTANCE, ConGiveWeapon, this, "给玩家武器"); @@ -130,6 +191,31 @@ void CGameControllerHunterN::SendChatRoom(const char *pText, int Flags) } } +void CGameControllerHunterN::CycleMap() +{ + if(!m_Maprotation[0]) // 列表没东西 + return; + + bool CurrentMapfound = false; // 是否找到了当前地图 + + for(int i = 0; i < 64; ++i) // 循环所有子地图 + { + if(!m_Maprotation[i]) // 列表走到了尽头 没找到可用地图 + break; + else if(m_Maprotation[i] == m_MapIndex) // 是否在列表里找到了当前地图 + CurrentMapfound = true; // 下次循环会试图寻找可用地图 + else if(CurrentMapfound) + { + m_MapIndex = m_Maprotation[i]; // 切换地图 + GameServer()->Teams()->ReloadGameInstance(GameWorld()->Team()); + return; + } + } + + m_MapIndex = m_Maprotation[0]; // 重置到列表第一项 + GameServer()->Teams()->ReloadGameInstance(GameWorld()->Team()); +} + void CGameControllerHunterN::OnWorldReset() // 重置部分值和职业选择 { m_GameFlags = IGF_SURVIVAL | IGF_ROUND_TIMER_ROUND | IGF_SUDDENDEATH | IGF_MARK_MATCH | IGF_MARK_AMONGUS; @@ -140,7 +226,7 @@ void CGameControllerHunterN::OnWorldReset() // 重置部分值和职业选择 //TeamClass[0] = CLASS_CIVIC; // TEAM_RED //TeamClass[1] = CLASS_HUNTER; // TEAM_BLUE - int PlayerCount = 0; // 玩家计数 + //int PlayerCount = m_aTeamSize[TEAM_RED]; // 玩家计数 int PreselectPlayerCount = 0; // 最近没当过猎人的玩家的计数 int rHunter = 0; // 猎人选择随机数 // int nHunter = 0; // 需要选择多少个猎人 @@ -156,19 +242,17 @@ void CGameControllerHunterN::OnWorldReset() // 重置部分值和职业选择 pPlayer->m_HiddenScore = 0; // 重置隐藏分 pPlayer->m_UseHunterWeapon = false; // 默认武器 pPlayer->m_Class = CLASS_CIVIC; // 重置玩家为平民 - ++PlayerCount; // 计数有PlayerCount个玩家 if(pPlayer->m_Preselect) // 猎人选择伪随机!我们要在m_Preselect的玩家里面选择猎人 ++PreselectPlayerCount; // 计数有PreselectPlayerCount个玩家 } } - if(PlayerCount < 2) + if(m_aTeamSize[TEAM_RED] < 2) { - m_aTeamSize[TEAM_RED] = PlayerCount; // 你猜猜正常情况下没指令是怎么触发这个函数的 return; } - nHunter = (PlayerCount - 2) / m_HunterRatio + 1;// 我们要多少个猎人 + nHunter = (m_aTeamSize[TEAM_RED] - 2) / m_HunterRatio + 1;// 我们要多少个猎人 str_format(HunterList, sizeof(HunterList), "本回合的 %d 个Hunter是: ", nHunter); // Generate Hunter info message 生成猎人列表消息头 SendChatRoom("——————欢迎来到HunterN猎人杀——————"); @@ -246,12 +330,9 @@ void CGameControllerHunterN::OnWorldReset() // 重置部分值和职业选择 { SendChatTarget(pPlayer->GetCID(), HunterList); // 给膀胱者发 } - else if(pPlayer->GetCharacter()) + else if(pPlayer->GetCharacter() && pPlayer->GetCharacter()->IsAlive()) // 这个玩家出生了 所以OnCharacterSpawn已经过了 { - if(pPlayer->GetCharacter()->IsAlive()) // 这个玩家出生了 所以OnCharacterSpawn已经过了 - { - OnResetClass(pPlayer->GetCharacter()); // 在这里给他们Class提示和武器 - } + OnResetClass(pPlayer->GetCharacter()); // 在这里给他们Class提示和武器 } } } @@ -289,7 +370,7 @@ void CGameControllerHunterN::OnCharacterSpawn(CCharacter *pChr) // 给予生命 pChr->GameWorld()->CreateSoundGlobal(SOUND_CTF_GRAB_EN, CmaskOne(pChr->GetPlayer()->GetCID())); pChr->GameServer()->SendBroadcast(" 这回合你被选择为猎人Hunter!\n 猎人双倍伤害 有瞬杀锤子和破片榴弹\n 分辨出你的队友 消灭敌方队伍胜利!", pChr->GetPlayer()->GetCID(), true); } - else if(pChr->GetPlayer()->m_Class == CLASS_JUGGERNAUT) + /*else if(pChr->GetPlayer()->m_Class == CLASS_JUGGERNAUT) { pChr->m_MaxHealth = 114; pChr->IncreaseHealth(114); @@ -300,7 +381,7 @@ void CGameControllerHunterN::OnCharacterSpawn(CCharacter *pChr) // 给予生命 pChr->GameWorld()->CreateSoundGlobal(SOUND_NINJA_FIRE, CmaskOne(pChr->GetPlayer()->GetCID())); pChr->GameServer()->SendBroadcast(" 这局你是剑圣Juggernaut!噶了所有人胜利!\n 剑圣40心20盾 有盾反锤子且能斩杀", pChr->GetPlayer()->GetCID(), true); - } + }*/ } void CGameControllerHunterN::OnPlayerJoin(class CPlayer *pPlayer) // 使新进旁观者收到猎人列表 @@ -326,7 +407,7 @@ int CGameControllerHunterN::OnCharacterTakeDamage(class CCharacter *pChr, vec2 & return -1; }*/ -bool CGameControllerHunterN::CanChangeTeam(CPlayer *pPlayer, int JoinTeam) const // 加入膀胱者重置职业Flag +bool CGameControllerHunterN::CanChangeTeam(CPlayer *pPlayer, int JoinTeam) const // 加入膀胱者则重置职业Flag { if(JoinTeam == TEAM_SPECTATORS) { @@ -431,13 +512,14 @@ void CGameControllerHunterN::DoWincheckRound() // check for time based win --DoWinchenkClassTick; } -/*void CGameControllerHunterN::DoWincheckMatch() +void CGameControllerHunterN::DoWincheckMatch() { if(m_GameInfo.m_MatchNum > 0 && m_GameInfo.m_MatchCurrent >= m_GameInfo.m_MatchNum) { - EndMatch(); + SetGameState(IGS_END_MATCH, m_GameoverTime); // EndMatch(); + CycleMap(); } -}*/ +} int CGameControllerHunterN::OnCharacterDeath(class CCharacter *pVictim, class CPlayer *pKiller, int Weapon) // 杀手隐藏分增减 和受害人职业死亡消息 以及延时终局 { diff --git a/src/game/server/gamemodes/huntern.h b/src/game/server/gamemodes/huntern.h index b27693f0cb..9e66b2eaf5 100644 --- a/src/game/server/gamemodes/huntern.h +++ b/src/game/server/gamemodes/huntern.h @@ -14,16 +14,20 @@ class CGameControllerHunterN : public IGameController int m_Wincheckdeley; int m_GameoverTime; //int m_RoundMode; +public: // Maprotation + int m_Maprotation[64] = {0}; // 存储MapIndex的数组 public: CGameControllerHunterN(); static void OnResetClass(CCharacter *pChr); void SendChatRoom(const char *pText, int Flags = 3); + void CycleMap(); // event - void OnCharacterSpawn(class CCharacter *pChr) override; void OnWorldReset() override; + bool IsSpawnRandom() const { return m_aTeamSize[TEAM_RED] > 4; }; + void OnCharacterSpawn(class CCharacter *pChr) override; void OnPlayerJoin(class CPlayer *pPlayer) override; int OnCharacterTakeDamage(class CCharacter *pChr, vec2 &Force, int &Dmg, int From, int WeaponType, int WeaponID, bool IsExplosion) override; //int OnPickup(CPickup *pPickup, CCharacter *pChar, SPickupSound *pSound) override; @@ -31,7 +35,7 @@ class CGameControllerHunterN : public IGameController //bool CanDeadPlayerFollow(const CPlayer *pSpectator, const CPlayer *pTarget) override { return true; } bool CanChangeTeam(CPlayer *pPlayer, int JoinTeam) const override; void DoWincheckRound() override; - void DoWincheckMatch() override { ; } + void DoWincheckMatch() override; int OnCharacterDeath(class CCharacter *pVictim, class CPlayer *pKiller, int Weapon) override; private: // Intelnal function and value diff --git a/src/game/server/teams.cpp b/src/game/server/teams.cpp index 934bd4756a..360ad4ef97 100644 --- a/src/game/server/teams.cpp +++ b/src/game/server/teams.cpp @@ -861,6 +861,15 @@ void CGameTeams::AddTaggedMapVote(IGameController *Controller, int Tag) Controller->AddVote(Controller, aBuf, aBufCom); } } + +const char *CGameTeams::GetMapName(int NumMap) +{ + NumMap--; + if(NumMap >= 0 && NumMap < m_NumMaps) + return m_aMapNames[NumMap]; + + return nullptr; +} /* Hunter End */ int CGameTeams::GetMapIndex(const char *pMapName) diff --git a/src/game/server/teams.h b/src/game/server/teams.h index edbd5467a0..056a92917a 100644 --- a/src/game/server/teams.h +++ b/src/game/server/teams.h @@ -147,6 +147,7 @@ class CGameTeams static void AddMap(const char *pMapName); static void AddMapWithTag(const char *pMapName, int Tag); // Hunter static void AddTaggedMapVote(IGameController *Controller, int Tag); // Hunter + const char *GetMapName(int NumMap); static int GetMapIndex(const char *pMapName); void UpdateGameTypeName(); diff --git a/src/game/server/weapons.h b/src/game/server/weapons.h index 7a5762968e..72c564b8b8 100644 --- a/src/game/server/weapons.h +++ b/src/game/server/weapons.h @@ -10,7 +10,7 @@ REGISTER_WEAPON(WEAPON_ID_NINJA, CNinja) REGISTER_WEAPON(WEAPON_ID_EXPLODINGLASER, CExplodingLaser) REGISTER_WEAPON(WEAPON_ID_HUNTHAMMER, CHuntHammer) // Hunter -REGISTER_WEAPON(WEAPON_ID_JUGNINJA, CJugNinja) // Hunter +//REGISTER_WEAPON(WEAPON_ID_JUGNINJA, CJugNinja) // Hunter #else @@ -27,7 +27,7 @@ REGISTER_WEAPON(WEAPON_ID_JUGNINJA, CJugNinja) // Hunter #include "weapons/explodinglaser.h" #include "weapons/hunthammer.h" // Hunter -#include "weapons/jugninja.h" // Hunter +//#include "weapons/jugninja.h" // Hunter enum { diff --git a/src/game/server/weapons/grenade.cpp b/src/game/server/weapons/grenade.cpp index fda67d9078..84b2098836 100644 --- a/src/game/server/weapons/grenade.cpp +++ b/src/game/server/weapons/grenade.cpp @@ -74,7 +74,7 @@ bool CGrenade::GrenadeCollide(CProjectile *pProj, vec2 Pos, CCharacter *pHit, bo WEAPON_SHOTGUN, //Type pProj->GetWeaponID(), //WeaponID pProj->GetOwner(), //Owner - FragPos, //Pos + FragPos + d, //Pos d * 0.5f, //Dir 6.0f, // Radius 0.2f * pProj->Server()->TickSpeed(), //Span diff --git a/src/game/version.h b/src/game/version.h index 74d582155e..88f5629566 100644 --- a/src/game/version.h +++ b/src/game/version.h @@ -5,7 +5,7 @@ #ifndef GAME_RELEASE_VERSION #define GAME_RELEASE_VERSION "15.4" #endif -#define GAME_VERSION "0.6.4, " GAME_RELEASE_VERSION ", 0.3a1" +#define GAME_VERSION "0.6.4, " GAME_RELEASE_VERSION ", 0.3a2_p0" #define GAME_NETVERSION "0.6 626fce9a778df4d4" #define GAME_NAME "DDNet" #define CLIENT_VERSIONNR 15040