SDavince
Новичок
Здравствуйте, хотел предоставить готовое решение с новым видом пикапов, чекпоинтов, новый он из за того что его можно создавать с помощью объектов и наносить сверх текстуру, при том можно задавать скорость, радиус поднятия пикапа и виды вращений (пока только 1).
1. В начало вашего мода:
2.В OnDynamicObjectMoved:
3. В OnPlayerEnterDynamicArea:
4. В конец мода:
Использование:
Примечания: требует инклуд/плагины streamer, foreach, colandreas(последний по надобности).
Минусы: Нужно для некоторых объектов искать размер сферы самостоятельно (прим. modelsizes), использовать лучше с объектами без коллизий иначе при столкновении это будет как простой объект, поднятие по оси Z слишком большой (но смотрится красиво) P.S в будущем можно будет исправить индивидуальным таймером каждой mc.
Видео:ссылка удалена администрацией
P.S. Чуть времени, оформлю и сделаю описания чуть по лучше.
1. В начало вашего мода:
PHP:
#define MAX_MATERIALED_CHECKPOINTS 256
enum materialedCP {
mcID,
mcObjectID,
mcAreaID,
Float:mcPosX,
Float:mcPosY,
Float:mcPosZ,
Float:mcRotX,
Float:mcRotY,
Float:mcRotZ,
Float:mcMovedSpeed,
mcRotfix,
mcMovedtype
};
new MaterialedCP[MAX_MATERIALED_CHECKPOINTS][materialedCP];
new Iterator:MaterialCP<MAX_MATERIALED_CHECKPOINTS>;
#if defined COLANDREAS_VERSION
stock Float:GetColSphereRadius(objectmodel)
{
new Float:tmp, Float:rad;
if(0 <= objectmodel <= 19999)
{
CA_GetModelBoundingSphere(objectmodel, tmp, tmp, tmp, rad);
return rad;
}
return 0.0;
}
stock GetColSphereOffset(objectmodel, &Float:x, &Float:y, &Float:z)
{
new Float:tmp;
if(0 <= objectmodel <= 19999)
{
CA_GetModelBoundingSphere(objectmodel, x, y, z, tmp);
return 1;
}
return 0;
}
#endif
stock CreateMaterialedCP(objectID, Float:mc_PosX, Float:mc_PosY, Float:mc_PosZ, Float:mc_speed = 0.05, Float:mc_radius = 0.3, Float:mc_RotX = 0.0, Float:mc_RotY = 0.0, Float:mc_RotZ = 0.0, MovedType = 1)
{
new freeID = Iter_Free(MaterialCP);
Iter_Add(MaterialCP, freeID);
MaterialedCP[freeID][mcObjectID] = CreateDynamicObject(objectID, mc_PosX, mc_PosY, mc_PosZ, mc_RotX, mc_RotY, mc_RotZ);
#if defined COLANDREAS_VERSION
if(mc_radius == 0.0) MaterialedCP[freeID][mcAreaID] = CreateDynamicSphere(mc_PosX, mc_PosY, mc_PosZ, GetColSphereRadius(objectID));
else MaterialedCP[freeID][mcAreaID] = CreateDynamicSphere(mc_PosX, mc_PosY, mc_PosZ, mc_radius);
#else
MaterialedCP[freeID][mcAreaID] = CreateDynamicSphere(mc_PosX, mc_PosY, mc_PosZ, mc_radius);
#endif
MaterialedCP[freeID][mcPosX] = mc_PosX;
MaterialedCP[freeID][mcPosY] = mc_PosY;
MaterialedCP[freeID][mcPosZ] = mc_PosZ;
MaterialedCP[freeID][mcRotX] = mc_RotX;
MaterialedCP[freeID][mcRotY] = mc_RotY;
MaterialedCP[freeID][mcRotZ] = mc_RotZ;
MaterialedCP[freeID][mcMovedtype] = MovedType;
MaterialedCP[freeID][mcMovedSpeed] = mc_speed;
/*new Float:rot_pos;
if(!MaterialedCP[freeID][mcRotfix]) rot_pos += 0.1;
else rot_pos -= 0.1;
MaterialedCP[freeID][mcRotfix] = !MaterialedCP[freeID][mcRotfix];*/
MaterialedCP[freeID][mcRotZ] += 180;
if(MaterialedCP[freeID][mcRotZ] > 360) MaterialedCP[freeID][mcRotZ] = 180;
MoveDynamicObject(MaterialedCP[freeID][mcObjectID], MaterialedCP[freeID][mcPosX], MaterialedCP[freeID][mcPosY], MaterialedCP[freeID][mcPosZ] - 0.005, MaterialedCP[freeID][mcMovedSpeed], MaterialedCP[freeID][mcRotX], MaterialedCP[freeID][mcRotY], MaterialedCP[freeID][mcRotZ]);
return freeID;
}
stock RemoveMaterialedCP(MC_ID)
{
if(Iter_Contains(MaterialCP, MC_ID))
{
//if(IsDynamicObjectMoving(MaterialedCP[mcID][mcObjectID])) StopDynamicObject(MaterialedCP[mcID][mcObjectID]);
if(IsValidDynamicObject(MaterialedCP[MC_ID][mcObjectID])) DestroyDynamicObject(MaterialedCP[MC_ID][mcObjectID]);
MaterialedCP[MC_ID][mcObjectID] = INVALID_OBJECT_ID;
MaterialedCP[MC_ID][mcAreaID] = -1;
MaterialedCP[MC_ID][mcPosX] = 0.0;
MaterialedCP[MC_ID][mcPosY] = 0.0;
MaterialedCP[MC_ID][mcPosZ] = 0.0;
MaterialedCP[MC_ID][mcRotX] = 0.0;
MaterialedCP[MC_ID][mcRotY] = 0.0;
MaterialedCP[MC_ID][mcRotZ] = 0.0;
Iter_Remove(MaterialCP, MC_ID);
return true;
}
else return false;
}
2.В OnDynamicObjectMoved:
PHP:
foreach(new mciter: MaterialCP)
{
if(objectid == MaterialedCP[mciter][mcObjectID])
{
if(MaterialedCP[mciter][mcMovedtype] == 1)
{
new Float:rot_pos;
if(!MaterialedCP[mciter][mcRotfix]) rot_pos += 0.005;
else rot_pos -= 0.005;
MaterialedCP[mciter][mcRotfix] = !MaterialedCP[mciter][mcRotfix];
//Streamer_GetFloatData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_R_Z, obj_rotate);
MaterialedCP[mciter][mcRotZ] += 180;
if(MaterialedCP[mciter][mcRotZ] > 360) MaterialedCP[mciter][mcRotZ] = 180;
MoveDynamicObject(MaterialedCP[mciter][mcObjectID], MaterialedCP[mciter][mcPosX], MaterialedCP[mciter][mcPosY], MaterialedCP[mciter][mcPosZ] + MaterialedCP[mciter][mcRotfix], MaterialedCP[mciter][mcMovedSpeed], 0, 0, MaterialedCP[mciter][mcRotZ]);
}
}
}
PHP:
foreach(new mciter: MaterialCP)
{
if(areaid == MaterialedCP[mciter][mcAreaID])
{
OnPlayerEnterMaterialedCP(playerid, mciter);
}
}
PHP:
forward OnPlayerEnterMaterialedCP(playerid, MaterialedCP_ID);
public OnPlayerEnterMaterialedCP(playerid, MaterialedCP_ID)
{
//SCM - (Вы вошли в MCP ID #%d) . MaterialedCP_ID);
return true;
}
Использование:
PHP:
//В начало мода
new mc_i_id;
//
//
//В OnGameModeInit
mc_i_id = CreateMaterialedCP(19130, 1341.856445, 1559.042846, 10.850314, 0.5);
SetDynamicObjectMaterial(MaterialedCP[mc_i_id][mcObjectID], 0, 14739, "whorebits", "AH_cheapbarpan", 0x00000000);
SetDynamicObjectMaterial(MaterialedCP[mc_i_id][mcObjectID], 1, 19332, "balloon_texts", "balloon02", 0x00000000);
//
//Если вошел в чекпоинт/пикап вызвается функция, далее действия в теле функции
//
//
public OnPlayerEnterMaterialedCP(playerid, MaterialedCP_ID)
{
if(MaterialedCP_ID == mc_i_id)
{
SendClientMessage(playerid, -1, "Ты вошел в сферу чекпоинта/пикапа mc_i_id!");
}
return true;
}
Минусы: Нужно для некоторых объектов искать размер сферы самостоятельно (прим. modelsizes), использовать лучше с объектами без коллизий иначе при столкновении это будет как простой объект, поднятие по оси Z слишком большой (но смотрится красиво) P.S в будущем можно будет исправить индивидуальным таймером каждой mc.
Видео:
P.S. Чуть времени, оформлю и сделаю описания чуть по лучше.
Последнее редактирование модератором:
