Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Materialed Checkpoints(Pickups)

SDavince

Новичок
Здравствуйте, хотел предоставить готовое решение с новым видом пикапов, чекпоинтов, новый он из за того что его можно создавать с помощью объектов и наносить сверх текстуру, при том можно задавать скорость, радиус поднятия пикапа и виды вращений (пока только 1).

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]);
            }
        }
    }
3. В OnPlayerEnterDynamicArea:

PHP:
    foreach(new mciter: MaterialCP)
    {
        if(areaid == MaterialedCP[mciter][mcAreaID])
        {
            OnPlayerEnterMaterialedCP(playerid, mciter);
        }
    }
4. В конец мода:

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;
}
Примечания: требует инклуд/плагины streamer, foreach, colandreas(последний по надобности).

Минусы: Нужно для некоторых объектов искать размер сферы самостоятельно (прим. modelsizes), использовать лучше с объектами без коллизий иначе при столкновении это будет как простой объект, поднятие по оси Z слишком большой (но смотрится красиво) P.S в будущем можно будет исправить индивидуальным таймером каждой mc.

Видео: ссылка удалена администрацией

P.S. Чуть времени, оформлю и сделаю описания чуть по лучше.
 
Последнее редактирование модератором:
Сверху Снизу