mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-19 22:48:18 +00:00
Add Door, connector and trigger. Not tested i need work.
Signed-off-by: btd <bardadymchik@gmail.com>
This commit is contained in:
parent
afa93fb203
commit
2cf2a5b1d2
|
@ -67,7 +67,7 @@ enum
|
|||
ENTITY_CRAZY_SHOTGUN_L,
|
||||
//DDrace - Doors
|
||||
ENTITY_DOOR,
|
||||
ENTITY_CONNECTOR_D,
|
||||
ENTITY_CONNECTOR_D,//TODO: in ddrace stable used this one no need others rename ENTITY_CONNECTOR
|
||||
ENTITY_CONNECTOR_DR,
|
||||
ENTITY_CONNECTOR_R,
|
||||
ENTITY_CONNECTOR_RU,
|
||||
|
|
77
src/game/server/entities/door.cpp
Normal file
77
src/game/server/entities/door.cpp
Normal file
|
@ -0,0 +1,77 @@
|
|||
#include <game/generated/protocol.h>
|
||||
#include <game/server/gamecontext.h>
|
||||
#include <engine/shared/config.h>
|
||||
|
||||
#include "door.h"
|
||||
|
||||
CDoor::CDoor(GameWorld *pGameWorld, vec2 Pos, float Rotation, int Length, bool Opened)
|
||||
: CEntity(pGameWorld, NETOBJTYPE_LASER)
|
||||
{
|
||||
m_Pos = Pos;
|
||||
m_Opened = Opened;
|
||||
|
||||
vec2 Dir = vec2(sin(rotation), cos(rotation));
|
||||
vec2 To = Pos + normalize(Dir)*Length;
|
||||
|
||||
GameServer()->Collision()->IntersectCharacter(Pos, To, &this->m_To, 0);
|
||||
GameWorld()->InsertEntity(this);
|
||||
}
|
||||
|
||||
void CDoor::Open(int Tick)
|
||||
{
|
||||
m_EvalTick = Tick;
|
||||
m_Opened = true;
|
||||
}
|
||||
|
||||
void CDoor::Close()
|
||||
{
|
||||
m_Opened = false;
|
||||
}
|
||||
|
||||
bool CDoor::HitCharacter()
|
||||
{
|
||||
vec2 At;
|
||||
CCharacter *Hit = GameServer()->m_World.IntersectCharacter(m_Pos, m_To, 1.f, At, 0);
|
||||
if(!Hit)
|
||||
return false;
|
||||
Hit->m_Doored = true;
|
||||
//hit->reset_pos();
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
void CDoor::Reset()
|
||||
{
|
||||
m_Opened = false;
|
||||
}
|
||||
|
||||
void CDoor::Tick()
|
||||
{
|
||||
if (!m_Opened)
|
||||
HitCharacter();
|
||||
else if (m_EvalTick + 10 < Server()->Tick())
|
||||
Close();
|
||||
return;
|
||||
}
|
||||
|
||||
void CDoor::Snap(int SnappingClient)
|
||||
{
|
||||
if(NetworkClipped(SnappingClient, m_Pos) && NetworkClipped(SnappingClient, m_To))
|
||||
return;
|
||||
|
||||
CNetObj_Laser *pObj = static_cast<CNetObj_Laser *>(Server()->SnapNewItem(NETOBJTYPE_LASER, m_Id, sizeof(CNetObj_Laser)));
|
||||
pObj->m_X = (int)m_Pos.x;
|
||||
pObj->m_Y = (int)m_Pos.y;
|
||||
|
||||
if (!m_Opened)
|
||||
{
|
||||
pObj->m_FromX = (int)m_To.x;
|
||||
pObj->m_FromY = (int)m_To.y;
|
||||
}
|
||||
else
|
||||
{
|
||||
pObj->m_FromX = (int)m_Pos.x;
|
||||
pObj->m_FromY = (int)m_Pos.y;
|
||||
}
|
||||
pObj->m_StartTick = Server()->Tick();
|
||||
}
|
26
src/game/server/entities/door.h
Normal file
26
src/game/server/entities/door.h
Normal file
|
@ -0,0 +1,26 @@
|
|||
#ifndef GAME_SERVER_ENTITY_DOOR_H
|
||||
#define GAME_SERVER_ENTITY_DOOR_H
|
||||
|
||||
#include <game/server/entity.h>
|
||||
|
||||
class CTrigger;
|
||||
|
||||
class CDoor : public CEntity
|
||||
{
|
||||
vec2 m_To;
|
||||
int m_EvalTick;
|
||||
bool m_Opened;
|
||||
bool HitCharacter();
|
||||
|
||||
public:
|
||||
|
||||
void Open(int Tick);
|
||||
void Close();
|
||||
CDoor(GameWorld *pGameWorld, vec2 Pos, float Rotation, int Length, bool Opened);
|
||||
|
||||
virtual void Reset();
|
||||
virtual void Tick();
|
||||
virtual void Snap(int SnappingClient);
|
||||
};
|
||||
|
||||
#endif
|
50
src/game/server/entities/trigger.cpp
Normal file
50
src/game/server/entities/trigger.cpp
Normal file
|
@ -0,0 +1,50 @@
|
|||
/* copyright (c) 2007 magnus auvinen, see licence.txt for more info */
|
||||
#include <game/generated/protocol.h>
|
||||
#include <game/server/gamecontext.h>
|
||||
#include "trigger.h"
|
||||
#include "door.h"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
// DOOR
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
CTrigger::CTrigger(CGameWorld *pGameWorld, vec2 Pos, CEntity *Target)
|
||||
: CEntity(pGameWorld, NETOBJTYPE_PICKUP)
|
||||
{
|
||||
m_Pos = Pos;
|
||||
m_Target = Target;
|
||||
|
||||
GameWorld()->InsertEntity(this);
|
||||
}
|
||||
|
||||
bool CTrigger::HitCharacter()
|
||||
{
|
||||
CCharacter *pChr = GameServer()->m_World.ClosestCharacter(m_Pos, 20.0f, 0);
|
||||
return (!pChr) ? false : true;
|
||||
}
|
||||
|
||||
void CTrigger::OpenDoor(int Tick)
|
||||
{
|
||||
CDoor *connectedDoor = (CDoor*) Target;
|
||||
connectedDoor->Open(Tick);
|
||||
}
|
||||
|
||||
void CTrigger::Reset()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
void CTrigger::Tick()
|
||||
{
|
||||
if (Server()->Tick() % 10 == 0)
|
||||
{
|
||||
if (HitCharacter())
|
||||
OpenDoor(Server()->Tick());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void CTrigger::Snap(int SnappingClient)
|
||||
{
|
||||
return;
|
||||
}
|
26
src/game/server/entities/trigger.h
Normal file
26
src/game/server/entities/trigger.h
Normal file
|
@ -0,0 +1,26 @@
|
|||
/* copyright (c) 2007 magnus auvinen, see licence.txt for more info */
|
||||
|
||||
#ifndef GAME_SERVER_ENTITY_TRIGGER_H
|
||||
#define GAME_SERVER_ENTITY_TRIGGER_H
|
||||
|
||||
#include <game/server/entity.hpp>
|
||||
|
||||
//class DOOR;
|
||||
|
||||
class CTrigger : public CEntity
|
||||
{
|
||||
CEntity *m_Target;
|
||||
|
||||
bool HitCharacter();
|
||||
void OpenDoor(int Tick);
|
||||
|
||||
public:
|
||||
|
||||
CTrigger(CGameWorld *pGameWorld, vec2 Pos, CEntity *Target);
|
||||
|
||||
virtual void Reset();
|
||||
virtual void Tick();
|
||||
virtual void Snap(int SnappingClient);
|
||||
};
|
||||
|
||||
#endif
|
|
@ -139,6 +139,21 @@ bool IGameController::OnEntity(int Index, vec2 Pos)
|
|||
m_aaSpawnPoints[1][m_aNumSpawnPoints[1]++] = Pos;
|
||||
else if(Index == ENTITY_SPAWN_BLUE)
|
||||
m_aaSpawnPoints[2][m_aNumSpawnPoints[2]++] = Pos;
|
||||
|
||||
if(Index == ENTITY_DOOR)
|
||||
{
|
||||
for(int i=0; i<8;i++)
|
||||
{
|
||||
if (sides[i] >= ENTITY_LASER_SHORT && sides[i] <= ENTITY_LASER_LONG)
|
||||
{
|
||||
CDoor * door = new CDoor(&GameServer()->m_World, Pos, pi/4*i, 32*3 + 32*(sides[i] - ENTITY_LASER_SHORT)*3, false);
|
||||
for (int j = 0; j < 8; j++)
|
||||
if (j != i)
|
||||
Connector(Pos, door);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(Index == ENTITY_ARMOR_1)
|
||||
Type = POWERUP_ARMOR;
|
||||
else if(Index == ENTITY_HEALTH_1)
|
||||
|
@ -165,7 +180,7 @@ bool IGameController::OnEntity(int Index, vec2 Pos)
|
|||
}
|
||||
else if(Index >= ENTITY_LASER_FAST_CW && Index <= ENTITY_LASER_FAST_CCW)
|
||||
{
|
||||
int sides2[8];
|
||||
int sides2[8]; //TODO it seem that every time GetIndex take the same arguments
|
||||
sides2[0]=GameServer()->Collision()->GetIndex(vec2(Pos.x,Pos.y+2),vec2(Pos.x,Pos.y+2));
|
||||
sides2[1]=GameServer()->Collision()->GetIndex(vec2(Pos.x+2,Pos.y+2),vec2(Pos.x+2,Pos.y+2));
|
||||
sides2[2]=GameServer()->Collision()->GetIndex(vec2(Pos.x+2,Pos.y),vec2(Pos.x+2,Pos.y));
|
||||
|
@ -244,6 +259,27 @@ bool IGameController::OnEntity(int Index, vec2 Pos)
|
|||
return false;
|
||||
}
|
||||
|
||||
void Connector(vec2 Pos, CDoor* Door) {
|
||||
int Sides[8];
|
||||
Sides[0]=GameServer()->Collision()->GetIndex(vec2(Pos.x,Pos.y+1),vec2(Pos.x,Pos.y+1));
|
||||
Sides[1]=GameServer()->Collision()->GetIndex(vec2(Pos.x+1,Pos.y+1),vec2(Pos.x+1,Pos.y+1));
|
||||
Sides[2]=GameServer()->Collision()->GetIndex(vec2(Pos.x+1,Pos.y),vec2(Pos.x+1,Pos.y));
|
||||
Sides[3]=GameServer()->Collision()->GetIndex(vec2(Pos.x+1,Pos.y-1),vec2(Pos.x+1,Pos.y-1));
|
||||
Sides[4]=GameServer()->Collision()->GetIndex(vec2(Pos.x,Pos.y-1),vec2(Pos.x,Pos.y-1));
|
||||
Sides[5]=GameServer()->Collision()->GetIndex(vec2(Pos.x-1,Pos.y-1),vec2(Pos.x-1,Pos.y-1));
|
||||
Sides[6]=GameServer()->Collision()->GetIndex(vec2(Pos.x-1,Pos.y),vec2(Pos.x-1,Pos.y));
|
||||
Sides[7]=GameServer()->Collision()->GetIndex(vec2(Pos.x-1,Pos.y+1),vec2(Pos.x-1,Pos.y+1));
|
||||
for (int i = 0;i < 8;i++)
|
||||
{
|
||||
if (Sides[i] == ENTITY_CONNECTOR_D + (i + 4) % 8) {
|
||||
Connector(Pos + GetSidePos(i), Door);
|
||||
} else if(Sides[i] == ENTITY_TRIGGER)
|
||||
{
|
||||
new CTrigger(Pos, Target);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void IGameController::EndRound()
|
||||
{
|
||||
if(m_Warmup) // game can't end when we are running warmup
|
||||
|
@ -266,50 +302,21 @@ const char *IGameController::GetTeamName(int Team)
|
|||
return "spectators";
|
||||
}
|
||||
|
||||
void get_side_pos(int side, int &x, int &y) {
|
||||
if (side==0)
|
||||
{
|
||||
x=0;
|
||||
y=1;
|
||||
}
|
||||
else if(side==1)
|
||||
{
|
||||
x=1;
|
||||
y=1;
|
||||
}
|
||||
else if(side==2)
|
||||
{
|
||||
x=1;
|
||||
y=0;
|
||||
vec2 GetSidePos(int side) {
|
||||
switch(side)
|
||||
{
|
||||
case 0: return vec2(0, 1);
|
||||
case 1: return vec2(1, 1);
|
||||
case 2: return vec2(1, 0);
|
||||
case 3: return vec2(1, -1);
|
||||
case 4: return vec2(0, -1);
|
||||
case 5: return vec2(-1, -1);
|
||||
case 6: return vec2(-1, 0);
|
||||
case 7: return vec2(-1, 1);
|
||||
default:
|
||||
vec2(0, 0);
|
||||
}
|
||||
else if(side==3)
|
||||
{
|
||||
x=1;
|
||||
y=-1;
|
||||
}
|
||||
else if(side==4)
|
||||
|
||||
{
|
||||
x=0;
|
||||
y=-1;
|
||||
}
|
||||
else if(side==5)
|
||||
{
|
||||
x=-1;
|
||||
y=-1;
|
||||
|
||||
}
|
||||
else if(side==6)
|
||||
|
||||
{
|
||||
x=-1;
|
||||
y=0;
|
||||
}
|
||||
else if(side==7)
|
||||
{
|
||||
x=-1;
|
||||
y=+1;
|
||||
}
|
||||
}
|
||||
|
||||
bool IsSeparator(char c) { return c == ';' || c == ' ' || c == ',' || c == '\t'; }
|
||||
|
|
|
@ -101,6 +101,8 @@ public:
|
|||
*/
|
||||
virtual bool OnEntity(int Index, vec2 Pos);
|
||||
|
||||
virtual void Connector(vec2 Pos, CDoor* Door);
|
||||
|
||||
/*
|
||||
Function: on_CCharacter_spawn
|
||||
Called when a CCharacter spawns into the game world.
|
||||
|
|
Loading…
Reference in a new issue