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

    Статус
    Оффлайн
    Регистрация
    16.01.2015
    Сообщений
    32
    Репутация:
    0 ±

    Оптимизация кода

    Здравствуйте, подскажите пожалуйста, каким способом можно можно оптимизировать данный код:

    PHP код:
    new string[54 MAX_PLAYER_NAME];
    switch(
    Kills[killerid])
    {
        case 
    50format(string,sizeof(string),"%s(%d) убил '50' человек и получает 50 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string), GivePlayerMoney(killerid,Kills[killerid]*1000);
        case 
    100format(string,sizeof(string),"%s(%d) убил '100' человек и получает 100 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string), GivePlayerMoney(killerid,Kills[killerid]*1000);
        case 
    150format(string,sizeof(string),"%s(%d) убил '150' человек и получает 150 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string), GivePlayerMoney(killerid,Kills[killerid]*1000);
        case 
    200format(string,sizeof(string),"%s(%d) убил '200' человек и получает 200 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
        case 
    250format(string,sizeof(string),"%s(%d) убил '250' человек и получает 250 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
        case 
    300format(string,sizeof(string),"%s(%d) убил '300' человек и получает 300 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
        case 
    350format(string,sizeof(string),"%s(%d) убил '350' человек и получает 350 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
        case 
    400format(string,sizeof(string),"%s(%d) убил '400' человек и получает 400 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
        case 
    500format(string,sizeof(string),"%s(%d) убил '500' человек и получает 500 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
        case 
    600format(string,sizeof(string),"%s(%d) убил '600' человек и получает 600 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
        case 
    700format(string,sizeof(string),"%s(%d) убил '700' человек и получает 700 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
        case 
    800format(string,sizeof(string),"%s(%d) убил '800' человек и получает 800 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
        case 
    900format(string,sizeof(string),"%s(%d) убил '900' человек и получает 900 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
        case 
    1000format(string,sizeof(string),"%s(%d) убил '1000' человек и получает 1 000 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
           case 
    1500format(string,sizeof(string),"%s(%d) убил '1500' человек и получает 1 500 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
        case 
    2000format(string,sizeof(string),"%s(%d) убил '2000' человек и получает 2 000 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);


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

    Статус
    Оффлайн
    Регистрация
    23.12.2016
    Адрес
    Казахстан
    Сообщений
    148
    Репутация:
    26 ±
    PHP код:
    new string[54 MAX_PLAYER_NAME];
    format(string,sizeof(string),"%s(%d) убил '%d' человек и получает %d$",PlayerInfo[killerid][pName], playeridKills[killerid], Kills[killerid] * 1000);
    SendClientMessageToAll(orange,string); 
    GivePlayerMoney(killerid,Kills[killerid]*1000); 

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

    Статус
    Оффлайн
    Регистрация
    16.01.2015
    Сообщений
    32
    Репутация:
    0 ±
    Цитата Сообщение от Seviel Посмотреть сообщение
    PHP код:
    new string[54 MAX_PLAYER_NAME];
    format(string,sizeof(string),"%s(%d) убил '%d' человек и получает %d$",PlayerInfo[killerid][pName], playeridKills[killerid], Kills[killerid] * 1000);
    SendClientMessageToAll(orange,string); 
    GivePlayerMoney(killerid,Kills[killerid]*1000); 
    Тогда сработает при каждом убийстве, а мне нужно чтобы через определенный промежуток

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

    Статус
    Оффлайн
    Регистрация
    23.12.2016
    Адрес
    Казахстан
    Сообщений
    148
    Репутация:
    26 ±
    Каждые 50 убийств.
    PHP код:
    if(Kills[killerid] % 50 == 0)
    {
        new 
    string[54 MAX_PLAYER_NAME]; 
        
    format(string,sizeof(string),"%s(%d) убил '%d' человек и получает %d$",PlayerInfo[killerid][pName], playeridKills[killerid], Kills[killerid] * 1000); 
        
    SendClientMessageToAll(orange,string);  
        
    GivePlayerMoney(killerid,Kills[killerid]*1000);  


  5. Пользователь сказал cпасибо:
    Nexius_Tailer (12.02.2017)
  6. #5
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Не проверял, но, надеюсь, основную идею (список значений в одном case) поймёте:
    PHP код:
    switch(Kills[killerid])
    {
        case 
    50100150200250300350400500600700800900100015002000:
        {
            static const 
    fmt_str[] = "%s(%d) убил '%d' человек и получает %d$";
            new 
    string[sizeof(fmt_str) + (-2+MAX_PLAYER_NAME) + (-2+5) + (-2+4) + (-2+7)];
            new 
    kills Kills[killerid];
            new 
    reward kills 1000;
            
    format(stringsizeof(string), fmt_strPlayerInfo[killerid][pName], killeridkillsreward);
            
    SendClientMessageToAll(orangestring);
            
    GivePlayerMoney(killeridreward);
        }

    Про подсчёт размера массива string см. здесь.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. Пользователь сказал cпасибо:
    Эдуард (13.02.2017)
  8. #6
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Ок. Я так скажем олдовый игрок: у меня 20000 убийств и ты предлагаешь всех их перечислять в ручную? Почем не через остаток от деления?

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Не проверял, но, надеюсь, основную идею (список значений в одном case) поймёте:
    PHP код:
    switch(Kills[killerid])
    {
        case 
    50100150200250300350400500600700800900100015002000:
        {
            static const 
    fmt_str[] = "%s(%d) убил '%d' человек и получает %d$";
            new 
    string[sizeof(fmt_str) + (-2+MAX_PLAYER_NAME) + (-2+5) + (-2+4) + (-2+7)];
            new 
    kills Kills[killerid];
            new 
    reward kills 1000;
            
    format(stringsizeof(string), fmt_strPlayerInfo[killerid][pName], killeridkillsreward);
            
    SendClientMessageToAll(orangestring);
            
    GivePlayerMoney(killeridreward);
        }

    Про подсчёт размера массива string см. здесь.
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  9. #7
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    Ок. Я так скажем олдовый игрок: у меня 20000 убийств и ты предлагаешь всех их перечислять в ручную? Почем не через остаток от деления?
    Смысл в том, что при использовании данной операции будут считываться все числа, делящиеся на 50. Допустим, что в переменной Kills хранится значение 950 (либо любое другое число, которого нет в списке у ТС), которое также делится на 50 без остатка. Проверка сочтёт это число как правильное и вызовет все нужные функции и т.п. Однако в варианте ТС число 950 отсутствует, что говорит о нарушении логики.
    Последний раз редактировалось VVWVV; 13.02.2017 в 01:11.

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

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Ну это как бы логики вообще нет. Сначала идет +50, а потом +100. нормально живем =)
    Та и это тоже исправляется через if
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Смысл в том, что при использовании данной операции будут считываться все числа, делящиеся на 50. Допустим, что в переменной Kills хранится значение 950 (либо любое другое число, которого нет в списке у ТС), которое также делится на 50 без остатка. Проверка сочтёт это число как правильное и вызовет все нужные функции и т.п. Однако в варианте ТС число 950 отсутствует, что говорит о нарушении логики.
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

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

    Статус
    Оффлайн
    Регистрация
    23.12.2016
    Адрес
    Казахстан
    Сообщений
    148
    Репутация:
    26 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Смысл в том, что при использовании данной операции будут считываться все числа, делящиеся на 50. Допустим, что в переменной Kills хранится значение 950 (либо любое другое число, которого нет в списке у ТС), которое также делится на 50 без остатка. Проверка сочтёт это число как правильное и вызовет все нужные функции и т.п. Однако в варианте ТС число 950 отсутствует, что говорит о нарушении логики.
    А что мешает вам сделать так?

    PHP код:
    if((Kills[killerid] % 50 == && Kills[killerid] <= 900) || Kills[killerid] % 100 == 0// - Логика наверное понятна
    {
        new 
    string[54 MAX_PLAYER_NAME]; 
        
    format(string,sizeof(string),"%s(%d) убил '%d' человек и получает %d$",PlayerInfo[killerid][pName], playeridKills[killerid], Kills[killerid] * 1000); 
        
    SendClientMessageToAll(orange,string);  
        
    GivePlayerMoney(killerid,Kills[killerid]*1000);  

    На все проблемы, есть свои костыли.
    (с) Seviel
    Когда писал это сообщение не видел что $continue$ отредактировал своё сообщение, прошу прощения
    Последний раз редактировалось Seviel; 13.02.2017 в 01:22.

  12. #10
    Аватар для Эдуард
    Пользователь

    Статус
    Оффлайн
    Регистрация
    16.01.2015
    Сообщений
    32
    Репутация:
    0 ±
    Спасибо ребята, реально помогли:)

 

 

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

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

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

Ваши права

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