Зарегистрировавшись у нас, вы сможете обсуждать, делиться и отправлять личные сообщения другим участникам нашего сообщества.
Зарегистрироваться!// В начале скрипта, после includes и определений
// Константы
#define ICE_WEAPON_ID 4 // ID оружия (нож)
#define FREEZE_DURATION 5000 // Длительность заморозки в миллисекундах (5 сек)
#define ICE_OBJECT_MODEL 19318 // ID объекта "лёд" (например, модель kbd_beam_rg)
// Переменные
new PlayerFrozenTimer[MAX_PLAYERS] = {-1, ...}; // Таймер для разморозки
new IceObject[MAX_PLAYERS] = {INVALID_OBJECT_ID, ...}; // Объект льда на игроке
// Функция для "заморозки" игрока
FreezePlayer(playerid, by_playerid)
{
// 1. Останавливаем игрока
TogglePlayerControllable(playerid, 0); // Блокируем управление
// 2. Применяем анимацию "заморозки" (например, анимация падения)
ApplyAnimation(playerid, "CRACK", "crckdeth2", 4.1, 0, 1, 1, 1, 0, 1);
// 3. Создаём визуальный эффект (объект льда) на спине игрока
new Float:pos[3];
GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
// Удаляем старый объект, если он был
if(IceObject[playerid] != INVALID_OBJECT_ID) {
DestroyPlayerObject(playerid, IceObject[playerid]);
}
// Создаём новый объект льда и прикрепляем его к игроку
IceObject[playerid] = CreatePlayerObject(playerid, ICE_OBJECT_MODEL, pos[0], pos[1], pos[2], 0.0, 0.0, 0.0);
AttachPlayerObjectToPlayer(playerid, IceObject[playerid], by_playerid, 0.0, 0.0, 0.3, 0.0, 0.0, 0.0);
// Примечание: AttachPlayerObjectToPlayer может работать некорректно в некоторых версиях SA-MP.
// Альтернатива - AttachPlayerObjectToPlayer с вычислением смещения.
// 4. Отправляем сообщения обоим игрокам
SendClientMessage(playerid, 0x33CCFFAA, "Вас заморозил ледяной меч! Вы обездвижены на несколько секунд.");
SendClientMessage(by_playerid, 0x33CCFFAA, "Вы заморозили противника своим ледяным мечом!");
// 5. Устанавливаем таймер на разморозку
// Сначала убиваем старый таймер, если он существует
if(PlayerFrozenTimer[playerid] != -1) {
KillTimer(PlayerFrozenTimer[playerid]);
}
PlayerFrozenTimer[playerid] = SetTimerEx("UnFreezePlayer", FREEZE_DURATION, false, "i", playerid);
}
// Функция для "разморозки" игрока (вызывается таймером)
forward UnFreezePlayer(playerid);
public UnFreezePlayer(playerid)
{
// 1. Возвращаем управление
TogglePlayerControllable(playerid, 1);
// 2. Очищаем анимацию
ClearAnimations(playerid);
// 3. Удаляем объект льда
if(IceObject[playerid] != INVALID_OBJECT_ID) {
DestroyPlayerObject(playerid, IceObject[playerid]);
IceObject[playerid] = INVALID_OBJECT_ID;
}
// 4. Сбрасываем таймер
PlayerFrozenTimer[playerid] = -1;
// 5. Сообщение игроку
SendClientMessage(playerid, 0x33CCFFAA, "Лёд растаял! Вы снова можете двигаться.");
}
// Обработчик нанесения урона
public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart)
{
// Проверяем, что урон нанесён нужным оружием, цель жива и это другой игрок
if(weaponid == ICE_WEAPON_ID && damagedid != INVALID_PLAYER_ID && IsPlayerConnected(damagedid))
{
// Вызываем функцию заморозки
FreezePlayer(damagedid, playerid);
}
return 1;
}
// Важно: очистка при дисконнекте игрока
public OnPlayerDisconnect(playerid, reason)
{
// Убиваем таймер, если он активен
if(PlayerFrozenTimer[playerid] != -1) {
KillTimer(PlayerFrozenTimer[playerid]);
PlayerFrozenTimer[playerid] = -1;
}
// Удаляем объект, если он создан
if(IceObject[playerid] != INVALID_OBJECT_ID) {
DestroyPlayerObject(playerid, IceObject[playerid]);
IceObject[playerid] = INVALID_OBJECT_ID;
}
return 1;
}
спасибо чекни личку профиляПривет! Вот система заморозки ледяным мечем
pawn:// В начале скрипта, после includes и определений // Константы #define ICE_WEAPON_ID 4 // ID оружия (нож) #define FREEZE_DURATION 5000 // Длительность заморозки в миллисекундах (5 сек) #define ICE_OBJECT_MODEL 19318 // ID объекта "лёд" (например, модель kbd_beam_rg) // Переменные new PlayerFrozenTimer[MAX_PLAYERS] = {-1, ...}; // Таймер для разморозки new IceObject[MAX_PLAYERS] = {INVALID_OBJECT_ID, ...}; // Объект льда на игроке // Функция для "заморозки" игрока FreezePlayer(playerid, by_playerid) { // 1. Останавливаем игрока TogglePlayerControllable(playerid, 0); // Блокируем управление // 2. Применяем анимацию "заморозки" (например, анимация падения) ApplyAnimation(playerid, "CRACK", "crckdeth2", 4.1, 0, 1, 1, 1, 0, 1); // 3. Создаём визуальный эффект (объект льда) на спине игрока new Float:pos[3]; GetPlayerPos(playerid, pos[0], pos[1], pos[2]); // Удаляем старый объект, если он был if(IceObject[playerid] != INVALID_OBJECT_ID) { DestroyPlayerObject(playerid, IceObject[playerid]); } // Создаём новый объект льда и прикрепляем его к игроку IceObject[playerid] = CreatePlayerObject(playerid, ICE_OBJECT_MODEL, pos[0], pos[1], pos[2], 0.0, 0.0, 0.0); AttachPlayerObjectToPlayer(playerid, IceObject[playerid], by_playerid, 0.0, 0.0, 0.3, 0.0, 0.0, 0.0); // Примечание: AttachPlayerObjectToPlayer может работать некорректно в некоторых версиях SA-MP. // Альтернатива - AttachPlayerObjectToPlayer с вычислением смещения. // 4. Отправляем сообщения обоим игрокам SendClientMessage(playerid, 0x33CCFFAA, "Вас заморозил ледяной меч! Вы обездвижены на несколько секунд."); SendClientMessage(by_playerid, 0x33CCFFAA, "Вы заморозили противника своим ледяным мечом!"); // 5. Устанавливаем таймер на разморозку // Сначала убиваем старый таймер, если он существует if(PlayerFrozenTimer[playerid] != -1) { KillTimer(PlayerFrozenTimer[playerid]); } PlayerFrozenTimer[playerid] = SetTimerEx("UnFreezePlayer", FREEZE_DURATION, false, "i", playerid); } // Функция для "разморозки" игрока (вызывается таймером) forward UnFreezePlayer(playerid); public UnFreezePlayer(playerid) { // 1. Возвращаем управление TogglePlayerControllable(playerid, 1); // 2. Очищаем анимацию ClearAnimations(playerid); // 3. Удаляем объект льда if(IceObject[playerid] != INVALID_OBJECT_ID) { DestroyPlayerObject(playerid, IceObject[playerid]); IceObject[playerid] = INVALID_OBJECT_ID; } // 4. Сбрасываем таймер PlayerFrozenTimer[playerid] = -1; // 5. Сообщение игроку SendClientMessage(playerid, 0x33CCFFAA, "Лёд растаял! Вы снова можете двигаться."); } // Обработчик нанесения урона public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart) { // Проверяем, что урон нанесён нужным оружием, цель жива и это другой игрок if(weaponid == ICE_WEAPON_ID && damagedid != INVALID_PLAYER_ID && IsPlayerConnected(damagedid)) { // Вызываем функцию заморозки FreezePlayer(damagedid, playerid); } return 1; } // Важно: очистка при дисконнекте игрока public OnPlayerDisconnect(playerid, reason) { // Убиваем таймер, если он активен if(PlayerFrozenTimer[playerid] != -1) { KillTimer(PlayerFrozenTimer[playerid]); PlayerFrozenTimer[playerid] = -1; } // Удаляем объект, если он создан if(IceObject[playerid] != INVALID_OBJECT_ID) { DestroyPlayerObject(playerid, IceObject[playerid]); IceObject[playerid] = INVALID_OBJECT_ID; } return 1; }
forward ApplyIceObjects(hitid, playerid);
public ApplyIceObjects(hitid, playerid) {
if(!IsPlayerConnected(hitid)) return;
new Float:attachedPosition[][] = {
{-0.032000, 0.025000, -0.039999, -94.900017, 8.700002, -61.399879, 1.088999, 0.765999, 1.301999},
{-0.141999, -0.003999, -0.000999, -9.199993, 5.600007, -89.499947, 0.432000, 0.656000, 0.615999},
{-0.141999, -0.003999, -0.000999, -9.199993, 5.600007, -89.499947, 0.432000, 0.656000, 0.615999},
{0.281000, 0.015000, -0.017999, -12.099991, 4.600006, -74.100014, 0.571000, 0.656000, 0.753000},
{0.262000, 0.023000, 0.013000, -12.099991, 3.400007, -83.099968, 0.571000, 0.656000, 0.753000},
{0.235000, 0.011000, -0.018999, -8.599989, 3.800008, -77.899956, 0.595000, 0.508000, 0.853999}
}, attachedBoned[] = {1, 5, 6, 12, 11, 8};
for(new i = 0; i < 6; i++) {
SetPlayerAttachedObject(hitid, i, 2806, attachedBoned[i],
attachedPosition[i][0], attachedPosition[i][1], attachedPosition[i][2],
attachedPosition[i][3], attachedPosition[i][4], attachedPosition[i][5],
attachedPosition[i][6], attachedPosition[i][7], attachedPosition[i][8],
0xFF87CEEB, 0);
}
}