Русское сообщество по скриптингу

не правильный отсчет времени  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

не правильный отсчет времени

Сообщение nemec21 » 16 апр 2017, 00:56

Доброй ночи. переделал под себя демо рекордер, засунул таймер отсчета времени
Подскажите пожалуйста, от переменной отнимается чего то 3 и получается не то что хотелось бы :-)

Код: Выделить всё
#include <amxmodx> 
#include <amxmisc>

#define TASK 100           
                                                  
new RecorD[][] = {"Я, согласен""Я, против"}
new 
key 1023        
new name[32]                 
new 
g_time        
                                                         
public plugin_init(){                                     
    
register_plugin("RecordingDemo""1.0""Titam19")
    
    
register_menu("Menu"key"MenuFunc")
}

public 
client_disconnect(id){
    
remove_task(id TASK)
}
                                                       
public 
client_putinserver(id){ 
    if(!
is_user_connected(id))                
        return                  
    if(
task_exists(id TASK)){
        
remove_task(id TASK)     
    }                                          
    
    
g_time 15 
                          
    set_task
(1.0"nenuRecord"id TASK, .flags "b")
}                                                 
                                            
public 
nenuRecord(id){     
    
id id TASK
                         
    
if(g_time 0){             
        
g_time--
        
        static 
menu[300], lenikeys                  
        get_user_name
(idnamecharsmax(name)) 
                                                
        
len formatex(menucharsmax(menu), "\r%s:^n\dзаписываем демо?^nна голосование\y %d\d сек^nиначе будешь кикнут^n^n"nameg_time
        
        for (
0sizeof RecorDi++){                                                      
            
len += formatex(menu[len], charsmax(menu) - len"\r%d. \w%s^n"1RecorD[i])
            
keys |= (1<<i)
        }                            
        
show_menu(idkeysmenu15"Menu")
    }
                           
    else {
        
server_cmd("kick #%d ^"запись DEMO обязательна^""get_user_userid(id))
    }
}                                                      
                                                 
public 
MenuFunc(idkey){ 
    
get_user_name(idnamecharsmax(name))
    
    switch(
key){                     
        case 
0: {                                 
            
client_cmd(id"stop; record ^"Immortal_classic_18+.dem^"")             
        }                                                                             
        case 
1: {
            
server_cmd("kick #%d ^"запись DEMO обязательна^""get_user_userid(id))
            
ChatColor(0,"^4%s^1, отказался от запист демо, и был кикнут с сервера"name)
        }
    }                 
}                                                                                                                                                                                            
                                                                                                                            
stock ChatColor(const id, const input[], any:...){
    new 
count 1players[32]
    static 
msg[191]
    
vformat(msg190input3)
    
    
replace_all(msg190"!g""^4")
    
replace_all(msg190"!y""^1")
    
replace_all(msg190"!t""^3")                       
    
    if (
idplayers[0] = id; else get_players(playerscount"ch");{
        for (new 
0counti++){
            if (
is_user_connected(players[i])){
                
message_begin(MSG_ONE_UNRELIABLEget_user_msgid("SayText"), _players[i])
                
write_byte(players[i])
                
write_string(msg)
                
message_end()
            }
        }
    }
}  
Аватара пользователя
nemec21
 
Сообщения: 799
Зарегистрирован: 07 фев 2016, 17:08
Откуда: Беларусь
Благодарил (а): 212 раз.
Поблагодарили: 44 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Re: не правильный отсчет времени

Сообщение jjey1 » 16 апр 2017, 03:40

set_task(1.0, "nenuRecord", id + TASK, .flags = "b")
---->
set_task(1.1, "nenuRecord", id + TASK, .flags = "b")
skype: tatoxa80
Аватара пользователя
jjey1
 
Сообщения: 199
Зарегистрирован: 08 мар 2016, 18:32
Забанен
Благодарил (а): 39 раз.
Поблагодарили: 9 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike 1.6

Re: не правильный отсчет времени  [Решено]

Сообщение Chuvi » 16 апр 2017, 05:35

nemec21,
Код: Выделить всё
id + TASK
id 
- TASK

Зачем? Вы очень любите лишние арифметические операции?
(ну, вообще многие так делают, даже не задумываясь, собственно, нафига. Но мы это опустим)
Это актуально, когда в плагине используется несколько типов тасков. В вашем же случае - просто передавайте ID игрока.
И я не вижу, где у вас снимается задача, если игрок согласился записывать демо? Или пусть себе дальше выполняется? (А вообще, лучше сразу задать 15 повторений, а не бесконечное кол-во)

Код: Выделить всё
if(task_exists(id + TASK))
- не нужен. в remove_task уже есть эта проверка.
В таком случае странно, что вы не проверяете существование такска в client_disconnect. Если мне память не изменяет, он может вызываться и без вызова client_putinserver.

У вас g_time общая для всех игроков. В итоге получается: заходит один игрок, g_time вычитается по 1 в секунду.
Потом заходит второй игрок. g_time снова = 15, но вычитается теперь по 2 в секунду.
Потом заходит 3-й игрок... и так далее
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

Re: не правильный отсчет времени

Сообщение nemec21 » 16 апр 2017, 08:30

И я не вижу, где у вас снимается задача, если игрок согласился записывать демо? Или пусть себе дальше выполняется? (А вообще, лучше сразу задать 15 повторений, а не бесконечное кол-во)

а не достаточно его закрывать при дисконекте7????

Код: Выделить всё
new g_time[33
спасибо, вылетело из головы что таск всем)))
И еще один вопрос, если игрок написал стоп демо, можно ли отловить это?????

Код: Выделить всё
#include <amxmodx> 
#include <amxmisc>                      

#define TIMER 15 //таймер отсчета времени         
   
new RecorD
[][] = {"Я, согласен", "Я, против"}
new key = 1023                 
new name
[32], g_time[33]                                                       

public plugin_init
(){                                     
    register_plugin
("RecordingDemo", "1.0", "....")
    
    register_menu
("Menu", key, "MenuFunc")                  
}
                                                     
public client_disconnect
(id){                                                                         
    remove_task
(id)                                                       
}

public client_putinserver(id){
    if(!is_user_connected(id))                                                                     
        return                                  
                   
    set_task
(3.0, "TASK", id)    
}
 
public TASK
(id){                                      
    if
(!is_user_connected(id))                                                                     
        return                                   
                                           
    g_time
[id] = TIMER                                                                      
    set_task
(1.0, "nenuRecord", id, .flags = "b")
}
                                                 

public nenuRecord
(id){               
    if
(g_time[id] > 1){             
        g_time
[id]--
                                                                             
        static menu
[300], len, i, keys                                                          
        get_user_name
(id, name, charsmax(name))                          
 
        len 
= formatex(menu, charsmax(menu), g_time[id] % 2 ? "\r%s:^n\dна выбор\y %d\d сек^n^nзаписываем демо?^n^n" : "\r%s:^n\dна выбор\y %d\d сек \r[ \ykick \r]^n^n\dзаписываем демо?^n^n", name, g_time[id]) 

        for
(= 0; i < sizeof RecorD; i++){                                                      
            len 
+= formatex(menu[len], charsmax(menu) - len, "\r%d. \w%s^n", i + 1, RecorD[i])
            keys |= (1<<i)
        }                            
        show_menu
(id, keys, menu, 15, "Menu")
    }                                                               
                                                       
    else 
{
        server_cmd("kick #%d ^"время вышло, пробуйте еще раз^"", get_user_userid(id))
    }
}
                                                      

public MenuFunc
(id, key){                                           
    get_user_name
(id, name, charsmax(name))

    switch(key){                     
        case 0
: {                                                                              
            client_cmd
(id, "stop; record ^"Immortal_classic_18+.dem^"")
            remove_task(id)
        }                                                                             
        case 1
: {
            server_cmd("kick #%d ^"запись DEMO обязательна^"", get_user_userid(id))
            ChatColor(0,"^4%s^1, отказался от запист демо, и был кикнут с сервера", name)
        }
    }                 
}                                                                                                                                                                                            

stock ChatColor
(const id, const input[], any:...){
    new count = 1, players[32]
    static msg[191]
    vformat(msg, 190, input, 3)
    
    replace_all
(msg, 190, "!g", "^4")
    replace_all(msg, 190, "!y", "^1")
    replace_all(msg, 190, "!t", "^3")                       
    
    if 
(id) players[0] = id; else get_players(players, count, "ch");{
        for (new i = 0; i < count; i++){
            if (is_user_connected(players[i])){
                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
                write_byte(players[i])
                write_string(msg)
                message_end()
            }
        }
    }
}
Аватара пользователя
nemec21
 
Сообщения: 799
Зарегистрирован: 07 фев 2016, 17:08
Откуда: Беларусь
Благодарил (а): 212 раз.
Поблагодарили: 44 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Re: не правильный отсчет времени

Сообщение Chuvi » 16 апр 2017, 12:31

nemec21 писал(а):а не достаточно его закрывать при дисконекте7????

А зачем его выполнять, когда он уже не нужен?

nemec21 писал(а):И еще один вопрос, если игрок написал стоп демо, можно ли отловить это?????

Нельзя отловить команды, которые не уходят с игрока на сервер. Начало записи демки ещё можно отловить по косвенным признакам (там fullupdate должен прилететь, и то не показатель), а остановку записи никак не отловишь.
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.


Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13