Selamlar, oyundaki objelerin silahlarla vurduğumuzda hasar alıp yok olması için bir sistem yapmıştım. Kodları inceleyip türevleri yapılabilir. Aşağıdaki kodlar resimdeki gibi 3 tane kum torbasını üst üste koyuyor. Link: https://st.depositphotos.com/1567858/4421/i/950/depositphotos_44214047-stock-photo-trenches-of-death-ww1-sandbag.jpg
Gerekenler: MapAndreas, Streamer, I-ZCMD
#define MAX_LAYERS (4)
#define MAX_COVERS (100)
#define COVER_HEALTH (250.0)
enum E_COVER
{
Float: coverHealth,
coverObj[MAX_LAYERS],
Text3D: coverLabel,
coverTimer,
coverExists
}
new CoverData[MAX_COVERS][E_COVER];
public OnPlayerShootDynamicObject(playerid, weaponid, objectid, Float: x, Float: y, Float: z)
{
if(Streamer_GetIntData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_MODEL_ID) == 2060)
{
for(new i, j = MAX_COVERS; i < j; i++)
{
if(CoverData[i][coverExists])
{
new Float: posx, Float: posy, Float: posz;
GetDynamicObjectPos(objectid, posx, posy, posz);
Cover_Damage(i, weaponid, GetPlayerDistanceFromPoint(playerid, posx, posy, posz));
PlayerPlaySound(playerid, 17802, 0.0, 0.0, 0.0);
break;
}
}
}
return 1;
}
Cover_FindFreeID()
{
for(new i; i < MAX_COVERS; i++)
{
if(!CoverData[i][coverExists]) return i;
}
return -1;
}
Cover_Create(Float:x, Float:y, Float:a)
{
new id = Cover_FindFreeID();
if(id == -1)
return print("cover limit asildi");
new Float:CA_z;
GetPointZPos(x, y, CA_z);
x += (1.0 * floatsin(-a, degrees));
y += (1.0 * floatcos(-a, degrees));
CA_z += 0.185;
for(new i; i < MAX_LAYERS; i++)
{
CoverData[id][coverObj][i] = CreateDynamicObject(2060, x, y, CA_z + (0.25 * i), 0.0, 0.0, a);
if(IsValidDynamicObject(CoverData[id][coverObj][i])) Streamer_SetArrayData(STREAMER_TYPE_OBJECT, CoverData[id][coverObj][i], E_STREAMER_EXTRA_ID, id);
}
CoverData[id][coverHealth] = COVER_HEALTH;
new label[6];
format(label, sizeof(label), "%.1f", COVER_HEALTH);
CoverData[id][coverLabel] = CreateDynamic3DTextLabel(label, Cover_DamageColor(id), x, y, CA_z + 1.25, 10.0, .testlos = 1);
CoverData[id][coverTimer] = SetTimerEx("Cover_Destroy", 300000, false, "i", id);
CoverData[id][coverExists] = true;
return 1;
}
forward Cover_Destroy(id);
public Cover_Destroy(id)
{
if(!(0 <= id < MAX_COVERS) || !CoverData[id][coverExists]) return 0;
KillTimer(CoverData[id][coverTimer]);
CoverData[id][coverTimer] = -1;
for(new i; i < MAX_LAYERS; i++)
{
if(IsValidDynamicObject(CoverData[id][coverObj][i])) DestroyDynamicObject(CoverData[id][coverObj][i]);
CoverData[id][coverObj][i] = INVALID_OBJECT_ID;
}
if(IsValidDynamic3DTextLabel(CoverData[id][coverLabel])) DestroyDynamic3DTextLabel(CoverData[id][coverLabel]);
CoverData[id][coverLabel] = Text3D: INVALID_3DTEXT_ID;
CoverData[id][coverHealth] = COVER_HEALTH;
CoverData[id][coverExists] = false;
return 1;
}
Cover_Damage(coverid, weaponid, Float: distance)
{
CoverData[coverid][coverHealth] -= GetWeaponDamageFromDistance(weaponid, distance) / 1.5;
if(CoverData[coverid][coverHealth] < 0.0) {
Cover_Destroy(coverid);
}else{
new label[6];
format(label, sizeof(label), "%.1f", CoverData[coverid][coverHealth]);
UpdateDynamic3DTextLabelText(CoverData[coverid][coverLabel], Cover_DamageColor(coverid), label);
}
return 1;
}
Cover_DamageColor(coverid)
{
new Float: health = CoverData[coverid][coverHealth], color;
if(health < (COVER_HEALTH / 4)) {
color = 0xE74C3CFF;
}else if(health < (COVER_HEALTH / 2)) {
color = 0xF39C12FF;
}else{
color = 0x2ECC71FF;
}
return color;
}
COMMAND:createcover(playerid, params[]) return cmd_engelkur(playerid, params);
COMMAND:engelkur(playerid, params[])
{
new Float: x, Float: y, Float: z, Float:a;
GetPlayerPos(playerid, x, y, z);
GetPlayerFacingAngle(playerid, a);
Cover_Create(x, y, a);
return 1;
}
teşekkürler
Paylaşım için teşekkürler.
Teşekkürler. :helal:
Paylaşım için teşekkürler.
Yararlı.