diff --git a/data/editor/entities_clear.png b/data/editor/entities_clear.png index 5ec7d3c61..43f11cd86 100644 Binary files a/data/editor/entities_clear.png and b/data/editor/entities_clear.png differ diff --git a/src/game/client/components/players.cpp b/src/game/client/components/players.cpp index 9f09d7f93..a9c769d9f 100644 --- a/src/game/client/components/players.cpp +++ b/src/game/client/components/players.cpp @@ -583,7 +583,7 @@ void CPlayers::RenderPlayer( Hit = Collision()->IntersectLineTeleHook(OldPos, NewPos, &finishPos, 0x0, &teleNr, true); if(!doBreak && Hit) { - if (!(Hit&CCollision::COLFLAG_NOHOOK)) + if (Hit != TILE_NOHOOK) Graphics()->SetColor(130.0f/255.0f, 232.0f/255.0f, 160.0f/255.0f, Alpha); } diff --git a/src/game/collision.cpp b/src/game/collision.cpp index 7d9531037..b149bd79d 100644 --- a/src/game/collision.cpp +++ b/src/game/collision.cpp @@ -108,59 +108,17 @@ void CCollision::Init(class CLayers *pLayers) } if(m_pFront) { + // remove unused tiles from front layer Index = m_pFront[i].m_Index; - - if(Index <= TILE_NPH_START) - { - switch(Index) - { - case TILE_DEATH: - m_pFront[i].m_Index = COLFLAG_DEATH; - break; - case TILE_SOLID: - m_pFront[i].m_Index = 0; - break; - case TILE_NOHOOK: - m_pFront[i].m_Index = 0; - break; - case TILE_NOLASER: - m_pFront[i].m_Index = TILE_NOLASER; - break; - default: - m_pFront[i].m_Index = 0; - } - - // DDRace tiles - if(Index == TILE_THROUGH || Index == TILE_FREEZE || (Index >= TILE_UNFREEZE && Index <= TILE_DUNFREEZE) || (Index >= TILE_WALLJUMP && Index <= TILE_SOLO_END) || (Index >= TILE_REFILL_JUMPS && Index <= TILE_STOPA) || Index == TILE_CP || Index == TILE_CP_F || (Index >= TILE_OLDLASER && Index <= TILE_NPH) || (Index >= TILE_NPC_END && Index <= TILE_NPH_END) || (Index >= TILE_NPC_START && Index <= TILE_NPH_START)) - m_pFront[i].m_Index = Index; - } + if(Index <= TILE_NPH_START && !(Index == TILE_DEATH || Index == TILE_NOLASER || Index == TILE_THROUGH || Index == TILE_FREEZE || (Index >= TILE_UNFREEZE && Index <= TILE_DUNFREEZE) || (Index >= TILE_WALLJUMP && Index <= TILE_SOLO_END) || (Index >= TILE_REFILL_JUMPS && Index <= TILE_STOPA) || Index == TILE_CP || Index == TILE_CP_F || (Index >= TILE_OLDLASER && Index <= TILE_NPH) || (Index >= TILE_NPC_END && Index <= TILE_NPH_END) || (Index >= TILE_NPC_START && Index <= TILE_NPH_START))) + m_pFront[i].m_Index = 0; } + // remove unused tiles from game layer Index = m_pTiles[i].m_Index; - if(Index <= TILE_NPH_START) - { - switch(Index) - { - case TILE_DEATH: - m_pTiles[i].m_Index = COLFLAG_DEATH; - break; - case TILE_SOLID: - m_pTiles[i].m_Index = COLFLAG_SOLID; - break; - case TILE_NOHOOK: - m_pTiles[i].m_Index = COLFLAG_SOLID|COLFLAG_NOHOOK; - break; - case TILE_NOLASER: - m_pTiles[i].m_Index = TILE_NOLASER; - break; - default: + if(Index <= TILE_NPH_START && !((Index >= TILE_SOLID && Index <= TILE_NOLASER) || Index == TILE_THROUGH || Index == TILE_FREEZE || (Index >= TILE_UNFREEZE && Index <= TILE_DUNFREEZE) || (Index >= TILE_WALLJUMP && Index <= TILE_SOLO_END) || (Index >= TILE_REFILL_JUMPS && Index <= TILE_STOPA) || Index == TILE_CP || Index == TILE_CP_F || (Index >= TILE_OLDLASER && Index <= TILE_NPH) || (Index >= TILE_NPC_END && Index <= TILE_NPH_END) || (Index >= TILE_NPC_START && Index <= TILE_NPH_START))) m_pTiles[i].m_Index = 0; - } - - // DDRace tiles - if(Index == TILE_THROUGH || Index == TILE_FREEZE || (Index >= TILE_UNFREEZE && Index <= TILE_DUNFREEZE) || (Index >= TILE_WALLJUMP && Index <= TILE_SOLO_END) || (Index >= TILE_REFILL_JUMPS && Index <= TILE_STOPA) || Index == TILE_CP || Index == TILE_CP_F || (Index >= TILE_OLDLASER && Index <= TILE_NPH) || (Index >= TILE_NPC_END && Index <= TILE_NPH_END) || (Index >= TILE_NPC_START && Index <= TILE_NPH_START)) - m_pTiles[i].m_Index = Index; - } } + if(m_NumSwitchers) { m_pSwitchers = new SSwitchers[m_NumSwitchers+1]; @@ -187,19 +145,11 @@ int CCollision::GetTile(int x, int y) int Ny = clamp(y/32, 0, m_Height-1); int pos = Ny * m_Width + Nx; - if(m_pTiles[pos].m_Index == COLFLAG_SOLID - || m_pTiles[pos].m_Index == (COLFLAG_SOLID|COLFLAG_NOHOOK) - || m_pTiles[pos].m_Index == COLFLAG_DEATH - || m_pTiles[pos].m_Index == TILE_NOLASER) + if(m_pTiles[pos].m_Index >= TILE_SOLID && m_pTiles[pos].m_Index <= TILE_NOLASER) return m_pTiles[pos].m_Index; return 0; } -/* -bool CCollision::IsTileSolid(int x, int y) -{ - return GetTile(x, y)&COLFLAG_SOLID; -} -*/ + // TODO: rewrite this smarter! int CCollision::IntersectLine(vec2 Pos0, vec2 Pos1, vec2 *pOutCollision, vec2 *pOutBeforeCollision, bool AllowThrough) { @@ -267,7 +217,7 @@ int CCollision::IntersectLineTeleHook(vec2 Pos0, vec2 Pos1, vec2 *pOutCollision, *pOutCollision = Pos; if(pOutBeforeCollision) *pOutBeforeCollision = Last; - return COLFLAG_TELE; + return TILE_TELEINHOOK; } if((CheckPoint(ix, iy) && !(AllowThrough && IsThrough(ix + dx, iy + dy)))) @@ -318,7 +268,7 @@ int CCollision::IntersectLineTeleWeapon(vec2 Pos0, vec2 Pos1, vec2 *pOutCollisio *pOutCollision = Pos; if(pOutBeforeCollision) *pOutBeforeCollision = Last; - return COLFLAG_TELE; + return TILE_TELEINWEAPON; } if((CheckPoint(ix, iy) && !(AllowThrough && IsThrough(ix + dx, iy + dy)))) @@ -473,7 +423,8 @@ void CCollision::Dest() int CCollision::IsSolid(int x, int y) { - return (GetTile(x,y)&COLFLAG_SOLID); + int index = GetTile(x,y); + return index == TILE_SOLID || index == TILE_NOHOOK; } int CCollision::IsThrough(int x, int y) @@ -957,7 +908,7 @@ int CCollision::GetFTile(int x, int y) int Nx = clamp(x/32, 0, m_Width-1); int Ny = clamp(y/32, 0, m_Height-1); /*dbg_msg("GetFTile","m_Index %d",m_pFront[Ny*m_Width+Nx].m_Index);//Remove */ - if(m_pFront[Ny*m_Width+Nx].m_Index == COLFLAG_DEATH + if(m_pFront[Ny*m_Width+Nx].m_Index == TILE_DEATH || m_pFront[Ny*m_Width+Nx].m_Index == TILE_NOLASER) return m_pFront[Ny*m_Width+Nx].m_Index; else @@ -1015,12 +966,12 @@ int CCollision::Entity(int x, int y, int Layer) } } -void CCollision::SetCollisionAt(float x, float y, int flag) +void CCollision::SetCollisionAt(float x, float y, int id) { int Nx = clamp(round_to_int(x)/32, 0, m_Width-1); int Ny = clamp(round_to_int(y)/32, 0, m_Height-1); - m_pTiles[Ny * m_Width + Nx].m_Index = flag; + m_pTiles[Ny * m_Width + Nx].m_Index = id; } void CCollision::SetDCollisionAt(float x, float y, int Type, int Flags, int Number) @@ -1100,8 +1051,8 @@ int CCollision::IntersectNoLaser(vec2 Pos0, vec2 Pos1, vec2 *pOutCollision, vec2 vec2 Pos = mix(Pos0, Pos1, a); int Nx = clamp(round_to_int(Pos.x)/32, 0, m_Width-1); int Ny = clamp(round_to_int(Pos.y)/32, 0, m_Height-1); - if(GetIndex(Nx, Ny) == COLFLAG_SOLID - || GetIndex(Nx, Ny) == (COLFLAG_SOLID|COLFLAG_NOHOOK) + if(GetIndex(Nx, Ny) == TILE_SOLID + || GetIndex(Nx, Ny) == TILE_NOHOOK || GetIndex(Nx, Ny) == TILE_NOLASER || GetFIndex(Nx, Ny) == TILE_NOLASER) { diff --git a/src/game/collision.h b/src/game/collision.h index 6a03b5ae9..c236c5a2c 100644 --- a/src/game/collision.h +++ b/src/game/collision.h @@ -15,21 +15,7 @@ class CCollision int m_Height; class CLayers *m_pLayers; - //bool IsTileSolid(int x, int y); - //int GetTile(int x, int y); - public: - enum - { - COLFLAG_SOLID=1, - COLFLAG_DEATH=2, - COLFLAG_NOHOOK=4, - // DDRace - //COLFLAG_NOLASER=8, // Unused, now used for TimedSwitchActivation - //COLFLAG_THROUGH=16, // Unused, now used for WallJump - COLFLAG_TELE=32 - }; - CCollision(); void Init(class CLayers *pLayers); bool CheckPoint(float x, float y) { return IsSolid(round_to_int(x), round_to_int(y)); } @@ -47,7 +33,7 @@ public: // DDRace void Dest(); - void SetCollisionAt(float x, float y, int Flag); + void SetCollisionAt(float x, float y, int id); void SetDTile(float x, float y, bool State); void SetDCollisionAt(float x, float y, int Type, int Flags, int Number); int GetDTileIndex(int Index); @@ -82,7 +68,6 @@ public: int IsTeleportWeapon(int Index); int IsTeleportHook(int Index); int IsTCheckpoint(int Index); - //int IsCheckpoint(int Index); int IsSpeedup(int Index); int IsTune(int Index); void GetSpeedup(int Index, vec2 *Dir, int *Force, int *MaxSpeed); diff --git a/src/game/gamecore.cpp b/src/game/gamecore.cpp index 299eb42a6..572853653 100644 --- a/src/game/gamecore.cpp +++ b/src/game/gamecore.cpp @@ -279,9 +279,9 @@ void CCharacterCore::Tick(bool UseInput, bool IsClient) if(Hit) { - if(Hit&CCollision::COLFLAG_NOHOOK) + if(Hit == TILE_NOHOOK) GoingToRetract = true; - else if (Hit&CCollision::COLFLAG_TELE) + else if (Hit == TILE_TELEINHOOK) GoingThroughTele = true; else GoingToHitGround = true; diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index cd2b401df..c13a41857 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -742,16 +742,6 @@ void CCharacter::Tick() m_Core.m_Input = m_Input; m_Core.Tick(true, false); - /*// handle death-tiles and leaving gamelayer - if(GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || - GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || - GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || - GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || - GameLayerClipped(m_Pos)) - { - Die(m_pPlayer->GetCID(), WEAPON_WORLD); - }*/ - // handle Weapons HandleWeapons(); @@ -1239,13 +1229,13 @@ void CCharacter::HandleBroadcast() void CCharacter::HandleSkippableTiles(int Index) { // handle death-tiles and leaving gamelayer - if((GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || - GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || - GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || - GameServer()->Collision()->GetFCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || - GameServer()->Collision()->GetFCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || - GameServer()->Collision()->GetFCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || - GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH) && + if((GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f) == TILE_DEATH || + GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f) == TILE_DEATH || + GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f) == TILE_DEATH || + GameServer()->Collision()->GetFCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f) == TILE_DEATH|| + GameServer()->Collision()->GetFCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f) == TILE_DEATH || + GameServer()->Collision()->GetFCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f) == TILE_DEATH || + GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f) == TILE_DEATH) && !m_Super && !(Team() && Teams()->TeeFinished(m_pPlayer->GetCID()))) { Die(m_pPlayer->GetCID(), WEAPON_WORLD); diff --git a/src/game/server/entities/laser.cpp b/src/game/server/entities/laser.cpp index 2b05439b6..b6bfe06f3 100644 --- a/src/game/server/entities/laser.cpp +++ b/src/game/server/entities/laser.cpp @@ -116,7 +116,7 @@ void CLaser::DoBounce() if(Res == -1) { f = GameServer()->Collision()->GetTile(round_to_int(Coltile.x), round_to_int(Coltile.y)); - GameServer()->Collision()->SetCollisionAt(round_to_int(Coltile.x), round_to_int(Coltile.y), CCollision::COLFLAG_SOLID); + GameServer()->Collision()->SetCollisionAt(round_to_int(Coltile.x), round_to_int(Coltile.y), TILE_SOLID); } GameServer()->Collision()->MovePoint(&TempPos, &TempDir, 1.0f, 0); if(Res == -1) @@ -131,7 +131,7 @@ void CLaser::DoBounce() else m_Energy -= distance(m_From, m_Pos) + GameServer()->TuningList()[m_TuneZone].m_LaserBounceCost; - if (Res&CCollision::COLFLAG_TELE && ((CGameControllerDDRace*)GameServer()->m_pController)->m_TeleOuts[z-1].size()) + if (Res == TILE_TELEINWEAPON && ((CGameControllerDDRace*)GameServer()->m_pController)->m_TeleOuts[z-1].size()) { int Num = ((CGameControllerDDRace*)GameServer()->m_pController)->m_TeleOuts[z-1].size(); m_TelePos = ((CGameControllerDDRace*)GameServer()->m_pController)->m_TeleOuts[z-1][(!Num)?Num:rand() % Num]; diff --git a/src/game/server/gamemodes/ctf.cpp b/src/game/server/gamemodes/ctf.cpp index 3e691fd48..a11e76283 100644 --- a/src/game/server/gamemodes/ctf.cpp +++ b/src/game/server/gamemodes/ctf.cpp @@ -156,7 +156,7 @@ void CGameControllerCTF::Tick() continue; // flag hits death-tile or left the game layer, reset it - if(GameServer()->Collision()->GetCollisionAt(F->m_Pos.x, F->m_Pos.y)&CCollision::COLFLAG_DEATH || F->GameLayerClipped(F->m_Pos)) + if(GameServer()->Collision()->GetCollisionAt(F->m_Pos.x, F->m_Pos.y) == TILE_DEATH || F->GameLayerClipped(F->m_Pos)) { GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", "flag_return"); GameServer()->CreateSoundGlobal(SOUND_CTF_RETURN);