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

Запись кординат

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

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

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

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

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

Запись кординат

Сообщение Eternal » 10 сен 2017, 09:59

Всем привет. Подскажите как записать в txt координаты местоположения игрока.
не знаю как оформить
format(name, x,y,z)
Аватара пользователя
Eternal
 
Сообщения: 17
Зарегистрирован: 23 янв 2017, 08:49
Благодарил (а): 9 раз.
Поблагодарили: 0 раз.
Языки программирования: Php

Re: Запись кординат

Сообщение Subb98 » 10 сен 2017, 10:02

Так, например:

Код: Выделить всё
fprintf(pfile"%s %f %f %f"nameforigin[0], forigin[1], forigin[2]); 
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 4838
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1272 раз.
Поблагодарили: 2186 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn, PHP

Re: Запись кординат

Сообщение Eternal » 10 сен 2017, 15:22

Укажите на ошибки пожалуйста.
На данный момент ругается на
Error: Undefined symbol "forigin" on line 38
Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <fun>  

new  Origin[33][3]

public 
plugin_init()

{

        
register_plugin("z""z""z");
    
        
register_clcmd("say /save","position")     
}

public  
positionid )

{

        new 
file;

        
file fopen("addons/amxmodx/configs/position.txt""a+");

        if(!
file)

                return;

       
Origin[id][0] = 
       Origin
[id][1] = 
       Origin
[id][2] = 0
       
        
new player_name[32];         

       
get_user_origin(id,Origin[id],0)     
    
        
get_user_name(idplayer_name31) ;
   
        
fprintf(file"%s %f %f %f"player_nameforigin[0], forigin[1], forigin[2]);
    
}

 
Аватара пользователя
Eternal
 
Сообщения: 17
Зарегистрирован: 23 янв 2017, 08:49
Благодарил (а): 9 раз.
Поблагодарили: 0 раз.
Языки программирования: Php

Re: Запись кординат

Сообщение NEoMASTERR » 10 сен 2017, 15:24

Замените строку fprintf на
Код: Выделить всё
fprintf(file"%s %d %d %d"player_nameOrigin[0], Origin[1], Origin[2]); 
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 186 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Запись кординат

Сообщение Subb98 » 10 сен 2017, 15:25

Код: Выделить всё
fprintf(file, "%s %f %f %f", player_name, forigin[0], forigin[1], forigin[2]);

>>

Код: Выделить всё
fprintf(file, "%s %f %f %f", player_name, Origin[id][0], Origin[id][1], Origin[id][2]);

П.с.: для чего было делать Origin глобальной переменной, мне решительно неясно.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 4838
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1272 раз.
Поблагодарили: 2186 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn, PHP

Re: Запись кординат

Сообщение Eternal » 10 сен 2017, 15:31

Subb98 писал(а):
Код: Выделить всё
fprintf(file, "%s %f %f %f", player_name, forigin[0], forigin[1], forigin[2]); 

>>

Код: Выделить всё
fprintf(file, "%s %f %f %f", player_name, Origin[id][0], Origin[id][1], Origin[id][2]); 

П.с.: для чего было делать Origin глобальной переменной, мне решительно неясно.


Пока не особо смыслю в amxx. Так что код можно обзывать высером и прочим бредом из набора цифр и букв. Глобальная пременная вот эта строка ? new Origin[33][3] либо Origin[id][0] = 0 .....
Аватара пользователя
Eternal
 
Сообщения: 17
Зарегистрирован: 23 янв 2017, 08:49
Благодарил (а): 9 раз.
Поблагодарили: 0 раз.
Языки программирования: Php

Re: Запись кординат

Сообщение RevCrew » 10 сен 2017, 15:39

Eternal, прочитайте про глобальные переменные, в инете инфы много.
Вкратце глобальная которая объявляется вне функций. Если в функции то локальная
Skype revcrew77
https://vk.com/cssuite
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1354
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 240 раз.
Поблагодарили: 276 раз.
Языки программирования: Unkown

Re: Запись кординат

Сообщение Eternal » 10 сен 2017, 18:38

Вот что примерно получилось. Но есть ещё вопросы.
При дисконекте последнее месторасположение игрока записывается в колонку с ником этого игрока.
При повторной попытки эти данные должны будут обновится. Но я опять, что то делаю не так и у меня выходит вот так.
player -834 -1792 -283
player 138 296 -539

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

 new  Origin[33][3]
 new q[33] = {0, ...};

public plugin_init()

{
        register_plugin("z", "z", "z");
 
}

public  client_disconnect( id )

{
        new file;
        new pos;    
        new bool
:client_is_found;
        new player_name[32], buffer[64];     
        new fplayer_name
[32], fwdata[64];
    

        file 
= fopen("addons/amxmodx/configs/position.txt", "a+");

        if(!file)

        return;
           
       get_user_name
(id, player_name,charsmax(player_name));

       get_user_origin(id,Origin[id],0);    

       format
(fwdata, charsmax(fwdata), "%s %d %d %d", player_name, Origin[id][0], Origin[id][1], Origin[id][2]);
       
       while
(!feof(file))

        {

       pos++;

       buffer[0] = '^0';    
        
       fgets
(file, buffer, charsmax(buffer));

       if(strlen(buffer) < 4)

                        continue;

       if(strcmp(player_name, fplayer_name) == 0)

                {

                        client_is_found = true;

                        write_file("addons/amxmodx/configs/position.txt", "", pos - 1);

                        write_file("addons/amxmodx/configs/position.txt", fwdata, pos - 1);

                        break;

                }

        }
    
       if
(!client_is_found)

                write_file("addons/amxmodx/configs/position.txt", fwdata);

       fclose(file);

       client_is_found = false;

       q[id] = 0;
    
}

public client_putinserver(id) 
{ 
Origin
[id][0] = 0 
Origin
[id][1] = 0 
Origin
[id][2] = 0 

if(q[id])

                return;

new file;

file = fopen("addons/amxmodx/configs/position.txt", "rt");

if(!
file)

                return;

new buffer[64];
new player_name[32];
new fplayer_name[32];

get_user_name(id, player_name, charsmax(player_name));

while(!
feof(file))

        {

buffer[0] = '^0';

fgets(file, buffer, charsmax(buffer));

if(
strlen(buffer) < 2)

                        continue;

if(
strcmp(fplayer_name, player_name) == 0)

                {
Origin[id][0] = str_to_num(Origin[id][0]);

set_user_origin (id, Origin[id]);

break;

                }
        }

fclose(file);

q[id] = 1;
}
 

Аватара пользователя
Eternal
 
Сообщения: 17
Зарегистрирован: 23 янв 2017, 08:49
Благодарил (а): 9 раз.
Поблагодарили: 0 раз.
Языки программирования: Php

Re: Запись кординат

Сообщение NEoMASTERR » 10 сен 2017, 18:40

Можете сразу нужную строку записывать на то место, вместо записывания пустой
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 186 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Запись кординат

Сообщение артист666 » 10 сен 2017, 20:14

Eternal, Для каких целей нужно сохранение?
Если для детрана, типа при перезаходе игрока чтобы он появлялся на том же месте, запись в файл не очень подходит.
Есть динамические массивы, они быстрее и менее затратны.

Для корректной замены строки в файле, нужно создать копию, в ней заменить строку, удалить старый, сохранить(переименовать) новый.

Нашел:
Код: Выделить всё
stock replace_str_to_file(filename[], what[], with[])
{
        if(!
file_exists(filename)) return -1
       
        
static filefile fopen(filename"rt")
        static 
sizesize file_size(filename1)
        static 
buffer[512], iline= -1
        
static bool:retret false
        
static Array:array; array = ArrayCreate(512)
       
        while(++
size)
        {
                
fgets(filebuffercharsmax(buffer))
               
                if(
ret || !equal(bufferwhat))
                {
                        
ArrayPushString(array, buffer)
                        continue
                }
                
ret true
                line 
i
                ArrayPushString
(array, with)
        }
        
fclose(file)
       
        if(!
ret)
        {
                
ArrayDestroy(array)
                return 
0
        
}
        
file fopen(filename"wt"); = -1
       
        
while(++size)
        {
                
ArrayGetString(array, ibuffercharsmax(buffer))
                
fputs(filebuffer)
        }
        
fclose(file)
        
ArrayDestroy(array)
        return 
line

Не утверждаю, что самый лучший вариант, писал давно.
Тут можно сразу записывать в новый...
Если вы хотите чему-то научиться, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2387
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 279 раз.
Поблагодарили: 531 раз.
Опыт программирования: Больше трех лет

След.

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

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

Сейчас этот форум просматривают: Bing [Bot], Google [Bot] и гости: 4