/*
888888888888 ,ad8888ba, I8, 8 ,8I 88888888888 88888888ba
88 d8"' `"8b `8b d8b d8' 88 88 "8b
88 d8' `8b "8, ,8"8, ,8" 88 88 ,8P
88 88 88 Y8 8P Y8 8P 88aaaaa 88aaaaaa8P'
88 88 88 `8b d8' `8b d8' 88""""" 88""""88'
88 Y8, ,8P `8a a8' `8a a8' 88 88 `8b
88 Y8a. .a8P `8a8' `8a8' 88 88 `8b
88 `"Y8888Y"' `8' `8' 88888888888 88 `8b
*/
#include "YSI\y_hooks"
//-----------------------------
//-------------------------------------------------
//-----------------------------
stock static GAMEID;
//-----------------------------
static
bool:finish[MAX_LINKS_PER_GAME char],
object_towers[MAX_LINKS_PER_GAME][2],
Text3D:text3d_health_towers[MAX_LINKS_PER_GAME][2],
int_health_towers[MAX_LINKS_PER_GAME][2],
timer_bomb[MAX_LINKS_PER_GAME],
object_bomb[MAX_LINKS_PER_GAME],
Text3D:text3d_bomb[MAX_LINKS_PER_GAME];
static const Float:pos_towers[2][3] =
{
{-972.296020, 1022.695556, 1345.796508},
{-1133.212890, 1096.327270, 1345.796508}
};
//-----------------------------
//-------------------------------------------------
//-----------------------------
enum e_PLAYERS_TOWER
{
pTowKills,
pTowDeaths,
pTowDamagesTower,
pTowBombsExp,
bool:pTowHasBomb
}
static
P_TOW[MAX_PLAYERS][e_PLAYERS_TOWER];
//-----------------------------
//-------------------------------------------------
//-----------------------------
static GivePlayerPoints(playerid, points, bool:won)
{
new
clone[e_PLAYERS_TOWER];
clone = P_TOW[playerid];
static
query[512];
mysql_format(mysql, query, sizeof(query), "\
UPDATE TowerGameStats SET \
Points = Points + %d,\
Games = Games + 1,\
GamesWon = GamesWon + %d,\
GamesLost = GamesLost + %d,\
GameTime = GameTime + %d,\
Kills = Kills + %d,\
Deaths = Deaths + %d,\
DamagesTower = DamagesTower + %d,\
BombsExplosed = BombsExplosed + %d \
WHERE ID = %d",
points,
_:won,
_:!won,
GetGameTimeByLinkID(PLAYERS[playerid][pLink]),
clone[pTowKills],
clone[pTowDeaths],
clone[pTowDamagesTower],
clone[pTowBombsExp],
PLAYERS[playerid][pIDSql]);
//mysql_tquery(mysql, query);
Scm(playerid, Color.GOLD, "Tu remportes "GRAY"%d "GOLD"points !", points);
Scm(playerid, Color.AQUA, "Tu remportes "GRAY"%d "AQUA"dollars !", GivePlayerDollars(playerid, points));
return true;
}
//-----------------------------
static DropBomb(playerid, linkid)
{
foreach(new i : LinkPlayer[linkid])
{
GTFP(i, "~b~La bombe est au sol.", 3000, 4);
}
P_TOW[playerid][pTowHasBomb] = false;
new
cell = GetCellLink(LINKS[linkid][lGame], linkid),
Float:x,
Float:y,
Float:z;
GetPlayerPos(playerid, x, y, z);
object_bomb[cell] = CreateDynamicObject(2891, x, y, z - 1.0, 0.000000, 0.000000, 0.000000, LINKS[linkid][lWorldID], 10, -1, 400.0, 0.0);
text3d_bomb[cell] = CreateDynamic3DTextLabel("Pour prendre la bombe\nAppuie sur N et clique sur la bombe.", Color.AQUA, x, y, z - 1.0, 250.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, LINKS[linkid][lWorldID], 10, -1, 10.0);
RemovePlayerAttachedObject(playerid, 0);
return true;
}
//-----------------------------
//-------------------------------------------------
//-----------------------------
static OnTowerTakeDamage(linkid, cell, teamid_tower);
static Timer_Bomb(linkid, cell);
//-----------------------------
//-------------------------------------------------
//-----------------------------
GameMode::Init()
{
new
links[][2] =
{
{2, 2}, // 4 players
{2, 4}, // 8 players
{2, 6}, // 12 players
{2, 8} // 16 players
};
GAMEID = CreateGame("Tower", links, 11461);
//-----------------------------
new
clone[e_GAMES];
clone = GAMES[GAMEID];
for(new l = 0; l < clone[gaNbrLinks]; l++)
{
new
worldid = LINKS[ clone[gaLinks][l] ][lWorldID];
object_towers[l][0] = CreateDynamicObject(11461, pos_towers[0][0], pos_towers[0][1], pos_towers[0][2] - 14.0, 0.000000, 0.000000, 12.500000, worldid, 10, -1, 200.0, 0.0);
text3d_health_towers[l][0] = CreateDynamic3DTextLabel("", -1, pos_towers[0][0], pos_towers[0][1], pos_towers[0][2], 250.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, worldid, 10, -1, 100.0);
object_towers[l][1] = CreateDynamicObject(11461, pos_towers[1][0], pos_towers[1][1], pos_towers[1][2] - 14.0, 0.000000, 0.000000, 12.500000, worldid, 10, -1, 200.0, 0.0);
text3d_health_towers[l][1] = CreateDynamic3DTextLabel("", -1, pos_towers[1][0], pos_towers[1][1], pos_towers[1][2], 250.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, worldid, 10, -1, 100.0);
#include "tower_map.pwn"
}
}
//-----------------------------
//-------------------------------------------------
//-----------------------------
GAME::This->Start(gameid, linkid)
{
new
cell = GetCellLink(gameid, linkid);
UpdateDynamic3DTextLabelText(text3d_health_towers[cell][0], GetTeamColorString(0), "1000/1000");
int_health_towers[cell][0] = 1000;
UpdateDynamic3DTextLabelText(text3d_health_towers[cell][1], GetTeamColorString(1), "1000/1000");
int_health_towers[cell][1] = 1000;
//-----------------------------
timer_bomb[cell] = SetTimerEx("Timer_Bomb", 120000, false, "dd", linkid, cell);
finish{cell} = false;
return true;
}
//-----------------------------
GAME::This->Finish(gameid, linkid)
{
new
cell = GetCellLink(gameid, linkid);
KillTimer(timer_bomb[cell]);
return true;
}
//-----------------------------
GAME::Player->Join(gameid, linkid, playerid)
{
RemoveBuildingForPlayer(playerid, 3935, -1097.7422, 1037.8750, 1343.0781, 0.25);
RemoveBuildingForPlayer(playerid, 3936, -974.5547, 1059.4609, 1344.7734, 0.25);
RemoveBuildingForPlayer(playerid, 3937, -1130.9219, 1059.4609, 1345.4688, 0.25);
//-----------------------------
static
query[128];
mysql_format(mysql, query, sizeof(query), "INSERT INTO TowerGameStats (ID) VALUES (%d) ON DUPLICATE KEY UPDATE ID = %d", PLAYERS[playerid][pIDSql], PLAYERS[playerid][pIDSql]);
//mysql_tquery(mysql, query);
//-----------------------------
SetPlayerColor(playerid, RemoveColorAlpha(TEAMS[ PLAYERS[playerid][pTeamDG] ][tColor]));
return true;
}
//-----------------------------
GAME::Player->Quit(gameid, linkid, playerid, teamid)
{
if(GetNumberPlayersInTeam(linkid, teamid) == 0)
{
new
cell = GetCellLink(gameid, linkid),
team_enemy = _:!teamid,
points_bonus = floatround(float(GetGameTimeByLinkID(linkid)) * 0.03125);
ScmToLink(linkid, Color.WHITE, "L'équipe {%x}%s "WHITE"gagne la partie !", TEAMS[team_enemy][tColor] >>> 8, TEAMS[team_enemy][tName]);
foreach(new i : LinkPlayer[linkid])
{
if(team_enemy == PLAYERS[i][pTeamDG])
{
new
points = 0;
points += P_TOW[i][pTowDamagesTower] / 50;
points += P_TOW[i][pTowBombsExp] * 5;
points += floatround(float(P_TOW[i][pTowKills]) * 1.5);
points += points_bonus;
GivePlayerPoints(i, points, true);
}
}
EndGame(linkid);
finish{cell} = true;
}
static const
eBlank[e_PLAYERS_TOWER];
P_TOW[playerid] = eBlank;
return true;
}
//-----------------------------
GAME::Player->Spawn(gameid, linkid, playerid)
{
static const
Float:spawns[][][] =
{
{
{-976.590820, 1092.075683, 1344.968994, 167.189147},
{-974.331054, 1091.783691, 1344.977539, 182.229415},
{-972.614746, 1090.735961, 1344.990112, 87.915122},
{-972.616577, 1088.796875, 1344.991577, 85.408508},
{-974.064819, 1087.205200, 1344.982788, 353.287658},
{-976.501831, 1087.189941, 1344.965942, 359.554565}
},
{
{-1130.423461, 1026.689697, 1345.723999, 2.107750},
{-1133.388183, 1026.707275, 1345.739990, 358.011108},
{-1134.376220, 1028.029052, 1345.745239, 272.493530},
{-1134.375854, 1030.457885, 1345.745239, 263.406768},
{-1133.348754, 1031.585083, 1345.734863, 169.719161},
{-1130.280639, 1031.601318, 1345.718872, 183.819366}
}
};
new
teamid = PLAYERS[playerid][pTeamDG],
rand = random(sizeof(spawns[]));
SetPlayerInterior(playerid, 10);
SetPlayerPos(playerid, spawns[teamid][rand][0], spawns[teamid][rand][1], spawns[teamid][rand][2]);
SetPlayerFacingAngle(playerid, spawns[teamid][rand][3]);
//-----------------------------
GivePlayerWeapon(playerid, 24, cellmax);
GivePlayerWeapon(playerid, 27, cellmax);
GivePlayerWeapon(playerid, 29, cellmax);
//-----------------------------
SetPlayerSkin(playerid, teamid ? 287 : 285);
SetPlayerHealth(playerid, 100.0);
return true;
}
//-----------------------------
GAME::Player->KillPlayer(gameid, linkid, playerid, deathid)
{
P_TOW[playerid][pTowKills]++;
return true;
}
//-----------------------------
GAME::Player->Death(gameid, linkid, playerid)
{
P_TOW[playerid][pTowDeaths]++;
if(P_TOW[playerid][pTowHasBomb])
DropBomb(playerid, linkid);
return true;
}
//-----------------------------
GAME::Player->ShotObject(gameid, linkid, playerid, weaponid, objectid)
{
new
cell = GetCellLink(gameid, linkid),
teamid_enemy = !PLAYERS[playerid][pTeamDG],
tower_object = object_towers[cell][teamid_enemy];
if(tower_object == objectid)
{
static
Float:x,
Float:y,
Float:z;
GetDynamicObjectPos(tower_object, x, y, z);
if(!IsPlayerInRangeOfPoint(playerid, 20.0, x, y, z))
return GTFP(playerid, "~r~Tu es trop loin de la tourelle.", 1000, 4);
switch(weaponid)
{
case WEAPON_DEAGLE: int_health_towers[cell][teamid_enemy] -= 10, P_TOW[playerid][pTowDamagesTower] += 10;
case WEAPON_SHOTGSPA: int_health_towers[cell][teamid_enemy] -= 4, P_TOW[playerid][pTowDamagesTower] += 4;
default: int_health_towers[cell][teamid_enemy]--, P_TOW[playerid][pTowDamagesTower]++;
}
OnTowerTakeDamage(linkid, cell, teamid_enemy);
}
return true;
}
//-----------------------------
GAME::Player->KeyChange(gameid, linkid, playerid, newkeys, oldkeys)
{
if(HOLDING(KEY_NO))
{
if(P_TOW[playerid][pTowHasBomb])
{
DropBomb(playerid, linkid);
}
else
{
new
cell = GetCellLink(gameid, linkid),
Float:x,
Float:y,
Float:z;
GetDynamicObjectPos(object_bomb[cell], x, y, z);
if(GetPlayerDistanceFromPoint(playerid, x, y, z) > 5.0)
return GameTextForPlayer(playerid, "~r~Tu es trop loin de la bombe.", 1000, 4);
P_TOW[playerid][pTowHasBomb] = true;
SetPlayerAttachedObject(playerid, 0, 2891, 1, 0.127000, -0.053999, -0.011000, 92.000007, 0.000000, 90.199974);
DestroyDynamicObject(object_bomb[cell]);
DestroyDynamic3DTextLabel(text3d_bomb[cell]);
GTFP(playerid, "~g~Tu viens de ramasser la bombe~n~~b~Fais-toi sauter avec la tourelle adverse.", 1000, 4);
Scm(playerid, Color.GRAY, "Pour te faire sauter avec la bombe, appuyez sur la touche H.");
}
return true;
}
if(HOLDING(KEY_CTRL_BACK))
{
if(P_TOW[playerid][pTowHasBomb])
{
new
cell = GetCellLink(gameid, linkid),
teamid_enemy = !PLAYERS[playerid][pTeamDG];
if(!IsPlayerInRangeOfPoint(playerid, 5.0, pos_towers[teamid_enemy][0], pos_towers[teamid_enemy][1], pos_towers[teamid_enemy][2]))
return GameTextForPlayer(playerid, "~r~Tu es trop loin de la tourelle.", 1000, 4);
P_TOW[playerid][pTowBombsExp]++;
P_TOW[playerid][pTowHasBomb] = false;
RemovePlayerAttachedObject(playerid, 0);
new
Float:x,
Float:y,
Float:z;
GetPlayerPos(playerid, x, y, z);
SetPlayerHealth(playerid, 0.0);
CreateExplosion(x, y, z, 6, 15.0);
int_health_towers[cell][teamid_enemy] -= 200;
foreach(new i : LinkPlayer[linkid])
{
GTFP(i, "~g~La bombe apparaitra~n~~y~dans 2 minutes.", 5000, 4);
if(teamid_enemy == PLAYERS[playerid][pTeamDG])
Scm(i, Color.RED, "La bombe vient d'endommager votre tourelle.");
else
Scm(i, Color.GREEN, "La bombe vient d'endommager la tourelle adverse.");
}
timer_bomb[cell] = SetTimerEx("Timer_Bomb", 120000, false, "dd", linkid, cell);
OnTowerTakeDamage(linkid, cell, teamid_enemy);
}
return true;
}
return true;
}
//-----------------------------
//-------------------------------------------------
//-----------------------------
public OnTowerTakeDamage(linkid, cell, teamid_tower)
{
if(int_health_towers[cell][teamid_tower] < 0)
int_health_towers[cell][teamid_tower] = 0;
static
string[10];
format(string, sizeof(string), "%d/1000", int_health_towers[cell][teamid_tower]);
UpdateDynamic3DTextLabelText(text3d_health_towers[cell][teamid_tower], COLOR_RED, string);
//-----------------------------
if(int_health_towers[cell][teamid_tower] <= 0)
{
new
teamid = _:!teamid_tower,
points_bonus = floatround(float(GetGameTimeByLinkID(linkid)) * 0.03125);
ScmToLink(linkid, Color.WHITE, "L'équipe {%x}%s "WHITE"gagne la partie !", GetTeamColorString(teamid), TEAMS[teamid][tName]);
foreach(new i : LinkPlayer[linkid])
{
if(teamid == PLAYERS[i][pTeamDG])
{
new
points = 0;
points += P_TOW[i][pTowDamagesTower] / 50;
points += P_TOW[i][pTowBombsExp] * 5;
points += floatround(float(P_TOW[i][pTowKills]) * 1.5);
points += points_bonus;
GivePlayerPoints(i, points, true);
}
else
{
new
points = 0;
points += P_TOW[i][pTowDamagesTower] / 100;
points += P_TOW[i][pTowBombsExp] * 5;
points += P_TOW[i][pTowKills];
points += points_bonus;
GivePlayerPoints(i, points, false);
}
}
EndGame(linkid);
finish{cell} = true;
}
}
//-----------------------------
public Timer_Bomb(linkid, cell)
{
if(finish{cell})
return true;
foreach(new i : LinkPlayer[linkid])
{
GTFP(i, "~g~La bombe est apparue au~n~~g~milieu de la map.", 5000, 4);
}
object_bomb[cell] = CreateDynamicObject(2891, -1054.687622, 1063.608764, 1343.958740, 0.000000, 0.000000, 0.000000, LINKS[linkid][lWorldID], 10, -1, 400.0, 0.0);
text3d_bomb[cell] = CreateDynamic3DTextLabel("Pour prendre la bombe :\nAppuie sur N !", Color.AQUA, -1054.687622, 1063.608764, 1343.958740, 250.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, LINKS[linkid][lWorldID], 10, -1, 10.0);
return true;
}
/*
888888888888 ,ad8888ba, I8, 8 ,8I 88888888888 88888888ba
88 d8"' `"8b `8b d8b d8' 88 88 "8b
88 d8' `8b "8, ,8"8, ,8" 88 88 ,8P
88 88 88 Y8 8P Y8 8P 88aaaaa 88aaaaaa8P'
88 88 88 `8b d8' `8b d8' 88""""" 88""""88'
88 Y8, ,8P `8a a8' `8a a8' 88 88 `8b
88 Y8a. .a8P `8a8' `8a8' 88 88 `8b
88 `"Y8888Y"' `8' `8' 88888888888 88 `8b
*/
Comments
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎