SA:MP Multimod(Minigame) Nasıl Yapılır ? [ANLATIM]
Bir Shooter odası yapalım bakalım. (Neon Fırlatan)
Sizlere sadece shooter yapimini anlatacagim, bunlari verdigim ornege gore rahatlikla cogaltabilir sunucunuzu acabilirsiniz, basarilar dilerim.
Gereken includeler:
#include <a_samp>
#include <streamer>
#include <foreach>
Bu varibleler roketleri tanıtmak için gereklidir:
new Text:ShooterOda,Text:ShooterSayi,FireShot[MAX_PLAYERS],gRocketObj[MAX_PLAYERS],shooterPlayer,oyuncuArac[MAX_PLAYERS];
OnGameModeInit kısmına eklemelisiniz
Neden bunu ekliyoruz?: Çünkü girişte oda seçerken shooter resmi görünsün diye eklememiz gerekiyor, tıklayınca shooter odasına gidiyor tıklama olayını birazdan göstereceğim.
SetGameModeText("Multimod 1.0");
shooterPlayer = 0;
ShooterOda = TextDrawCreate(7.000000, 149.000000, "shooterresim");
TextDrawBackgroundColor(ShooterOda, 90);
TextDrawFont(ShooterOda, 5);
TextDrawLetterSize(ShooterOda, 0.889999, 1.000000);
TextDrawColor(ShooterOda, -1);
TextDrawSetOutline(ShooterOda, 0);
TextDrawSetProportional(ShooterOda, 1);
TextDrawSetShadow(ShooterOda, 1);
TextDrawUseBox(ShooterOda, 1);
TextDrawBoxColor(ShooterOda, 90);
TextDrawTextSize(ShooterOda, 139.000000, 127.000000);
TextDrawSetPreviewModel(ShooterOda, 345);
TextDrawSetPreviewRot(ShooterOda, -13.000000, -20.000000, 3.000000, 0.699999);
TextDrawSetSelectable(ShooterOda, 1);ShooterSayi = TextDrawCreate(10.000000, 150.000000, “Shooter ~w~~h~[0/15]”);
TextDrawBackgroundColor(ShooterSayi, 255);
TextDrawFont(ShooterSayi, 1);
TextDrawLetterSize(ShooterSayi, 0.280000, 1.599999);
TextDrawColor(ShooterSayi, 16711935);
TextDrawSetOutline(ShooterSayi, 0);
TextDrawSetProportional(ShooterSayi, 1);
TextDrawSetShadow(ShooterSayi, 1);
TextDrawSetSelectable(ShooterSayi, 0);
OnPlayerConnect:
SelectTextDraw: bu gereklidir, eğer bunu eklemezsek resime tıklayınca bir olay olmaz.
ve diğer kodlar niye diye sorarsanız bu kodlar odanın resmini görüntülemek ve odada kaç kişi olduğunu göstermek içindir.
new shooterSayiCek[56];
TextDrawShowForPlayer(playerid, ShooterOda);
TextDrawShowForPlayer(playerid, ShooterSayi);
format(shooterSayiCek,56,"Shooter ~w~~h~[%d/15]",shooterPlayer);
TextDrawSetString(ShooterSayi, shooterSayiCek[0]);
SelectTextDraw(playerid, 0xFF0000FF);
OnPlayerDeath:
Bunu eklemeliyiz çünkü oyuncu ölünce aracıda silinsin.
DestroyVehicle(oyuncuArac[playerid]);
OnPlayerExitVehicle:
Oyuncu araçtan çıkınca ölsün diye bunu eklemeliyiz.
SetPlayerHealth(playerid, 0);
OnPlayerClickTextDraw:
Shooter resmine tıkladığımızda bizi spawnlaması için bunu yapmalıyız. Bu olay çok önemlidir, multi modlar bu mantıkla yapılır.
if(clickedid == ShooterOda)
{
shooterPlayer++;
SendClientMessage(playerid, -1, "Shooter odasına hoşgeldiniz.");
SpawnPlayer(playerid);
CancelSelectTextDraw(playerid);
TextDrawHideForPlayer(playerid, ShooterOda);
TextDrawHideForPlayer(playerid, ShooterSayi);
}
OnPlayerDisconnect:
Oyuncu çıkınca Shooter oynayan sayısı düşsün diye bunu eklemeliyiz.
shooterPlayer--;
OnPlayerSpawn:
Oyuncu spawn olunca hem rastgele spawn etmesi ve araç vermesi için bunu eklemeliyiz.
TogglePlayerControllable(playerid, false);
new randomspawn = random(2);
switch(randomspawn)
{
case 0: SetPlayerPos(playerid,2692.1204,-1719.8331,41.2144);
case 1: SetPlayerPos(playerid, 2758.0222,-1705.5728,41.2144);
case 2: SetPlayerPos(playerid, 2784.2896,-1787.6863,45.7055);
}
SetTimerEx("SonraVer", 1000, false, "i", playerid);
AracVer: Bunu oyuncu spawn olunca arac vermesi icin eklemeliyiz:
forward SonraVer(playerid);
public SonraVer(playerid)
{
new Float:x,Float:y,Float:z,Float:angle;
GetPlayerFacingAngle(playerid, angle);
GetPlayerPos(playerid, x, y, z);
oyuncuArac[playerid] = CreateVehicle(411, x, y, z, angle, 0, 1, 60);
PutPlayerInVehicle(playerid, oyuncuArac[playerid],0);
TogglePlayerControllable(playerid, true);
return 1;
}
OnPlayerKeyStateChange:
Oyuncu farenin sol tusuna bastiginda roket firlatmasi icin bunu eklememiz lazimdir.
if(IsPlayerInAnyVehicle(playerid) && FireShot[playerid] == 0 && newkeys & 4 && !IsValidObject(gRocketObj[playerid]))
{
SetPlayerTime(playerid,0,0);
new
vehicleid = GetPlayerVehicleID(playerid),
Float:x,
Float:y,
Float:z,
Float:r,
Float:dist = 50.0,
Float:tmpang,
Float:tmpx,
Float:tmpy,
Float:tmpz;FireShot[playerid] = 1;
SetTimerEx(“ShotFire”, 1000, 0, “i”, playerid);
GetVehiclePos(vehicleid, x, y, z);
GetVehicleZAngle(vehicleid, r);
new rand = random(11);
switch(rand)
{
case 0: gRocketObj[playerid] = CreateObject(18647, x, y, z, 0, 0, r);
case 1: gRocketObj[playerid] = CreateObject(18648, x, y, z, 0, 0, r);
case 2: gRocketObj[playerid] = CreateObject(18649, x, y, z, 0, 0, r);
case 3: gRocketObj[playerid] = CreateObject(18650, x, y, z, 0, 0, r);
case 4: gRocketObj[playerid] = CreateObject(18651, x, y, z, 0, 0, r);
case 5: gRocketObj[playerid] = CreateObject(18652, x, y, z, 0, 0, r);
case 6: gRocketObj[playerid] = CreateObject(18647, x, y, z, 0, 0, r+90);
case 7: gRocketObj[playerid] = CreateObject(18648, x, y, z, 0, 0, r+90);
case 8: gRocketObj[playerid] = CreateObject(18649, x, y, z, 0, 0, r+90);
case 9: gRocketObj[playerid] = CreateObject(18650, x, y, z, 0, 0, r+90);
case 10: gRocketObj[playerid] = CreateObject(18651, x, y, z, 0, 0, r+90);
case 11: gRocketObj[playerid] = CreateObject(18652, x, y, z, 0, 0, r+90);
}
//Thanks to Southclaw helped me alot
for(new i;i<MAX_PLAYERS;i++)
{
if(i == playerid)continue;
if(IsPlayerInRangeOfPoint(i, 50.0, x, y, z))
{
GetPlayerPos(i, tmpx, tmpy, tmpz);tmpang = (90-atan2(tmpy-y, tmpx-x));
if(tmpang < 0)tmpang = 360.0+tmpang;
tmpang = 360.0 – tmpang;if( floatabs(tmpang-r) < 5.0)
{
dist = GetPlayerDistanceFromPoint(i, x, y, z);
}
}
}MoveObject(gRocketObj[playerid],x + (dist * floatsin(-r, degrees)),y + (dist * floatcos(-r, degrees)),z,100.0);
}
Modun altina ekleyin;
Bunu eklemelisiniz cunku oyuncu bir roket attiginda tekrar roket atma hakki olsun.
forward ShotFire(playerid);
public ShotFire(playerid)
{
FireShot[playerid] = 0;
return 1;
}
OnObjectMoved:
Bunu eklemelisiniz cunku oyuncu roket attiginda patlamasi bu fonksiyonda oluyor, bu eklenmezse roket atilir fakat patlamaz ayni zamanda objede silinmez.
for(new i;i<MAX_PLAYERS;i++)
{
if(objectid == gRocketObj[i])
{
new
Float:x,
Float:y,
Float:z;GetObjectPos(gRocketObj[i], x, y, z);
CreateExplosion(x, y, z, 11, 3.0);
DestroyObject(gRocketObj[i]);
}
}
Bunlara rağmen yapamadın mı ? modu indirmek için TIKLA
Not: Bu konu tamamı ile Emir Köseoğlu tarafından anlatılmıştır.