Releasing this because I might aswell!
You must give credits if you use this, as I may update this thread if i change the gamemode(s) and I use this myself.
This basically just makes a new Deathmatch & Team Deathmatch and makes the bullet marks on the walls like this:
In MBaseGameType.cpp
Under:
Add:Code:#define MMATCH_GAMETYPE_CTF_STR "Capture the Flag"
Code:#define MMATCH_GAMETYPE_PAINTBALL_SOLO_STR "Paintball" #define MMATCH_GAMETYPE_PAINTBALL_TEAM_STR "Team Paintball"
In MBaseGameType.h
Under:
Add:Code:MMATCH_GAMETYPE_BERSERKER =8, ///< µ¥¾²¸ÅÄ¡ ¹ö¼Ä¿ MMATCH_GAMETYPE_DEATHMATCH_TEAM2 =9, ///< ÆÀµ¥¾²¸ÅÄ¡ ÀͽºÆ®¸² MMATCH_GAMETYPE_DUEL =10, ///< µà¾ó ¸ÅÄ¡ MMATCH_GAMETYPE_DUELTOURNAMENT =11, ///< µà¾ó Åä³Ê¸ÕÆ® MMATCH_GAMETYPE_CTF =12, ///< µà¾ó Åä³Ê¸ÕÆ®
Code:MMATCH_GAMETYPE_PAINTBALL_SOLO =13, MMATCH_GAMETYPE_PAINTBALL_TEAM =14,
In MBaseGameType.cpp
Under:
Add:Code:_InitGameType(MMATCH_GAMETYPE_CTF, MMATCH_GAMETYPE_CTF, MMATCH_GAMETYPE_CTF_STR, 1.0f, 0.6f, 0.5f);
In MMatchStage.cppCode:_InitGameType(MMATCH_GAMETYPE_PAINTBALL_SOLO, MMATCH_GAMETYPE_PAINTBALL_SOLO, MMATCH_GAMETYPE_PAINTBALL_SOLO_STR, 1.0f, 1.0f, 0.0f); _InitGameType(MMATCH_GAMETYPE_PAINTBALL_TEAM, MMATCH_GAMETYPE_PAINTBALL_TEAM, MMATCH_GAMETYPE_PAINTBALL_TEAM_STR, 1.0f, 0.8f, 0.3f);
Under:
Add:Code:case MMATCH_GAMETYPE_CTF: { return (new MMatchRuleTeamCTF(this)); } break;
Code:case MMATCH_GAMETYPE_PAINTBALL_SOLO: { return (new MMatchRuleSoloPaintball(this)); } break; case MMATCH_GAMETYPE_PAINTBALL_TEAM: { return (new MMatchRuleTeamPaintball(this)); } break;
Replace this function:
Replace this function:Code:inline bool MBaseGameTypeCatalogue::IsTeamGame(MMATCH_GAMETYPE nGameType) { // Á»´õ º¹ÀâÇØÁö¸é Description¿¡ teamgameÀÎÁö ¿©ºÎ°ªÀ» ³Öµµ·Ï ÇÏÀÚ. if ((nGameType == MMATCH_GAMETYPE_DEATHMATCH_TEAM) || (nGameType == MMATCH_GAMETYPE_PAINTBALL_TEAM) || (nGameType == MMATCH_GAMETYPE_DEATHMATCH_TEAM2) || (nGameType == MMATCH_GAMETYPE_GLADIATOR_TEAM) || (nGameType == MMATCH_GAMETYPE_ASSASSINATE) || (nGameType == MMATCH_GAMETYPE_CTF)) { return true; } return false; }
Replace this function:Code:inline bool MBaseGameTypeCatalogue::IsTeamLimitTime(MMATCH_GAMETYPE nGameType) { // Á»´õ º¹ÀâÇØÁö¸é Description¿¡ teamgameÀÎÁö ¿©ºÎ°ªÀ» ³Öµµ·Ï ÇÏÀÚ. if ((nGameType == MMATCH_GAMETYPE_DEATHMATCH_TEAM) || (nGameType == MMATCH_GAMETYPE_PAINTBALL_TEAM) || (nGameType == MMATCH_GAMETYPE_GLADIATOR_TEAM) || (nGameType == MMATCH_GAMETYPE_DUEL) || (nGameType == MMATCH_GAMETYPE_ASSASSINATE) || (nGameType == MMATCH_GAMETYPE_CTF)) { return true; } return false; }
Replace this function:Code:inline bool MBaseGameTypeCatalogue::IsWaitForRoundEnd(MMATCH_GAMETYPE nGameType) { // ¶ó¿îµå ³¡³¯¶§±îÁö ´ë±â¸ðµå Çϴ°¡? if ((nGameType == MMATCH_GAMETYPE_DEATHMATCH_TEAM) || (nGameType == MMATCH_GAMETYPE_PAINTBALL_TEAM) || (nGameType == MMATCH_GAMETYPE_DUEL) || (nGameType == MMATCH_GAMETYPE_GLADIATOR_TEAM) || (nGameType == MMATCH_GAMETYPE_ASSASSINATE) || (nGameType == MMATCH_GAMETYPE_DUELTOURNAMENT)) { return true; } return false; }
Add these functions:Code:inline bool MBaseGameTypeCatalogue::IsTeamExtremeGame(MMATCH_GAMETYPE nGameType) { // Á»´õ º¹ÀâÇØÁö¸é Description¿¡ teamgameÀÎÁö ¿©ºÎ°ªÀ» ³Öµµ·Ï ÇÏÀÚ. if ((nGameType == MMATCH_GAMETYPE_DEATHMATCH_TEAM2) || (nGameType == MMATCH_GAMETYPE_CTF) || (nGameType == MMATCH_GAMETYPE_PAINTBALL_TEAM)) { return true; } return false; }
Add these classes to MMatchRuleDeathmatch.h:Code:inline bool IsGameRulePaintballTeam(MMATCH_GAMETYPE nGameType) { return (nGameType == MMATCH_GAMETYPE_PAINTBALL_TEAM); } inline bool IsGameRulePaintballSolo(MMATCH_GAMETYPE nGameType) { return (nGameType == MMATCH_GAMETYPE_PAINTBALL_SOLO); }
In ZGameInterface.cppCode:/********************************************** Paintball Team and Paintball Solo **********************************************/ class MMatchRuleSoloPaintball : public MMatchRule { protected: bool CheckKillCount(MMatchObject* pOutObject); virtual void OnBegin(); virtual void OnEnd(); virtual void OnRoundTimeOut(); virtual bool OnCheckRoundFinish(); virtual bool RoundCount(); public: MMatchRuleSoloPaintball(MMatchStage* pStage); virtual ~MMatchRuleSoloPaintball() { } virtual MMATCH_GAMETYPE GetGameType() { return MMATCH_GAMETYPE_PAINTBALL_SOLO; } }; class MMatchRuleTeamPaintball : public MMatchRule { protected: bool GetAliveCount(int* pRedAliveCount, int* pBlueAliveCount); virtual void OnBegin(); virtual void OnEnd(); virtual bool OnRun(); virtual void OnRoundBegin(); virtual void OnRoundEnd(); virtual bool OnCheckRoundFinish(); virtual void OnRoundTimeOut(); virtual bool RoundCount(); virtual bool OnCheckEnableBattleCondition(); public: MMatchRuleTeamPaintball(MMatchStage* pStage); virtual ~MMatchRuleTeamPaintball() {} virtual void CalcTeamBonus(MMatchObject* pAttacker, MMatchObject* pVictim, int nSrcExp, int* poutAttackerExp, int* poutTeamExp); virtual MMATCH_GAMETYPE GetGameType() { return MMATCH_GAMETYPE_PAINTBALL_TEAM; } };
Under:
Add:Code:ZGetGameTypeManager()->SetGameTypeStr( MMATCH_GAMETYPE_CTF, ZMsg( MSG_MT_CTF));
Change:Code:ZGetGameTypeManager()->SetGameTypeStr( MMATCH_GAMETYPE_PAINTBALL_SOLO, ZMsg( MSG_MT_PAINTBALL_SOLO )); ZGetGameTypeManager()->SetGameTypeStr( MMATCH_GAMETYPE_PAINTBALL_TEAM, ZMsg( MSG_MT_PAINTBALL_TEAM ));
To:Code:case MMATCH_GAMETYPE_DEATHMATCH_TEAM: case MMATCH_GAMETYPE_DEATHMATCH_TEAM2: case MMATCH_GAMETYPE_CTF: color = TDM_COLOR; break;
Code:case MMATCH_GAMETYPE_DEATHMATCH_TEAM: case MMATCH_GAMETYPE_DEATHMATCH_TEAM2: case MMATCH_GAMETYPE_PAINTBALL_TEAM: case MMATCH_GAMETYPE_CTF: color = TDM_COLOR; break;
Find:
Replace nearby statement:Code:bool bQuestUI = false; if ( (pSetting->nGameType == MMATCH_GAMETYPE_DEATHMATCH_SOLO) || // µ¥¾²¸ÅÄ¡ °³ÀÎÀüÀ̰ųª... (pSetting->nGameType == MMATCH_GAMETYPE_GLADIATOR_SOLO) || // Ä®Àü °³ÀÎÀüÀ̰ųª... (pSetting->nGameType == MMATCH_GAMETYPE_BERSERKER) || // ¹ö¼Ä¿¸ðµåÀ̰ųª... (pSetting->nGameType == MMATCH_GAMETYPE_TRAINING) || // Æ®·¹ÀÌ´×À̰ųª... (pSetting->nGameType == MMATCH_GAMETYPE_DUEL)) // µà¾ó¸ðµå À̸é... { // ¸Ê À̸§ ¹è°æ À̹ÌÁö º¯È¯ if ( pAniMapImg) pAniMapImg->SetCurrentFrame( 0); // Äù½ºÆ® UI °¨Ãã bQuestUI = false; }
Code:else if ( (pSetting->nGameType == MMATCH_GAMETYPE_DEATHMATCH_TEAM) || // µ¥¾²¸ÅÄ¡ ÆÀÀüÀ̰ųª... (pSetting->nGameType == MMATCH_GAMETYPE_DEATHMATCH_TEAM2) || // ¹«Çѵ¥½º¸ÅÄ¡ ÆÀÀüÀ̰ųª... (pSetting->nGameType == MMATCH_GAMETYPE_GLADIATOR_TEAM) || // Ä®Àü ÆÀÀüÀ̰ųª... (pSetting->nGameType == MMATCH_GAMETYPE_ASSASSINATE) || (pSetting->nGameType == MMATCH_GAMETYPE_PAINTBALL_TEAM) || (pSetting->nGameType == MMATCH_GAMETYPE_CTF)) // ¾Ï»ìÀü À̸é...
Replace this function:
Code:void ZEffectBulletMarkList::Update(float fElapsed) { if(!strstr(strlwr((char*)ZGetGameClient()->GetStageName()), "[ph]")) { if((ZGetGameClient()->GetMatchStageSetting()->GetGameType() == MMATCH_GAMETYPE_PAINTBALL_SOLO) != 0) { if((ZGetGameClient()->GetMatchStageSetting()->GetGameType() == MMATCH_GAMETYPE_PAINTBALL_TEAM) != 0) { for(iterator i=begin();i!=end();) { ZEFFECTBULLETMARKITEM *p = (ZEFFECTBULLETMARKITEM*)*i; p->fElapsedTime+=fElapsed; if( p->fElapsedTime > m_fLifeTime ) { delete p; i=erase(i); continue; } float fVanish = min(1,max(0,(m_fLifeTime - p->fElapsedTime)/m_fVanishTime)); DWORD color = ((DWORD)(fVanish * 255))<<24 | 0xffffff; p->v[0].color = color; p->v[1].color = color; p->v[2].color = color; p->v[3].color = color; i++; } } } } }
In ZRule.cpp:
Add to the bottom of ZRule::CreateRule() (above default):
In ZMessages.h:Code:case MMATCH_GAMETYPE_PAINTBALL_SOLO: { return (new ZRuleSoloPaintball(pMatch)); } break; case MMATCH_GAMETYPE_PAINTBALL_TEAM: { return (new ZRuleTeamPaintball(pMatch)); } break;
Add:
Code:#define MSG_MT_PAINTBALL_SOLO 9916 ///< Paintball Solo #define MSG_MT_PAINTBALL_TEAM 9917 ///< Paintball Team
*********************** Adding paintballs ********************
Under:
Add:Code:RMeshMgr* m_pEffectMeshMgr; ZEffectBulletMarkList m_BulletMarkList;
Under:Code://Paintball declaration ZEffectBulletMarkList m_PaintballMarkList; ZEffectBulletMarkList m_Paintball2MarkList; ZEffectBulletMarkList m_Paintball3MarkList; ZEffectBulletMarkList m_Paintball4MarkList; ZEffectBulletMarkList m_Paintball5MarkList; ZEffectBulletMarkList m_Paintball6MarkList; ZEffectBulletMarkList m_Paintball7MarkList;
Add:Code:m_BulletMarkList.Create("SFX/gz_sfx_shotgun_bulletmark02.tga");
Code://Paintball texture setup m_PaintballMarkList.Create("SFX/paintball01.tga"); m_Paintball2MarkList.Create("SFX/paintball02.tga"); m_Paintball3MarkList.Create("SFX/paintball03.tga"); m_Paintball4MarkList.Create("SFX/paintball04.tga"); m_Paintball5MarkList.Create("SFX/paintball05.tga"); m_Paintball6MarkList.Create("SFX/paintball06.tga"); m_Paintball7MarkList.Create("SFX/paintball07.tga");
Under:
Add:Code:if( mode==1 ) {// ¹° ¹Û¿¡¼¸¸ ±×¸°´Ù.. m_BulletMarkList.Draw();
Code://Paintball drawing m_PaintballMarkList.Draw(); m_Paintball2MarkList.Draw(); m_Paintball3MarkList.Draw(); m_Paintball4MarkList.Draw(); m_Paintball5MarkList.Draw(); m_Paintball6MarkList.Draw(); m_Paintball7MarkList.Draw();
Under:
Code:delete pEffect; node = m_Effects[d].erase(node); m__cnt++; } else { if(pEffect->m_bisRendered) m__rendered++;//for debug ++node; m__cnt++; } } } } m_BulletMarkList.Draw();
Add:
Code://Paintball drawing m_PaintballMarkList.Draw(); m_Paintball2MarkList.Draw(); m_Paintball3MarkList.Draw(); m_Paintball4MarkList.Draw(); m_Paintball5MarkList.Draw(); m_Paintball6MarkList.Draw(); m_Paintball7MarkList.Draw();
Under:
Code:for(int i=0;i<BILLBOARDLISTS_COUNT;i++) m_BillboardLists[i].Update(fElapsed); m_BulletMarkList.Update(fElapsed);
Add:
Code://Paintball update m_PaintballMarkList.Update(fElapsed); m_Paintball2MarkList.Update(fElapsed); m_Paintball3MarkList.Update(fElapsed); m_Paintball4MarkList.Update(fElapsed); m_Paintball5MarkList.Update(fElapsed); m_Paintball6MarkList.Update(fElapsed); m_Paintball7MarkList.Update(fElapsed);
Under:
Add:Code:for(int i=0;i<BILLBOARDTEXANILIST_COUNT;i++) m_BillBoardTexAniList[i].Clear(); m_BulletMarkList.Clear();
In: ZEffectManager::AddBulletMark(rvector& Target, rvector& TargetNormal)Code:m_PaintballMarkList.Clear(); m_Paintball2MarkList.Clear(); m_Paintball3MarkList.Clear(); m_Paintball4MarkList.Clear(); m_Paintball5MarkList.Clear(); m_Paintball6MarkList.Clear(); m_Paintball7MarkList.Clear();
Replace:
with:Code:m_BulletMarkList.Add(Target+TargetNormal,TargetNormal);
As per the CTF gamemode, you'll have to put the gamemodes in gametypecfg.xml and reference them in a channel in channelrule.xml. Then unpack sfx.mrs and put these files inside the root folder, and repack. You should be good to go, if not, reply here.Code://Check for paintball mode if( (ZGetGameClient()->GetMatchStageSetting()->GetGameType() == MMATCH_GAMETYPE_PAINTBALL_SOLO) || (ZGetGameClient()->GetMatchStageSetting()->GetGameType() == MMATCH_GAMETYPE_PAINTBALL_TEAM)) { switch(rand()%7+1) { //edit 7 to increase paintball count case 1: { m_PaintballMarkList.Add(Target+TargetNormal, TargetNormal); nBulletCount++; } break; case 2: { m_Paintball2MarkList.Add(Target+TargetNormal, TargetNormal); nBulletCount++; } break; case 3: { m_Paintball3MarkList.Add(Target+TargetNormal, TargetNormal); nBulletCount++; } case 4: { m_Paintball4MarkList.Add(Target+TargetNormal, TargetNormal); nBulletCount++; } break; case 5: { m_Paintball5MarkList.Add(Target+TargetNormal, TargetNormal); nBulletCount++; } break; case 6: { m_Paintball6MarkList.Add(Target+TargetNormal, TargetNormal); nBulletCount++; } break; case 7: { m_Paintball7MarkList.Add(Target+TargetNormal, TargetNormal); nBulletCount++; } break; } if(rand()%1) m_BulletMarkList.Add(Target+TargetNormal, TargetNormal); } else { m_BulletMarkList.Add(Target+TargetNormal,TargetNormal); }
sfx.zip
You could also change the amount of paintballs and make your own, just make sure they're named in the right way.




![[Gamemode] Paintball / Team Paintball](http://ragezone.com/hyper728.png)



