Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 15
  1. #1
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±

    Система конвоя

    Не могли бы вы натолкнуть меня на мысль, как сделать систему конвоя?

    То, что я написал - убожество, ибо нарушителя просто телепортирует к тому, кто начал конвой

    1. new convoy_timer[MAX_PLAYERS];


    1. CMD:convoy(playerid, params[])
    2. {
    3. if(login_check{playerid} == false)
    4. return true;
    5. if(frac[playerid][f_rank] < 3)
    6. return SCM(playerid, COLOR_RED, !"Ваш ранг не позволяет вам вести за собой игроков!");
    7. new
    8. targetid;
    9. if(sscanf(params, "u", targetid))
    10. return SCM(playerid, COLOR_RED, !"Образец конвоя: /cuff [id]");
    11. if(!IsPlayerConnected(targetid))
    12. return SCM(playerid, COLOR_RED, !"Игрок с введенным вами ID не в сети!");
    13. if(login_check{targetid} == false)
    14. return SCM(playerid, COLOR_RED, !"Игрок в введенным вами ID не авторизован!");
    15. if(targetid == playerid)
    16. return SCM(playerid, COLOR_RED, !"Вы не можете вести себя за собой!");
    17. new
    18. string[144+1];
    19. format(string, sizeof(string), "[FRACTION] Вы повели %s за собой", GetName(targetid));
    20. SCM(playerid, COLOR_YELLOW, string);
    21. format(string, sizeof(string), "[SERVER] %s повел вас за собой", GetName(playerid));
    22. SCM(targetid, COLOR_YELLOW, string);
    23. convoy_timer[playerid] = SetTimerEx("@_UpdateConvoy", 100, false, "dd", playerid, targetid);
    24. return true;
    25. }


    1. @_UpdateConvoy(playerid, targetid);
    2. @_UpdateConvoy(playerid, targetid)
    3. {
    4. if(!IsPlayerInRangeOfPoint(playerid, 5.0, player[targetid][p_x], player[targetid][p_y], player[targetid][p_z]))
    5. {
    6. SetPlayerSpecialAction(targetid, SPECIAL_ACTION_NONE);
    7. FreezePlayer(targetid, 1);
    8. return SCM(playerid, COLOR_RED, !"[SERVER] Вы отошли слишком далеко от задержанного, конвой прекращен!");
    9. }
    10. new
    11. Float:x = player[playerid][p_x] - player[targetid][p_x],
    12. Float:y = player[playerid][p_y] - player[targetid][p_y],
    13. Float:z = player[playerid][p_z] - player[targetid][p_z];
    14. SetPlayerPos(targetid, player[targetid][p_x]+x, player[targetid][p_y]+y, player[targetid][p_z]+z);
    15. convoy_timer[playerid] = SetTimerEx("@_UpdateConvoy", 100, false, "dd", playerid, targetid);
    16. return true;
    17. }


    Я видел даже на мобильном сервере плавное приближение заключенного к тому, кто начал конвой, но как это реализовать?

  2. #2
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Бывает погуглишь или банально просмотришь форум и раз, находишь нужное:
    http://pro-pawn.ru/showthread.php?13...-s-Cuff-System

  3. #3
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от execution Посмотреть сообщение
    Бывает погуглишь или банально просмотришь форум и раз, находишь нужное:
    http://pro-pawn.ru/showthread.php?13...-s-Cuff-System
    Спасибо, раньше рыскал эти инклуды, но почти ничего толкового не нашел, видимо пропустил этот инклуд

    Чуть позже скину систему без инклуда, чтобы ничего не скачивать

    UPD: Вот собственно вся логика инклуда (только что скопировал с гитхаба, ничего не менял):

    1. forward gc_UpdateSuspect(suspectid);
    2. public gc_UpdateSuspect(suspectid)
    3. {
    4. if(gc_suspect_status{suspectid} == gc_SUSPECT_STATUS_FOLLOWING ||
    5. gc_suspect_status{suspectid} == gc_SUSPECT_STATUS_WAITING)
    6. {
    7. new
    8. Float: x,
    9. Float: y,
    10. Float: z,
    11. Float: distance;
    12.  
    13. GetPlayerPos(gc_cufferid[suspectid], x, y, z);
    14. distance =
    15. gc_GetDistanceBetweenPlayers(gc_cufferid[suspectid], suspectid);
    16.  
    17. if(distance > gc_SUSPECT_RANGE_TP)
    18. {
    19. new Float: a;
    20. GetPlayerFacingAngle(gc_cufferid[suspectid], a);
    21.  
    22. x += ((gc_SUSPECT_RANGE_RUN - 1.0 > 0.0) ?
    23. (gc_SUSPECT_RANGE_RUN - 1.0) : (1.0)) * floatsin(-a, degrees);
    24. y += ((gc_SUSPECT_RANGE_RUN - 1.0 > 0.0) ?
    25. (gc_SUSPECT_RANGE_RUN - 1.0) : (1.0)) * floatcos(-a, degrees);
    26. gc_suspect_status{suspectid} = gc_SUSPECT_STATUS_WAITING;
    27.  
    28. SetPlayerPos(suspectid, x, y, z);
    29. goto gc_reset_suspect_updating;
    30. }
    31.  
    32. else if(distance > gc_SUSPECT_RANGE_RUN)
    33. {
    34. if(gc_suspect_status{suspectid} == gc_SUSPECT_STATUS_WAITING)
    35. {
    36. TogglePlayerControllable(suspectid, 1);
    37. ApplyAnimation(suspectid, "ped", "run_civi",
    38. 4.1, 1, 1, 1, 0, 0, 1);
    39.  
    40. gc_suspect_status{suspectid} = gc_SUSPECT_STATUS_FOLLOWING;
    41. }
    42. }
    43.  
    44. else if(distance < gc_SUSPECT_RANGE_RUN && gc_SUSPECT_STATUS_FOLLOWING)
    45. {
    46. TogglePlayerControllable(suspectid, 0);
    47. gc_suspect_status{suspectid} = gc_SUSPECT_STATUS_WAITING;
    48. }
    49.  
    50. gc_reset_suspect_updating:
    51. gc_SetSuspectLook(suspectid, x, y);
    52. SetTimerEx("gc_UpdateSuspect", gc_SUSPECT_UPDATE_INTERVAL, 0,
    53. "i", suspectid);
    54. }
    55. return 1;
    56. }


    1. stock gc_SetSuspectLook(suspectid, Float: look_x, Float: look_y)
    2. {
    3. new
    4. Float: x,
    5. Float: y,
    6. Float: a;
    7.  
    8. GetPlayerPos(suspectid, x, y, a);
    9. a = atan2(look_y - y, look_x - x) - 90.0;
    10. SetPlayerFacingAngle(suspectid, a);
    11. return 1;
    12. }


    1. CMD:gcuff(playerid, params[])
    2. {
    3. extract params -> new suspectid; else
    4. return SendClientMessage(playerid, -1,
    5. gc_result_string[gc_RESULT_ERROR_ID]);
    6.  
    7. else if(gc_IsSuspectCuffed(playerid))
    8. return SendClientMessage(playerid, -1,
    9. gc_result_string[gc_RESULT_ERROR_PERMISSIONS]);
    10.  
    11. else if(suspectid == playerid || !IsPlayerConnected(suspectid))
    12. return SendClientMessage(playerid, -1,
    13. gc_result_string[gc_RESULT_ERROR_ID]);
    14.  
    15. else if(gc_GetDistanceBetweenPlayers(playerid, suspectid) >
    16. gc_CUFF_DISTANCE)
    17. return SendClientMessage(playerid, -1,
    18. gc_result_string[gc_RESULT_ERROR_DISTANCE]);
    19.  
    20. else if(gc_IsSuspectCuffed(suspectid))
    21. return SendClientMessage(playerid, -1,
    22. gc_result_string[gc_RESULT_ERROR_CUFFED]);
    23.  
    24. else if(gc_cuffed_playerid[playerid] != INVALID_PLAYER_ID)
    25. return SendClientMessage(playerid, -1,
    26. gc_result_string[gc_RESULT_ERROR_USED]);
    27.  
    28. gc_suspect_status{suspectid} = gc_SUSPECT_STATUS_CUFFED;
    29. gc_cufferid[suspectid] = playerid;
    30. gc_cuffed_playerid[playerid] = suspectid;
    31.  
    32. SetPlayerSpecialAction(suspectid, SPECIAL_ACTION_CUFFED);
    33. TogglePlayerControllable(suspectid, 0);
    34. SendClientMessage(suspectid, -1, !gc_COLOR_NOTE"На вас надели наручники!");
    35. SendClientMessage(playerid, -1, !gc_COLOR_SUCCESS"Наручники надеты!");
    36. return 1;
    37. }


    Кто-нибудь объяснит мне, как работает эта строчка и что такое арктангенс (обратные тригонометрические функции), пожалуйста?

    1. a = atan2(look_y - y, look_x - x) - 90.0;
    Последний раз редактировалось SteveStage; 10.12.2019 в 22:09.

  4. #4
    Аватар для Kovshevoy
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.07.2015
    Сообщений
    190
    Репутация:
    25 ±
    Просто телепортирует ибо у тебя SetPlayerPos, а не использование анимации ходьбы.

  5. #5
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    То, что я написал - убожество, ибо нарушителя просто телепортирует к тому, кто начал конвой
    Цитата Сообщение от NichWell Посмотреть сообщение
    Просто телепортирует ибо у тебя SetPlayerPos, а не использование анимации ходьбы.
    А теперь еще раз перечитай первый пост, твой комментарий не имеет смысла (я к тому, что я об этом уже знаю, просто ничего другого в голову не приходит)
    Последний раз редактировалось SteveStage; 10.12.2019 в 22:12.

  6. #6
    Аватар для Kovshevoy
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.07.2015
    Сообщений
    190
    Репутация:
    25 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    А теперь еще раз перечитай первый пост, твой комментарий не имеет смысла
    А смысл тогда о твоей "просьбы", если ты сам же нашел свой косяк? Тебе всего лишь нужно добавить парочку математических функций и анимацию ходьбы для игрока в наручниках - и твоя проблема решена.

  7. #7
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от NichWell Посмотреть сообщение
    А смысл тогда о твоей "просьбы", если ты сам же нашел свой косяк? Тебе всего лишь нужно добавить парочку математических функций и анимацию ходьбы для игрока в наручниках - и твоя проблема решена.
    Вот в этих "парочке математических функций" и есть вся проблема, ибо я настолько тупой (наверное), что не знаю, что такое арктангенс, а как такового объяснения в википедии я не нашел

  8. #8
    Аватар для Kovshevoy
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.07.2015
    Сообщений
    190
    Репутация:
    25 ±
    Когда сковываешь игрока в наручники
    1. TogglePlayerControllable(playerid, true);

    Это в секундный таймер
    1. if(/*переменная проверки на конвоирование игрока */ == 1)
    2. {
    3. SetPlayerToFacePlayer(playerid, /* переменная игрока которого конвоируешь */);
    4. ApplyAnimation(playerid, "ped", "WALK_civi", 6.0, 1, 1, 1, 1, 0, 1);
    5. }


    Сама функция
    1. stock SetPlayerToFacePlayer(playerid, targetid)
    2. {
    3. new
    4. Float:PlayerX,
    5. Float:PlayerY,
    6. Float:PlayerZ,
    7. Float:X,
    8. Float:Y,
    9. Float:Z,
    10. Float:ang;
    11.  
    12. if(!IsPlayerConnected(playerid) || !IsPlayerConnected(targetid))
    13. return false;
    14.  
    15. GetPlayerPos(targetid, X, Y, Z);
    16. GetPlayerPos(playerid, PlayerX, PlayerY, PlayerZ);
    17.  
    18. if( Y > PlayerY ) ang = (-acos((X - PlayerX) / floatsqroot((X - PlayerX)*(X - PlayerX) + (Y - PlayerY)*(Y - PlayerY))) - 90.0);
    19. else if( Y < PlayerY && X < PlayerX ) ang = (acos((X - PlayerX) / floatsqroot((X - PlayerX)*(X - PlayerX) + (Y - PlayerY)*(Y - PlayerY))) - 450.0);
    20. else if( Y < PlayerY ) ang = (acos((X - PlayerX) / floatsqroot((X - PlayerX)*(X - PlayerX) + (Y - PlayerY)*(Y - PlayerY))) - 90.0);
    21. if(X > PlayerX) ang = (floatabs(floatabs(ang) + 180.0));
    22. else ang = (floatabs(ang) - 180.0);
    23.  
    24. SetPlayerFacingAngle(playerid, ang);
    25. return false;
    26. }


    - - - Добавлено - - -

    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    Вот в этих "парочке математических функций" и есть вся проблема, ибо я настолько тупой (наверное), что не знаю, что такое арктангенс, а как такового объяснения в википедии я не нашел
    У меня в Украине интернет работает по-другому?
    http://prntscr.com/q8yidt

    - - - Добавлено - - -

    Взято из мода Re:Vation RP - автор Vano_Glad

      Открыть/закрыть

    1. CMD:follow(playerid, params[])
    2. {
    3. if(member_form{playerid} == false)
    4. {
    5. PlayerPlaySound(playerid, 31203, 0.0, 0.0, 0.0);
    6. SCM(playerid, COLOR_RED, !"[ОШИБКА]: {B4B4B4}Вы не уполномочены использовать данную команду!");
    7. return true;
    8. }
    9. switch(player[playerid][pmember])
    10. {
    11. case 1..4:
    12. {
    13. if(sscanf(params,"i", params[0])) return
    14. SCM(playerid, COLOR_YELLOW, !"[ПОДСКАЗКА]: {FFFFFF}Введите команду /follow [ID]");
    15. if(!IsPlayerConnected(params[0]))
    16. {
    17. PlayerPlaySound(playerid, 31203, 0.0, 0.0, 0.0);
    18. SCM(playerid, COLOR_RED, !"[ОШИБКА]: {B4B4B4}Игрок не найден!");
    19. return true;
    20. }
    21. if(login_check{params[0]} == false)
    22. {
    23. PlayerPlaySound(playerid, 31203, 0.0, 0.0, 0.0);
    24. SCM(playerid, COLOR_RED, !"[ОШИБКА]: {B4B4B4}Игрок не авторизован!");
    25. return true;
    26. }
    27. if(params[0] == playerid)
    28. {
    29. PlayerPlaySound(playerid, 31203, 0.0, 0.0, 0.0);
    30. SCM(playerid, COLOR_RED, !"[ОШИБКА]: {B4B4B4}Вы указали свой ID!");
    31. return true;
    32. }
    33. if(GetDistanceBetweenPlayers(playerid, params[0]) > 3.0)
    34. {
    35. PlayerPlaySound(playerid, 31203, 0.0, 0.0, 0.0);
    36. SCM(playerid, COLOR_RED, !"[ОШИБКА]: {B4B4B4}Игрок далеко от вас!");
    37. return true;
    38. }
    39. if(IsPlayerInAnyVehicle(params[0]))
    40. {
    41. PlayerPlaySound(playerid, 31203, 0.0, 0.0, 0.0);
    42. SCM(playerid, COLOR_RED, "[ОШИБКА]: {B4B4B4}Игрок находится в транспортном средстве!");
    43. return true;
    44. }
    45. if(IsPlayerInAnyVehicle(playerid))
    46. {
    47. PlayerPlaySound(playerid, 31203, 0.0, 0.0, 0.0);
    48. SCM(playerid, COLOR_RED, "[ОШИБКА]: {B4B4B4}Нельзя использовать в машине!");
    49. return true;
    50. }
    51. if(handcuffs_check{params[0]} == false)
    52. {
    53. PlayerPlaySound(playerid, 31203, 0.0, 0.0, 0.0);
    54. SCM(playerid, COLOR_RED, "[ОШИБКА]: {B4B4B4}Игрок должен находится в наручниках!");
    55. return true;
    56. }
    57. if(follow_id[params[0]] != -1 && follow_id[playerid] != params[0])
    58. {
    59. PlayerPlaySound(playerid, 31203, 0.0, 0.0, 0.0);
    60. SCM(playerid, COLOR_RED, "[ОШИБКА]: {B4B4B4}Этого игрока уже кто-то сопровождает!");
    61. return true;
    62. }
    63. if(follow_id[playerid] == params[0])
    64. {
    65. follow_id[playerid] = -1;
    66. follow_id[params[0]] = -1;
    67. GameTextForPlayer(params[0],"~g~unfollow", 5000, 3);
    68. GameTextForPlayer(playerid,"~g~unfollow", 5000, 3);
    69. follow_check{params[0]} = false;
    70. Freeze(params[0], 1);
    71. KillTimer(follow_timer[params[0]]);
    72. return true;
    73. }
    74. if(follow_id[playerid] != -1)
    75. {
    76. PlayerPlaySound(playerid, 31203, 0.0, 0.0, 0.0);
    77. SCM(playerid, COLOR_RED, "[ОШИБКА]: {B4B4B4}Вы уже кого-то сопровождаете!");
    78. return true;
    79. }
    80. GameTextForPlayer(params[0],"~r~follow", 5000, 3);
    81. GameTextForPlayer(playerid,"~r~follow", 5000, 3);
    82. follow_id[playerid] = params[0];
    83. follow_id[params[0]] = playerid;
    84. follow_check{params[0]} = true;
    85. follow_timer[params[0]] = SetTimerEx("@_FollowTime", 250, false, "i", params[0]);
    86. }
    87. default:
    88. {
    89. PlayerPlaySound(playerid, 31203, 0.0, 0.0, 0.0);
    90. SCM(playerid, COLOR_RED, !"[ОШИБКА]: {B4B4B4}Вы не уполномочены использовать данную команду!");
    91. return true;
    92. }
    93. }
    94. return true;
    95. }
    96. @_FollowTime(playerid);
    97. @_FollowTime(playerid)
    98. {
    99. new Float: GotDistance = GetDistanceBetweenPlayers(playerid, follow_id[playerid]);
    100. if(GotDistance < 0.7)
    101. {
    102. if(fol_check{playerid} == true)
    103. {
    104. fol_check{playerid} = false;
    105. }
    106. }
    107. else if(GotDistance > 3.0)
    108. {
    109. if(fol_check{playerid} == false)
    110. {
    111. fol_check{playerid} = true;
    112. }
    113. ApplyAnimation(playerid, "PED", "SPRINT_PANIC", 6.0, 1, 1, 1, 1, 0, 1);
    114. }
    115. else
    116. {
    117. if(fol_check{playerid} == false)
    118. {
    119. fol_check{playerid} = true;
    120. }
    121. ApplyAnimation(playerid, "ped", "WALK_civi", 6.0, 1, 1, 1, 1, 0, 1);
    122. }
    123. SetPlayerToFacePlayer(playerid, follow_id[playerid]);
    124. follow_timer[playerid] = SetTimerEx("@_FollowTime", 250, false, "i", playerid);
    125. return true;
    126. }

    Последний раз редактировалось Kovshevoy; 10.12.2019 в 22:25.

  9. Пользователь сказал cпасибо:
    SteveStage (11.12.2019)
  10. #9
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
     OFFTOP
    Цитата Сообщение от NichWell Посмотреть сообщение
    Взято из мода Re:Vation RP - автор Vano_Glad
    Вано Глад, по его урокам я в конце августа начал пытаться учиться Pawn скриптингу)

  11. #10
    Аватар для Kovshevoy
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.07.2015
    Сообщений
    190
    Репутация:
    25 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
     OFFTOP


    Вано Глад, по его урокам я в конце августа начал пытаться учиться Pawn скриптингу)
    Не того ты персонажа выбрал, для обучения Павна. Хотя, для понимания основ для дальнейшего совершенствования - может быть и сойдет.

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •