-DeimoS-

[ DM ] Sniper Madness

Jul 30th, 2019
492
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 22.88 KB | None | 0 0
  1. /*
  2.                    Reborn Project Sniper Madness
  3.             Реализация основы: CL1FF (Clifford Sanders)
  4.                 Реализация текущей версии: DeimoS
  5.                   Основано на версии от Sonic X
  6.                    Ссылка на оригинальную тему:
  7.         http://pawn-wiki.ru/index.php?/topic/48264-sniper-madness/
  8. */
  9. #include <a_samp>
  10. #include <mxINI>
  11. #include <sscanf2>
  12.  
  13. #if !defined FLOAT_INFINITY
  14.     const Float:FLOAT_INFINITY = Float:0x7F800000;
  15. #endif
  16.  
  17. const MAX_SERVER_NAME = 15;
  18. const MAX_GAMEMODE_NAME = 20;
  19. enum e_SERVER_INFO
  20. {
  21.     sinfo_ServerName[MAX_SERVER_NAME],
  22.     sinfo_GameModeName[MAX_GAMEMODE_NAME]
  23. };
  24. new ServerInfo[e_SERVER_INFO] =
  25. {
  26.     "Sniper Madness",
  27.     "SM:Deathmatch R-3.0"
  28. };
  29.  
  30. new const ACCOUNT_FILE_PATCH[] = "players/%s.txt";
  31.  
  32. /*
  33.     ====    Карты
  34. */
  35. const INVALID_MAP_ID = -1;
  36. enum _:e_MAP_LIST
  37. {
  38.     MAP_KACC
  39.     //MAP_
  40. };
  41. const MAX_MAP_NAME = 8;
  42. new MapName[e_MAP_LIST][] =
  43. {
  44.     "K.A.C.C"
  45. };
  46. const MAX_MAPS = sizeof(MapName);
  47.  
  48. enum e_SPAWN_POS
  49. {
  50.     Float:spawn_PosX,
  51.     Float:spawn_PosY,
  52.     Float:spawn_PosZ
  53. };
  54. new Float:mapSpawnPos[e_MAP_LIST][][e_SPAWN_POS] =
  55. {
  56.     {
  57.         {2590.00000, 2790.50000, 9.81350},
  58.         {2525.00000, 2753.19995, 9.81290},
  59.         {2525.00000, 2818.00000, 9.81600},
  60.         {2546.00000, 2841.00000, 9.81780},
  61.         {2555.00000, 2805.30005, 9.81810},
  62.         {2610.00000, 2849.00000, 9.81770},
  63.         {2610.00000, 2810.00000, 9.81560},
  64.         {2627.00000, 2841.00000, 9.81790},
  65.         {2600.00000, 2800.69995, 9.81920},
  66.         {2630.00000, 2804.00000, 9.81760},
  67.         {2650.00000, 2735.00000, 9.81740},
  68.         {2655.00000, 2740.00000, 18.31350},
  69.         {2618.50000, 2768.00000, 22.81450},
  70.         {2643.00000, 2710.00000, 24.81600},
  71.         {2610.00000, 2720.00000, 35.52430},
  72.         {2600.00000, 2720.00000, 24.81410},
  73.         {2643.00000, 2775.00000, 22.81240},
  74.         {2600.00000, 2815.00000, 26.80170},
  75.         {2650.00000, 2815.00000, 35.31420},
  76.         {2658.13110, 2661.40527, 37.07470},
  77.         {2594.80396, 2640.78027, 79.25670},
  78.         {2631.91162, 2835.06592, 93.00880},
  79.         {2721.13062, 2774.64648, 73.82352},
  80.         {2691.95605, 2785.35449, 60.78416},
  81.         {2729.30054, 2686.41992, 60.77659},
  82.         {2570.00000, 2704.00000, 21.93540}
  83.     }
  84. };
  85.  
  86. /*
  87.     ====
  88. */
  89.  
  90. #define MAX_PASSWORD_ATTEMPT 3
  91.  
  92. const SKIN_MAN = 125;
  93. const SKIN_WOMAN = 90;
  94.  
  95. const PLAYER_WEATHER = 9;
  96. const PLAYER_TIME = 10;
  97.  
  98. const Float:DAMAGE_DEAGLE = 50.0;
  99. const Float:DAMAGE_SNIPER = 100.0;
  100.  
  101. const Float:SPAWNED_DISTANCE = 20.0;
  102. const SPAWNED_TIME = 3000;
  103. const INTERVAL_SPAWN = 3000;
  104.  
  105. /*
  106.     ====    Диалоги
  107. */
  108.  
  109. enum
  110. {
  111.     dRegister_Rules,
  112.     dRegister_Gender,
  113.     dRegister_InputPass,
  114.     dRegister_AcceptPass,
  115.     dLogin,
  116.     dMapList
  117. };
  118.  
  119.  
  120. enum _:e_PLAYER_ACHIEVEMENTS
  121. {
  122.     bool:achFirstKill,
  123.     bool:achUltraKill
  124.  
  125.     /*
  126.     bool:,
  127.     bool:,
  128.     bool:,
  129.     ...
  130.     */
  131. }
  132.  
  133. const MIN_PLAYER_PASSWORD = 3;
  134. const MAX_PLAYER_PASSWORD = 32;
  135. enum e_PLAYER_INFO
  136. {
  137.     pPassword[MAX_PLAYER_PASSWORD+1],
  138.     pName[MAX_PLAYER_NAME],
  139.     pKills,
  140.     pDeaths,
  141.     pGender,
  142.     pAdmin,
  143.     pVip,
  144.     pBan,
  145.     pMap,
  146.     Float:pHealth,
  147.     pAchievement[e_PLAYER_ACHIEVEMENTS]
  148. };
  149. new pInfo[MAX_PLAYERS][e_PLAYER_INFO];
  150. new const NULL_pInfo[e_PLAYER_INFO] =
  151. {
  152.     "",                 // pPassword
  153.     "",                 // pName
  154.     0,                  // pKills
  155.     0,                  // pDeaths
  156.     0,                  // pGender
  157.     0,                  // pAdmin
  158.     0,                  // pVip
  159.     0,                  // pBan
  160.     INVALID_MAP_ID,     // pMap
  161.     0.0,                // pHealth
  162.     {0, 0}              // pAchievement
  163. };
  164. #define pNick(%0) pInfo[%0][pName]
  165.  
  166. new bool:PlayerAuthorized[MAX_PLAYERS char];
  167. stock IsPlayerAuthorized(playerid)
  168. {
  169.     return (PlayerAuthorized{playerid});
  170. }
  171.  
  172.  
  173.  
  174. const INVALID_DIALOG_ID = -1;
  175. new PlayerDialogShown[MAX_PLAYERS];
  176. stock ac_ShowPlayerDialog(playerid, dialogid, style, caption[], info[], button1[], button2[])
  177. {
  178.     PlayerDialogShown[playerid] = dialogid;
  179.     return ShowPlayerDialog(playerid, dialogid, style, caption, info, button1, button2);
  180. }
  181. #if defined _ALS_ShowPlayerDialog
  182.     #undef ShowPlayerDialog
  183. #else
  184.     #define _ALS_ShowPlayerDialog
  185. #endif
  186. #define ShowPlayerDialog ac_ShowPlayerDialog
  187.  
  188. stock ac_SetPlayerHealth(playerid, Float:health)
  189. {
  190.     pInfo[playerid][pHealth] = health;
  191.     return SetPlayerHealth(playerid, health);
  192. }
  193. #if defined _ALS_SetPlayerHealth
  194.     #undef SetPlayerHealth
  195. #else
  196.     #define _ALS_SetPlayerHealth
  197. #endif
  198. #define SetPlayerHealth ac_SetPlayerHealth
  199.  
  200.  
  201. new pVar__AccountLogin_WrongPass[] = "pVar__AccountLogin_WrongPass";
  202.  
  203.  
  204. new Text:tdServerName;
  205.  
  206. main(){}
  207.  
  208.  
  209. public OnGameModeInit()
  210. {
  211.     SetGameModeText(ServerInfo[sinfo_GameModeName]);
  212.     EnableStuntBonusForAll(false);
  213.     DisableInteriorEnterExits();
  214.     UsePlayerPedAnims();
  215.     ShowPlayerMarkers(0);
  216.     ShowNameTags(false);
  217.  
  218.  
  219.     CreateTD__Logo();
  220.     return 1;
  221. }
  222.  
  223. new bool:PlayerSkipSkinSelect[MAX_PLAYERS char];
  224. new PlayerSkipSkinSelectF4Bug[MAX_PLAYERS char];
  225.  
  226.  
  227.  
  228. public OnPlayerConnect(playerid)
  229. {
  230.     PlayerSkipSkinSelect{playerid} = true;
  231.     TogglePlayerSpectating(playerid, true);
  232.  
  233.  
  234.     TextDrawShowForPlayer(playerid, tdServerName);
  235.     SetPlayerVirtualWorld(playerid, 1);
  236.     SetWeather(PLAYER_WEATHER);
  237.     SetWorldTime(PLAYER_TIME);
  238.  
  239.     PlayerDialogShown[playerid] = INVALID_DIALOG_ID;
  240.     GetPlayerName(playerid, pInfo[playerid][pName], MAX_PLAYER_NAME);
  241.     FindPlayerAccount(playerid);
  242.  
  243.     return 1;
  244. }
  245.  
  246. public OnPlayerRequestClass(playerid, classid)
  247. {
  248.     SetSpawnInfo(playerid, 111, 0, 2026.1704, 1343.6394, 10.8203, 266.7928, 24, 330, 0, 0, 0, 0);
  249.     if(!PlayerSkipSkinSelect{playerid})
  250.     {
  251.         if(PlayerSkipSkinSelectF4Bug{playerid})
  252.         {
  253.             PlayerSkipSkinSelectF4Bug{playerid} = 0;
  254.             return SpawnPlayer(playerid);
  255.         }
  256.         TogglePlayerSpectating(playerid, true);
  257.         SetTimerEx("@__SkipSKinSelect_SpecOff", 500, 0, "i", playerid);
  258.     }
  259.     else
  260.     {
  261.         PlayerSkipSkinSelect{playerid} = false;
  262.         SpawnPlayer(playerid);
  263.     }
  264.     return 1;
  265. }
  266.  
  267.  
  268. public OnPlayerDisconnect(playerid, reason)
  269. {
  270.     SavePlayerAccount(playerid);
  271.  
  272.     static const disconnect_reasons[3][13] =
  273.     {
  274.         "потеря связи",
  275.         "выход",
  276.         "кик/бан"
  277.     };
  278.  
  279.     new string[31+MAX_PLAYER_NAME+11+13+sizeof(disconnect_reasons[])+1];
  280.     format(string, sizeof(string), "%s [ID: %d] %s от сервера. Причина: %s.",
  281.         pNick(playerid), playerid,
  282.         (IsPlayerMale(playerid) ? ("отсоединился") : ("отсоединилась")),
  283.         disconnect_reasons[reason]);
  284.     SendClientMessageToAll(0xFFFFFFFF, string);
  285.  
  286.     ClearPlayerData(playerid);
  287.     return 1;
  288. }
  289.  
  290. public OnPlayerSpawn(playerid)
  291. {
  292.     ResetPlayerMoney(playerid);
  293.     SetPlayerSkin(playerid, (pInfo[playerid][pGender] == 'М' ? SKIN_WOMAN : SKIN_MAN));
  294.  
  295.     SetPlayerHealth(playerid, FLOAT_INFINITY);
  296.  
  297.     new map_id = pInfo[playerid][pMap];
  298.     if(map_id != -1)
  299.     {
  300.         new rand = random(sizeof(mapSpawnPos[]));
  301.         SetPlayerPos(playerid,
  302.             mapSpawnPos[map_id][rand][spawn_PosX],
  303.             mapSpawnPos[map_id][rand][spawn_PosY],
  304.             mapSpawnPos[map_id][rand][spawn_PosZ]);
  305.     }
  306.  
  307.     SetPlayerChatBubble(playerid, "SPAWNED", 0xFF0000FF, SPAWNED_DISTANCE, SPAWNED_TIME);
  308.     SetTimerEx("@__AntiSpawnKillDisable", SPAWNED_TIME, false, "i", playerid);
  309.  
  310.     return 1;
  311. }
  312.  
  313. public OnPlayerDeath(playerid, killerid, reason)
  314. {
  315.     SetPlayerScore(playerid, GetPlayerScore(playerid) - 1);
  316.     pInfo[playerid][pDeaths]++;
  317.  
  318.     if(pInfo[playerid][pVip])
  319.         SpawnPlayer(playerid);
  320.     else
  321.     {
  322.         TogglePlayerSpectating(playerid, true);
  323.         SetTimerEx("@__KillCamDisable", INTERVAL_SPAWN, false, "i", playerid);
  324.     }
  325.  
  326.     if(killerid == INVALID_PLAYER_ID)
  327.         return 1;
  328.  
  329.     if(!pInfo[playerid][pVip])
  330.         PlayerSpectatePlayer(playerid, killerid);
  331.  
  332.     SetPlayerScore(killerid, GetPlayerScore(killerid)+1);
  333.     pInfo[killerid][pKills]++;
  334.  
  335.     if(!pInfo[killerid][pAchievement][achFirstKill])
  336.         pInfo[killerid][pAchievement][achFirstKill] = true;
  337.     return 1;
  338. }
  339.  
  340.  
  341.  
  342. public OnPlayerText(playerid, text[])
  343. {
  344.     if(!IsPlayerAuthorized(playerid))
  345.         return 0;
  346.  
  347.     static message_string[144+1];
  348.     format(message_string, sizeof(message_string), "%s [%i]: {FFFFFF}%s", pNick(playerid), playerid, text);
  349.  
  350.     if(pInfo[playerid][pAdmin])
  351.         SendClientMessageToAll(0xFF0000FF, message_string);
  352.     else if(pInfo[playerid][pVip])
  353.         SendClientMessageToAll(0xFFA500FF, message_string);
  354.     else
  355.         SendClientMessageToAll(0xFFFFFFFF, message_string);
  356.     return 0;
  357. }
  358.  
  359. public OnPlayerUpdate(playerid)
  360. {
  361.     if(pInfo[playerid][pMap] != INVALID_MAP_ID)
  362.     {
  363.         static object_slot_0;
  364.         static object_slot_1;
  365.  
  366.         object_slot_0 = IsPlayerAttachedObjectSlotUsed(playerid, 0);
  367.         object_slot_1 = IsPlayerAttachedObjectSlotUsed(playerid, 1);
  368.         switch(GetPlayerWeapon(playerid))
  369.         {
  370.             case WEAPON_DEAGLE:
  371.             {
  372.                 if(!object_slot_0)
  373.                     SetPlayerAttachedObject(playerid, 0, 358, 1, 0.199999, -0.139999, 0.050000, 0.500007, -135.000000, 0.000000);
  374.                 if(object_slot_1)
  375.                     RemovePlayerAttachedObject(playerid, 1);
  376.             }
  377.             case WEAPON_SNIPER:
  378.             {
  379.                 if(object_slot_0)
  380.                     RemovePlayerAttachedObject(playerid, 0);
  381.                 if(!object_slot_1)
  382.                     SetPlayerAttachedObject(playerid, 1, 348, 8, -0.079999, -0.039999, 0.109999, -90.100006, 0.000000, 0.000000);
  383.             }
  384.             default:
  385.             {
  386.                 if(!object_slot_0)
  387.                     SetPlayerAttachedObject(playerid, 0, 358, 1, 0.199999, -0.139999, 0.050000, 0.500007, -135.000000, 0.000000);
  388.                 if(!object_slot_1)
  389.                     SetPlayerAttachedObject(playerid, 1, 348, 8, -0.079999, -0.039999, 0.109999, -90.100006, 0.000000, 0.000000);
  390.             }
  391.         }
  392.     }
  393.  
  394.     return 1;
  395. }
  396.  
  397.  
  398. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  399. {
  400.     if(newkeys & KEY_YES)
  401.     {
  402.         if(pInfo[playerid][pMap] != INVALID_MAP_ID)
  403.         {
  404.             StopPlayerGame(playerid);
  405.         }
  406.     }
  407.  
  408.     return 1;
  409. }
  410.  
  411. public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
  412. {
  413.     if(hittype == BULLET_HIT_TYPE_PLAYER)
  414.     {
  415.         if(pInfo[hitid][pHealth] != FLOAT_INFINITY)
  416.         {
  417.             new Float:health;
  418.             GetPlayerHealth(hitid, health);
  419.             if(health > pInfo[hitid][pHealth])
  420.                 health = pInfo[hitid][pHealth];
  421.             switch (weaponid)
  422.             {
  423.                 case WEAPON_DEAGLE:
  424.                 {
  425.                     health -= DAMAGE_DEAGLE;
  426.                 }
  427.                 case WEAPON_SNIPER:
  428.                 {
  429.                     health -= DAMAGE_SNIPER;
  430.                 }
  431.             }
  432.             SetPlayerHealth(hitid, health);
  433.         }
  434.         return 0;
  435.     }
  436.     return 1;
  437. }
  438.  
  439.  
  440. stock FindPlayerAccount(playerid)
  441. {
  442.     new file_patch[sizeof(ACCOUNT_FILE_PATCH)-2+MAX_PLAYER_NAME+1];
  443.     format(file_patch, sizeof(file_patch), ACCOUNT_FILE_PATCH, pNick(playerid));
  444.  
  445.     if(!fexist(file_patch))
  446.     {
  447.         ShowAccountSystemDialog(playerid, dRegister_Rules);
  448.     }
  449.     else
  450.     {
  451.         LoadPlayerAccount(playerid);
  452.  
  453.         if(pInfo[playerid][pBan])
  454.             return Kick(playerid);
  455.  
  456.         ShowAccountSystemDialog(playerid, dLogin);
  457.     }
  458.     return 1;
  459. }
  460.  
  461. stock CreatePlayerAccount(playerid)
  462. {
  463.     new file_patch[sizeof(ACCOUNT_FILE_PATCH)-2+MAX_PLAYER_NAME+1];
  464.     format(file_patch, sizeof(file_patch), ACCOUNT_FILE_PATCH, pNick(playerid));
  465.     printf("%s", file_patch);
  466.     new file = ini_createFile(file_patch);
  467.  
  468.     if(file >= 0)
  469.     {
  470.         ini_setString(file, "password", pInfo[playerid][pPassword]);
  471.         ini_setInteger(file, "gender", pInfo[playerid][pGender]);
  472.         ini_setInteger(file, "admin", pInfo[playerid][pAdmin]);
  473.         ini_setInteger(file, "kills", pInfo[playerid][pKills]);
  474.         ini_setInteger(file, "death", pInfo[playerid][pDeaths]);
  475.         ini_setInteger(file, "vip", pInfo[playerid][pVip]);
  476.         ini_setInteger(file, "ban", pInfo[playerid][pBan]);
  477.         ini_setInteger(file, "ach__first_kill", pInfo[playerid][pAchievement][achFirstKill]);
  478.         ini_setInteger(file, "ach__ultra_kill", pInfo[playerid][pAchievement][achUltraKill]);
  479.  
  480.         ini_closeFile(file);
  481.     }
  482. }
  483.  
  484. stock LoadPlayerAccount(playerid)
  485. {
  486.     new file_patch[sizeof(ACCOUNT_FILE_PATCH)-2+MAX_PLAYER_NAME+1];
  487.     format(file_patch, sizeof(file_patch), ACCOUNT_FILE_PATCH, pNick(playerid));
  488.     new file = ini_openFile(file_patch);
  489.  
  490.     if(file >= 0)
  491.     {
  492.         ini_getString(file, "password", pInfo[playerid][pPassword], MAX_PLAYER_PASSWORD);
  493.         ini_getInteger(file, "gender", pInfo[playerid][pGender]);
  494.         ini_getInteger(file, "admin", pInfo[playerid][pAdmin]);
  495.         ini_getInteger(file, "kills", pInfo[playerid][pKills]);
  496.         ini_getInteger(file, "death", pInfo[playerid][pDeaths]);
  497.         ini_getInteger(file, "vip", pInfo[playerid][pVip]);
  498.         ini_getInteger(file, "ban", pInfo[playerid][pBan]);
  499.         ini_getInteger(file, "ach__first_kill", pInfo[playerid][pAchievement][achFirstKill]);
  500.         ini_getInteger(file, "ach__ultra_kill", pInfo[playerid][pAchievement][achUltraKill]);
  501.  
  502.         ini_closeFile(file);
  503.     }
  504. }
  505.  
  506. stock SavePlayerAccount(playerid)
  507. {
  508.     new file_patch[sizeof(ACCOUNT_FILE_PATCH)-2+MAX_PLAYER_NAME+1];
  509.     format(file_patch, sizeof(file_patch), ACCOUNT_FILE_PATCH, pNick(playerid));
  510.     new file = ini_openFile(file_patch);
  511.  
  512.     if(file >= 0)
  513.     {
  514.         ini_setString(file, "password", pInfo[playerid][pPassword]);
  515.         ini_setInteger(file, "gender", pInfo[playerid][pGender]);
  516.         ini_setInteger(file, "admin", pInfo[playerid][pAdmin]);
  517.         ini_setInteger(file, "kills", pInfo[playerid][pKills]);
  518.         ini_setInteger(file, "death", pInfo[playerid][pDeaths]);
  519.         ini_setInteger(file, "vip", pInfo[playerid][pVip]);
  520.         ini_setInteger(file, "ban", pInfo[playerid][pBan]);
  521.         ini_setInteger(file, "ach__first_kill", pInfo[playerid][pAchievement][achFirstKill]);
  522.         ini_setInteger(file, "ach__ultra_kill", pInfo[playerid][pAchievement][achUltraKill]);
  523.  
  524.         ini_closeFile(file);
  525.     }
  526. }
  527.  
  528. stock ClearPlayerData(playerid)
  529. {
  530.     pInfo[playerid] = NULL_pInfo;
  531.     PlayerAuthorized{playerid} = false;
  532.     return 1;
  533. }
  534.  
  535. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  536. {
  537.     if(PlayerDialogShown[playerid] != dialogid)
  538.         return 1;
  539.     PlayerDialogShown[playerid] = INVALID_DIALOG_ID;
  540.  
  541.     switch(dialogid)
  542.     {
  543.         case dRegister_Rules:
  544.         {
  545.             if(!response)
  546.             {
  547.                 Kick(playerid);
  548.                 return 1;
  549.             }
  550.  
  551.             ShowAccountSystemDialog(playerid, dRegister_Gender);
  552.             return 1;
  553.         }
  554.         case dRegister_Gender:
  555.         {
  556.             if(!response)
  557.             {
  558.                 ShowAccountSystemDialog(playerid, dRegister_Rules);
  559.                 return 1;
  560.             }
  561.  
  562.             if(!listitem)
  563.             {
  564.                 pInfo[playerid][pGender] = 'М';
  565.                 SendClientMessage(playerid, -1, "Вы выбрали мужский пол.");
  566.             }
  567.             else
  568.             {
  569.                 pInfo[playerid][pGender] = 'Ж';
  570.                 SendClientMessage(playerid, -1, "Вы выбрали женский пол.");
  571.             }
  572.             ShowAccountSystemDialog(playerid, dRegister_InputPass);
  573.             return 1;
  574.         }
  575.         case dRegister_InputPass:
  576.         {
  577.             if(!response)
  578.             {
  579.                 ShowAccountSystemDialog(playerid, dRegister_Gender);
  580.                 return 1;
  581.             }
  582.             new len = strlen(inputtext);
  583.             if(!len)
  584.             {
  585.                 ShowAccountSystemDialog(playerid, dRegister_InputPass);
  586.                 return 1;
  587.             }
  588.             if(len < MIN_PLAYER_PASSWORD)
  589.             {
  590.                 ShowAccountSystemDialog(playerid, dRegister_InputPass);
  591.                 SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Минимальная длина пароля: "#MIN_PLAYER_PASSWORD"!");
  592.                 return 1;
  593.             }
  594.             if(len > MAX_PLAYER_PASSWORD)
  595.             {
  596.                 ShowAccountSystemDialog(playerid, dRegister_InputPass);
  597.                 SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Максимальная длина пароля: "#MAX_PLAYER_PASSWORD"!");
  598.                 return 1;
  599.             }
  600.             pInfo[playerid][pPassword][0] = '\0';
  601.             strcat(pInfo[playerid][pPassword], inputtext, MAX_PLAYER_PASSWORD);
  602.             ShowAccountSystemDialog(playerid, dRegister_AcceptPass);
  603.             return 1;
  604.         }
  605.         case dRegister_AcceptPass:
  606.         {
  607.             if(!response)
  608.             {
  609.                 ShowAccountSystemDialog(playerid, dRegister_InputPass);
  610.                 return 1;
  611.             }
  612.             new len = strlen(inputtext);
  613.             if(!len)
  614.             {
  615.                 ShowAccountSystemDialog(playerid, dRegister_AcceptPass);
  616.                 return 1;
  617.             }
  618.             if(strcmp(pInfo[playerid][pPassword], inputtext, false, MAX_PLAYER_PASSWORD))
  619.             {
  620.                 ShowAccountSystemDialog(playerid, dRegister_AcceptPass);
  621.                 SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Пароли не совпадают!");
  622.                 return 1;
  623.             }
  624.             CreatePlayerAccount(playerid);
  625.  
  626.             PlayerAuthorized{playerid} = true;
  627.             new string[19+MAX_PLAYER_NAME+11+14+1];
  628.             format(string, sizeof(string), "%s [ID: %d] %s к серверу.",
  629.                 pNick(playerid), playerid,
  630.                 (IsPlayerMale(playerid) ? ("присоединился") : ("присоединилась")));
  631.             SendClientMessageToAll(-1, string);
  632.             SendClientMessage(playerid, -1, "Регистрация прошла успешно!");
  633.  
  634.             ShowMapListDialog(playerid);
  635.             return 1;
  636.         }
  637.         case dMapList:
  638.         {
  639.             if(!response)
  640.             {
  641.                 ShowMapListDialog(playerid);
  642.                 return 1;
  643.             }
  644.             pInfo[playerid][pMap] = listitem;
  645.             TogglePlayerSpectating(playerid, false);
  646.             StartPlayerGame(playerid);
  647.             return 1;
  648.         }
  649.         case dLogin:
  650.         {
  651.             if(!response)
  652.             {
  653.                 Kick(playerid);
  654.                 return 1;
  655.             }
  656.             if(!strlen(inputtext))
  657.             {
  658.                 ShowAccountSystemDialog(playerid, dLogin);
  659.                 return 1;
  660.             }
  661.  
  662.             if(strcmp(pInfo[playerid][pPassword], inputtext, false, MAX_PLAYER_PASSWORD))
  663.             {
  664.                 new attempt = GetPVarInt(playerid, pVar__AccountLogin_WrongPass)+1;
  665.                 if(attempt < MAX_PASSWORD_ATTEMPT)
  666.                 {
  667.                     SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Пароль набран не правильно. Вы будете кикнуты после "#MAX_PASSWORD_ATTEMPT" попыток!");
  668.                     ShowAccountSystemDialog(playerid, dLogin);
  669.                     SetPVarInt(playerid, pVar__AccountLogin_WrongPass, attempt);
  670.                     return 1;
  671.                 }
  672.                 Kick(playerid);
  673.                 return 1;
  674.             }
  675.             DeletePVar(playerid, pVar__AccountLogin_WrongPass);
  676.  
  677.             new string[19+MAX_PLAYER_NAME+11+14+1];
  678.             format(string, sizeof(string), "%s [ID: %d] %s к серверу.",
  679.                 pNick(playerid), playerid,
  680.                 (IsPlayerMale(playerid) ? ("присоединился") : ("присоединилась")));
  681.             if(pInfo[playerid][pAdmin])
  682.             {
  683.                 SetPlayerColor(playerid, -1);
  684.                 SendClientMessageToAll(0xFF0000FF, string);
  685.             }
  686.             else
  687.             {
  688.                 if(pInfo[playerid][pVip])
  689.                 {
  690.                     SetPlayerColor(playerid, 0xFFA500FF);
  691.                     SendClientMessageToAll(0xFFA500FF, string);
  692.                 }
  693.                 else
  694.                 {
  695.                     SetPlayerColor(playerid, 0xFFFFFFFF);
  696.                     SendClientMessageToAll(0xFFFFFFFF, string);
  697.                 }
  698.             }
  699.             PlayerAuthorized{playerid} = true;
  700.             ShowMapListDialog(playerid);
  701.             return 1;
  702.         }
  703.     }
  704.     return 1;
  705. }
  706.  
  707. stock ShowAccountSystemDialog(playerid, dialogid)
  708. {
  709.     switch(dialogid)
  710.     {
  711.         case dRegister_Rules:
  712.         {
  713.             new dialog_header[15+MAX_SERVER_NAME+1];
  714.             format(dialog_header, sizeof(dialog_header), "Регистрация на %s", ServerInfo[sinfo_ServerName]);
  715.             ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_MSGBOX, dialog_header,
  716.                 "{FFFFFF}\
  717.                     Правила игры на сервере:\n\
  718.                     \n\
  719.                     1) Не убивай.\n\
  720.                     2) Не прелюбодействуй.\n\
  721.                     3) Не кради.\n\
  722.                     4) Не произноси ложного свидетельства на ближнего твоего.\
  723.                 ",
  724.                 "Далее", "Выйти");
  725.         }
  726.         case dRegister_Gender:
  727.         {
  728.             new dialog_header[15+MAX_SERVER_NAME+1];
  729.             format(dialog_header, sizeof(dialog_header), "Регистрация на %s", ServerInfo[sinfo_ServerName]);
  730.             ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_TABLIST_HEADERS, dialog_header,
  731.                 "{FFFFFF}\
  732.                     Укажите пол вашего персонажа:\n\
  733.                     • Мужчина\n\
  734.                     • Женщина\
  735.                 ",
  736.                 "Далее", "Назад");
  737.         }
  738.         case dRegister_InputPass:
  739.         {
  740.             new dialog_header[15+MAX_SERVER_NAME+1];
  741.             format(dialog_header, sizeof(dialog_header), "Регистрация на %s", ServerInfo[sinfo_ServerName]);
  742.             ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, dialog_header,
  743.                 "{FFFFFF}\
  744.                     Придумайте пароль для последующего входа в аккаунт и введите его в поле:\
  745.                 ",
  746.                 "Далее", "Назад");
  747.         }
  748.         case dRegister_AcceptPass:
  749.         {
  750.             new dialog_header[15+MAX_SERVER_NAME+1];
  751.             format(dialog_header, sizeof(dialog_header), "Регистрация на %s", ServerInfo[sinfo_ServerName]);
  752.             ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, dialog_header,
  753.                 "{FFFFFF}\
  754.                     Подтвердите введённый ранее пароль:\
  755.                 ",
  756.                 "Далее", "Назад");
  757.         }
  758.         case dLogin:
  759.         {
  760.             new dialog_string[(55+MAX_PLAYER_NAME)+61+1];
  761.             format(dialog_string, sizeof(dialog_string),
  762.                 "\
  763.                     {FFFFFF}Аккаунт с ником %s найден в базе данных сервера.\n\
  764.                     Для дальнейшего входа введите пароль от аккаунта в окно ниже:\
  765.                 ", pNick(playerid));
  766.             ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_PASSWORD, "Авторизация",
  767.                 dialog_string,
  768.                 "Принять", "Выход");
  769.         }
  770.     }
  771. }
  772.  
  773. stock ShowMapListDialog(playerid)
  774. {
  775.     new dialog_string[8+((MAX_MAP_NAME+1)*MAX_MAPS)+1] = "{FFFFFF}";
  776.     for(new i; i < MAX_MAPS; i++)
  777.     {
  778.         format(dialog_string, sizeof(dialog_string), "%s%s\n", dialog_string, MapName[i]);
  779.     }
  780.     ShowPlayerDialog(playerid, dMapList, DIALOG_STYLE_LIST, "{FFFFFF}Список карт", dialog_string, "Выбрать", "");
  781.     return 1;
  782. }
  783.  
  784. stock StartPlayerGame(playerid)
  785. {
  786.     SendClientMessage(playerid, -1, "");
  787.     SendClientMessage(playerid, -1, "> Игра началась!");
  788.     SendClientMessage(playerid, -1, "> Чтобы сменить карту, нажмите 'Y'");
  789.  
  790.     SetPlayerVirtualWorld(playerid, 0);
  791.     OnPlayerSpawn(playerid);
  792.     return 1;
  793. }
  794.  
  795. stock StopPlayerGame(playerid)
  796. {
  797.     pInfo[playerid][pMap] = INVALID_MAP_ID;
  798.  
  799.     SetPlayerHealth(playerid, FLOAT_INFINITY);
  800.     SetPlayerChatBubble(playerid, "SPAWNED", 0xFF0000FF, SPAWNED_DISTANCE, SPAWNED_TIME);
  801.     ResetPlayerWeapons(playerid);
  802.  
  803.     if(!IsPlayerAttachedObjectSlotUsed(playerid, 0))
  804.         SetPlayerAttachedObject(playerid, 0, 358, 1, 0.199999, -0.139999, 0.050000, 0.500007, -135.000000, 0.000000);
  805.     if(!IsPlayerAttachedObjectSlotUsed(playerid, 1))
  806.         SetPlayerAttachedObject(playerid, 1, 348, 8, -0.079999, -0.039999, 0.109999, -90.100006, 0.000000, 0.000000);
  807.  
  808.     if(pInfo[playerid][pVip])
  809.         OnPlayerStoppedGame(playerid);
  810.     else
  811.         SetTimerEx("OnPlayerStoppedGame", SPAWNED_TIME, false, "i", playerid);
  812.     return 1;
  813. }
  814.  
  815. stock CreateTD__Logo()
  816. {
  817.     tdServerName = TextDrawCreate(569.000000, 436.000000, ServerInfo[sinfo_ServerName]);
  818.     TextDrawBackgroundColor(tdServerName, 255);
  819.     TextDrawFont(tdServerName, 1);
  820.     TextDrawLetterSize(tdServerName, 0.250000, 1.000000);
  821.     TextDrawColor(tdServerName, -1);
  822.     TextDrawSetOutline(tdServerName, 0);
  823.     TextDrawSetProportional(tdServerName, 1);
  824.     TextDrawSetShadow(tdServerName, 1);
  825.     TextDrawSetSelectable(tdServerName, 0);
  826.     return 1;
  827. }
  828.  
  829. @__SkipSKinSelect_SpecOff(playerid);
  830. @__SkipSKinSelect_SpecOff(playerid)
  831. {
  832.     TogglePlayerSpectating(playerid, false),
  833.     PlayerSkipSkinSelectF4Bug{playerid}++;
  834. }
  835.  
  836. stock IsPlayerMale(playerid)
  837. {
  838.     return (pInfo[playerid][pGender] == 'М');
  839. }
  840.  
  841.  
  842. @__AntiSpawnKillDisable(playerid);
  843. @__AntiSpawnKillDisable(playerid)
  844. {
  845.     SetPlayerHealth(playerid, 100.0);
  846.     GivePlayerWeapon(playerid, WEAPON_DEAGLE, 99999);
  847.     GivePlayerWeapon(playerid, WEAPON_SNIPER, 99999);
  848.     SetPlayerArmedWeapon(playerid, WEAPON_SNIPER);
  849.     return 1;
  850. }
  851.  
  852. @__KillCamDisable(playerid);
  853. @__KillCamDisable(playerid)
  854. {
  855.     return TogglePlayerSpectating(playerid, false);
  856. }
  857.  
  858.  
  859. forward OnPlayerStoppedGame(playerid);
  860. public OnPlayerStoppedGame(playerid)
  861. {
  862.     TogglePlayerSpectating(playerid, true);
  863.     SetPlayerVirtualWorld(playerid, 1);
  864.     ShowMapListDialog(playerid);
  865.     return 1;
  866. }
Advertisement
Add Comment
Please, Sign In to add comment