Conflicts:
	src/game/server/entities/dragger.cpp
	src/game/server/entities/dragger.h
This commit is contained in:
GreYFoXGTi 2010-09-22 22:37:20 +03:00
commit 7f6db8212e
7 changed files with 67 additions and 46 deletions

View file

@ -1223,7 +1223,7 @@ void CCharacter::Die(int Killer, int Weapon)
m_pPlayer->GetCID(), Server()->ClientName(m_pPlayer->GetCID()), Weapon, ModeSpecial); m_pPlayer->GetCID(), Server()->ClientName(m_pPlayer->GetCID()), Weapon, ModeSpecial);
GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf);
Controller->m_Teams.m_Core.Team(m_pPlayer->GetCID(), 0); Controller->m_Teams.SetForceCharacterTeam(m_pPlayer->GetCID(), 0);
// send the kill message // send the kill message
CNetMsg_Sv_KillMsg Msg; CNetMsg_Sv_KillMsg Msg;

View file

@ -11,14 +11,14 @@
const int LENGTH=700; const int LENGTH=700;
CDragger::CDragger(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW) CDragger::CDragger(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW, int CatchedTeam)
: CEntity(pGameWorld, NETOBJTYPE_LASER) : CEntity(pGameWorld, NETOBJTYPE_LASER)
{ {
m_Pos = Pos; m_Pos = Pos;
m_Strength = Strength; m_Strength = Strength;
m_EvalTick = Server()->Tick(); m_EvalTick = Server()->Tick();
m_NW = NW; m_NW = NW;
m_CatchedTeam = CatchedTeam;
GameWorld()->InsertEntity(this); GameWorld()->InsertEntity(this);
} }
@ -27,22 +27,19 @@ void CDragger::Move()
if (m_Target) if (m_Target)
return; return;
CCharacter *Ents[16]; CCharacter *Ents[16];
int Num = -1; int Num = GameServer()->m_World.FindEntities(m_Pos,LENGTH, (CEntity**)Ents, 16, NETOBJTYPE_CHARACTER);
Num = GameServer()->m_World.FindEntities(m_Pos,LENGTH, (CEntity**)Ents, 16, NETOBJTYPE_CHARACTER);
int Id=-1; int Id=-1;
int MinLen=0; int MinLen=0;
for (int i = 0; i < Num; i++) for (int i = 0; i < Num; i++)
{ {
m_Target = Ents[i]; m_Target = Ents[i];
int Res=0; if(m_Target->Team() != m_CatchedTeam) continue;
if (!m_NW) int Res = m_NW ? GameServer()->Collision()->IntersectNoLaserNW(m_Pos, m_Target->m_Pos, 0, 0) :
Res = GameServer()->Collision()->IntersectNoLaser(m_Pos, m_Target->m_Pos, 0, 0); GameServer()->Collision()->IntersectNoLaser(m_Pos, m_Target->m_Pos, 0, 0);
else
Res = GameServer()->Collision()->IntersectNoLaserNW(m_Pos, m_Target->m_Pos, 0, 0);
if (Res==0) if (Res==0)
{ {
int Len=length(Ents[i]->m_Pos - m_Pos); int Len=length(m_Target->m_Pos - m_Pos);
if (MinLen==0 || MinLen>Len) if (MinLen==0 || MinLen>Len)
{ {
MinLen=Len; MinLen=Len;
@ -50,14 +47,7 @@ void CDragger::Move()
} }
} }
} }
if (Id!=-1) m_Target = Id != -1 ? Ents[Id] : 0;
{
m_Target = Ents[Id];
}
else
{
m_Target=0;
}
} }
void CDragger::Drag() void CDragger::Drag()
@ -127,7 +117,9 @@ void CDragger::Snap(int SnappingClient)
return; return;
CCharacter * Char = GameServer()->GetPlayerChar(SnappingClient); CCharacter * Char = GameServer()->GetPlayerChar(SnappingClient);
if(Char && m_Target && !Char->GetPlayer()->m_ShowOthers && Char->Team() != m_Target->Team()) return; if(Char && m_Target
&& !Char->GetPlayer()->m_ShowOthers
&& Char->Team() != m_Target->Team()) return;
CNetObj_Laser *obj = static_cast<CNetObj_Laser *>(Server()->SnapNewItem(NETOBJTYPE_LASER, m_Id, sizeof(CNetObj_Laser))); CNetObj_Laser *obj = static_cast<CNetObj_Laser *>(Server()->SnapNewItem(NETOBJTYPE_LASER, m_Id, sizeof(CNetObj_Laser)));
@ -152,5 +144,15 @@ void CDragger::Snap(int SnappingClient)
StartTick = Server()->Tick(); StartTick = Server()->Tick();
obj->m_StartTick = StartTick; obj->m_StartTick = StartTick;
} }
//ÿ òóò áûë
//ÿ òîæå CDraggerTeam::CDraggerTeam(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW) {
for(int i = 0; i < MAX_CLIENTS; ++i) {
m_Draggers[i] = new CDragger(pGameWorld, Pos, Strength, NW, i);
}
}
//CDraggerTeam::~CDraggerTeam() {
//for(int i = 0; i < MAX_CLIENTS; ++i) {
// delete m_Draggers[i];
//}
//}

View file

@ -4,7 +4,6 @@
#define GAME_SERVER_ENTITY_DRAGGER_H #define GAME_SERVER_ENTITY_DRAGGER_H
#include <game/server/entity.h> #include <game/server/entity.h>
class CCharacter; class CCharacter;
class CDragger : public CEntity class CDragger : public CEntity
@ -16,14 +15,24 @@ class CDragger : public CEntity
void Drag(); void Drag();
CCharacter * m_Target; CCharacter * m_Target;
bool m_NW; bool m_NW;
int m_CatchedTeam;
public: public:
CDragger(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW=false); CDragger(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW, int CatchedTeam);
virtual void Reset(); virtual void Reset();
virtual void Tick(); virtual void Tick();
virtual void Snap(int snapping_client); virtual void Snap(int snapping_client);
}; };
class CDraggerTeam {
CDragger * m_Draggers[MAX_CLIENTS];
public:
CDraggerTeam(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW=false);
//~CDraggerTeam();
};
#endif #endif

View file

@ -95,20 +95,23 @@ void CProjectile::Tick()
if(m_LifeSpan > -1) if(m_LifeSpan > -1)
m_LifeSpan--; m_LifeSpan--;
int TeamMask = -1;
bool isWeaponCollide = false; bool isWeaponCollide = false;
if(OwnerChar && TargetChr if(OwnerChar && TargetChr
&& OwnerChar->m_Alive && TargetChr->m_Alive && OwnerChar->m_Alive && TargetChr->m_Alive
&& !TargetChr->CanCollide(m_Owner)) isWeaponCollide = true; && !TargetChr->CanCollide(m_Owner)) {
isWeaponCollide = true;
TeamMask = OwnerChar->Teams()->TeamMask( OwnerChar->Team());
}
if( ((TargetChr && (g_Config.m_SvHit || m_Owner == -1 || TargetChr == OwnerChar)) || Collide) && !isWeaponCollide)//TODO:TEAM if( ((TargetChr && (g_Config.m_SvHit || m_Owner == -1 || TargetChr == OwnerChar)) || Collide) && !isWeaponCollide)//TODO:TEAM
{ {
if(m_Explosive/*??*/ && (!TargetChr || (TargetChr && !m_Freeze))) if(m_Explosive/*??*/ && (!TargetChr || (TargetChr && !m_Freeze)))
{ {
GameServer()->CreateExplosion(ColPos, m_Owner, m_Weapon, (m_Owner == -1)?true:false, GameServer()->CreateExplosion(ColPos, m_Owner, m_Weapon, m_Owner == -1,
(m_Owner != -1)? OwnerChar->Teams()->TeamMask(OwnerChar->Team()) : -1); (m_Owner != -1)? TeamMask : -1);
GameServer()->CreateSound(ColPos, m_SoundImpact, GameServer()->CreateSound(ColPos, m_SoundImpact,
(m_Owner != -1)? OwnerChar->Teams()->TeamMask(OwnerChar->Team()) : -1); (m_Owner != -1)? TeamMask : -1);
} }
else if(TargetChr && m_Freeze) else if(TargetChr && m_Freeze)
TargetChr->Freeze(Server()->TickSpeed()*3); TargetChr->Freeze(Server()->TickSpeed()*3);
@ -125,7 +128,7 @@ void CProjectile::Tick()
else if (m_Weapon == WEAPON_GUN) else if (m_Weapon == WEAPON_GUN)
{ {
GameServer()->CreateDamageInd(CurPos, -atan2(m_Direction.x, m_Direction.y), 10, GameServer()->CreateDamageInd(CurPos, -atan2(m_Direction.x, m_Direction.y), 10,
(m_Owner != -1)? OwnerChar->Teams()->TeamMask(OwnerChar->Team()) : -1); (m_Owner != -1)? TeamMask : -1);
GameServer()->m_World.DestroyEntity(this); GameServer()->m_World.DestroyEntity(this);
} }
else else
@ -156,7 +159,7 @@ void CProjectile::Snap(int SnappingClient)
return; return;
CCharacter * Char = GameServer()->GetPlayerChar(SnappingClient); CCharacter * Char = GameServer()->GetPlayerChar(SnappingClient);
if(Char && m_Owner != -1 && !Char->GetPlayer()->m_ShowOthers && if(Char && m_Owner != -1 && !Char->GetPlayer()->m_ShowOthers &&
Char->Team() != GameServer()->GetPlayerChar(m_Owner)->Team()) return; Char->CanCollide(m_Owner)) return;
CNetObj_Projectile *pProj = static_cast<CNetObj_Projectile *>(Server()->SnapNewItem(NETOBJTYPE_PROJECTILE, m_Id, sizeof(CNetObj_Projectile))); CNetObj_Projectile *pProj = static_cast<CNetObj_Projectile *>(Server()->SnapNewItem(NETOBJTYPE_PROJECTILE, m_Id, sizeof(CNetObj_Projectile)));
FillInfo(pProj); FillInfo(pProj);
} }

View file

@ -289,11 +289,11 @@ bool IGameController::OnEntity(int Index, vec2 Pos, bool Front)
} }
else if(Index>=ENTITY_DRAGGER_WEAK && Index <=ENTITY_DRAGGER_STRONG) else if(Index>=ENTITY_DRAGGER_WEAK && Index <=ENTITY_DRAGGER_STRONG)
{ {
new CDragger(&GameServer()->m_World,Pos,Index-ENTITY_DRAGGER_WEAK+1); new CDraggerTeam(&GameServer()->m_World,Pos,Index-ENTITY_DRAGGER_WEAK+1, false);
} }
else if(Index>=ENTITY_DRAGGER_WEAK_NW && Index <=ENTITY_DRAGGER_STRONG_NW) else if(Index>=ENTITY_DRAGGER_WEAK_NW && Index <=ENTITY_DRAGGER_STRONG_NW)
{ {
new CDragger(&GameServer()->m_World, Pos,Index-ENTITY_DRAGGER_WEAK_NW+1,true); new CDraggerTeam(&GameServer()->m_World, Pos,Index-ENTITY_DRAGGER_WEAK_NW+1,true);
} }
else if(Index==ENTITY_PLASMAE) else if(Index==ENTITY_PLASMAE)
{ {

View file

@ -81,6 +81,23 @@ bool CGameTeams::SetCharacterTeam(int id, int Team) {
} }
} }
} }
SetForceCharacterTeam(id, Team);
char aBuf[512];
str_format(aBuf, sizeof(aBuf), "Id = %d Team = %d", id, Team);
dbg_msg("Teams", aBuf);
//GameServer()->CreatePlayerSpawn(Character(id)->m_Core.m_Pos, TeamMask());
if(Character(id)->GetPlayer()->m_IsUsingRaceClient)
{
CNetMsg_Sv_PlayerTeam Msg;
Msg.m_Team = Team;
Msg.m_Cid = id;
Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, -1);
//dbg_msg("Teams", "Sended all");
}
return true;
}
void CGameTeams::SetForceCharacterTeam(int id, int Team) {
if(m_Core.Team(id) != TEAM_FLOCK && m_Core.Team(id) != TEAM_SUPER && m_TeamState[m_Core.Team(id)] != EMPTY) { if(m_Core.Team(id) != TEAM_FLOCK && m_Core.Team(id) != TEAM_SUPER && m_TeamState[m_Core.Team(id)] != EMPTY) {
bool NoOneInOldTeam = true; bool NoOneInOldTeam = true;
for(int i = 0; i < MAX_CLIENTS; ++i) { for(int i = 0; i < MAX_CLIENTS; ++i) {
@ -97,19 +114,6 @@ bool CGameTeams::SetCharacterTeam(int id, int Team) {
if(Team != TEAM_SUPER && m_TeamState[Team] == EMPTY) { if(Team != TEAM_SUPER && m_TeamState[Team] == EMPTY) {
ChangeTeamState(Team, OPEN); ChangeTeamState(Team, OPEN);
} }
char aBuf[512];
str_format(aBuf, sizeof(aBuf), "Id = %d Team = %d", id, Team);
dbg_msg("Teams", aBuf);
//GameServer()->CreatePlayerSpawn(Character(id)->m_Core.m_Pos, TeamMask());
if(Character(id)->GetPlayer()->m_IsUsingRaceClient)
{
CNetMsg_Sv_PlayerTeam Msg;
Msg.m_Team = Team;
Msg.m_Cid = id;
Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, -1);
//dbg_msg("Teams", "Sended all");
}
return true;
} }
void CGameTeams::ChangeTeamState(int Team, int State) { void CGameTeams::ChangeTeamState(int Team, int State) {

View file

@ -41,6 +41,9 @@ public:
int TeamMask(int Team); int TeamMask(int Team);
void SendAllInfo(int Cid); void SendAllInfo(int Cid);
//need to be very carefull using this method
void SetForceCharacterTeam(int id, int Team);
}; };
#endif #endif