[FilterScript] Подвижные метки игроков на карте в зоне 51
#1

Метки игроков в зоне 51

Автор: Bombo
Версия: 2.0



Версия 2.0
[+] Ники игроков
[@] Исправлен баг с неправильным положением маркера
[@] Исправлен баг при обновлении отображения маркеров



Версия 2.0


Версия 1.0


Длинный маркер - игрок
Короткий маркер - NPC


v2.0
PHP Code:
//Map markers by Bombo
//v2.0
#define FILTERSCRIPT
#include <a_samp>
#include <streamer>
#define ZONE_MARK_INTERVAL 5000
new gPlayerMarker[MAX_PLAYERS];
new 
Text3D:gMarkerText[MAX_PLAYERS];
new 
gTimerPlayerZoneMark;
forward update_player_zone_mark();
#if defined FILTERSCRIPT
public OnFilterScriptInit()
{
    new 
i;
    
    print(
"\n--------------------------------------");
    print(
" Map markers in Area 51 by Bombo");
    print(
"--------------------------------------\n");
    for(
0MAX_PLAYERS; ++i)
    {
        
gPlayerMarker[i] = INVALID_OBJECT_ID;
    }
    
    
gTimerPlayerZoneMark SetTimer("update_player_zone_mark"ZONE_MARK_INTERVALtrue);
    return 
1;
}
public 
OnFilterScriptExit()
{
    new 
i;
    
    
KillTimer(gTimerPlayerZoneMark);
    for(
0MAX_PLAYERS; ++i)
    {
        if(
gPlayerMarker[i] != INVALID_OBJECT_ID)
        {
            
DestroyDynamicObject(gPlayerMarker[i]);
            
gPlayerMarker[i] = INVALID_OBJECT_ID;
            if(!
IsPlayerNPC(i))
            {
                if(
IsValidDynamic3DTextLabel(gMarkerText[i]))
                    
DestroyDynamic3DTextLabel(gMarkerText[i]);
            }
        }
    }
    return 
1;
}
#else
main()
{
    print(
"\n----------------------------------");
    print(
" Map markers in Area 51 by Bombo");
    print(
"----------------------------------\n");
}
#endif
public OnGameModeInit()
{
    
// Don't use these lines if it's a filterscript
    
SetGameModeText("Blank Script");
    
AddPlayerClass(01958.37831343.157215.3746269.1425000000);
    return 
1;
}
public 
OnGameModeExit()
{
    return 
1;
}
public 
OnPlayerRequestClass(playeridclassid)
{
    
SetPlayerPos(playerid1958.37831343.157215.3746);
    
SetPlayerCameraPos(playerid1958.37831343.157215.3746);
    
SetPlayerCameraLookAt(playerid1958.37831343.157215.3746);
    return 
1;
}
public 
OnPlayerConnect(playerid)
{
    return 
1;
}
public 
OnPlayerDisconnect(playeridreason)
{
    if(
gPlayerMarker[playerid] != INVALID_OBJECT_ID)
    {
        
DestroyDynamicObject(gPlayerMarker[playerid]);
        
gPlayerMarker[playerid] = INVALID_OBJECT_ID;
        if(!
IsPlayerNPC(playerid))
            if(
IsValidDynamic3DTextLabel(gMarkerText[playerid]))
                
DestroyDynamic3DTextLabel(gMarkerText[playerid]);
    }
    return 
1;
}
//area 51 markers
public update_player_zone_mark()
{
    new 
ijcolFloat:height;
    new 
Float:xFloat:yFloat:z;
    new 
Float:x0Float:y0Float:z0Float:pathFloat:speed;
    new 
name[64];
    static 
Float:MarkerXY[MAX_PLAYERS][2];
    for(
0MAX_PLAYERS; ++i)
    {
        if(
IsPlayerConnected(i))
        {
            
strdel(name0sizeof(name)-1);
            
GetPlayerName(inamesizeof(name));
            
col GetPlayerColor(i);
            
GetPlayerPos(ixyz);
            if(
3000.03000.0;
            if(
< -3000.0)= -3000.0;
            if(
3000.03000.0;
            if(
< -3000.0= -3000.0;
               for(
0height 0.0i; ++j)
            {
                if(
IsPlayerInRangeOfPoint(j200xyz))
                    
height floatadd(height0.04);
            }
            
col = (col>>8)|(0xFF000000);
            
floatsub(221.7,floatmul(3.45,floatdiv(floatadd(3000.0,y),6000.0)));
            
floatadd(1821.1,floatmul(3.45,floatdiv(floatadd(3000.0,x),6000.0)));
            if(
gPlayerMarker[i] != INVALID_OBJECT_ID)
            {
                
GetDynamicObjectPos(gPlayerMarker[i], y0x0z0);
                
path VectorSize(y0-yx0-x0);
                
speed floatdiv(path,floatdiv(ZONE_MARK_INTERVAL.0,1200.0));
                if(
IsPlayerNPC(i))
                    
MoveDynamicObject(gPlayerMarker[i], yx6.81speed);
                else
                {
                    
MoveDynamicObject(gPlayerMarker[i], yx7.41speed);
                    if(
VectorSize(MarkerXY[i][0]-xMarkerXY[i][1]-y0) > 0.03)
                    {
                        if(
IsValidDynamic3DTextLabel(gMarkerText[i]))
                            
DestroyDynamic3DTextLabel(gMarkerText[i]);
                        
gMarkerText[i] = CreateDynamic3DTextLabel(nameGetPlayerColor(i), yxfloatadd(7.51,height), 7.0INVALID_PLAYER_IDINVALID_VEHICLE_ID1);
                        
MarkerXY[i][0] = x;
                        
MarkerXY[i][1] = y;
                    }
                }
            }
            else
            {
                if(
IsPlayerNPC(i))
                    
gPlayerMarker[i] = CreateDynamicObject(2590yx6.81000);
                else
                {
                    
gPlayerMarker[i] = CreateDynamicObject(2590yx7.41000);
                    
gMarkerText[i] = CreateDynamic3DTextLabel(nameGetPlayerColor(i), yxfloatadd(7.51,height), 7.0INVALID_PLAYER_IDINVALID_VEHICLE_ID1);
                }
                if(
gPlayerMarker[i] != INVALID_OBJECT_ID)
                    
SetDynamicObjectMaterial(gPlayerMarker[i], 010770"carrier_sfse""ws_shipmetal4"col);
            }
        }
    }
    for(
0MAX_PLAYERS; ++j)
    {
        if(!
IsPlayerConnected(j))
            continue;
        if(
IsPlayerInRangeOfPoint(j10.022018227.4))
        {
            
GetPlayerPos(jxyz);
            
SetPlayerPos(jfloatadd(x,0.00001), yz);
        }
    }

v1.0
PHP Code:
//Map marker by Bombo
//v1.0
#define FILTERSCRIPT
#include <a_samp>
#include <streamer>
#define ZONE_MARK_INTERVAL 5000
new gPlayerMarker[MAX_PLAYERS];
new 
gTimerPlayerZoneMark;
forward update_player_zone_mark();
#if defined FILTERSCRIPT
public OnFilterScriptInit()
{
    new 
i;
    
    print(
"\n--------------------------------------");
    print(
" Map marker in Zone 51 by Bombo");
    print(
"--------------------------------------\n");
    
    for(
0MAX_PLAYERS; ++i)
    {
        
gPlayerMarker[i] = INVALID_OBJECT_ID;
    }
    
    
gTimerPlayerZoneMark SetTimer("update_player_zone_mark"ZONE_MARK_INTERVALtrue);
    return 
1;
}
public 
OnFilterScriptExit()
{
    new 
i;
    
     
KillTimer(gTimerPlayerZoneMark);
    for(
0MAX_PLAYERS; ++i)
    {
        if(
gPlayerMarker[i] != INVALID_OBJECT_ID)
        {
            
DestroyDynamicObject(gPlayerMarker[i]);
            
gPlayerMarker[i] = INVALID_OBJECT_ID;
        }
    }
    return 
1;
}
#else
main()
{
    print(
"\n----------------------------------");
    print(
" Map marker in Zone 51 by Bombo");
    print(
"----------------------------------\n");
}
#endif
public OnGameModeInit()
{
    
// Don't use these lines if it's a filterscript
    
SetGameModeText("Blank Script");
    
AddPlayerClass(01958.37831343.157215.3746269.1425000000);
    return 
1;
}
public 
OnGameModeExit()
{
    return 
1;
}
public 
OnPlayerRequestClass(playeridclassid)
{
    
SetPlayerPos(playerid1958.37831343.157215.3746);
    
SetPlayerCameraPos(playerid1958.37831343.157215.3746);
    
SetPlayerCameraLookAt(playerid1958.37831343.157215.3746);
    return 
1;
}
public 
OnPlayerConnect(playerid)
{
    return 
1;
}
public 
OnPlayerDisconnect(playeridreason)
{
    if(
gPlayerMarker[playerid] != INVALID_OBJECT_ID)
    {
        
DestroyDynamicObject(gPlayerMarker[playerid]);
        
gPlayerMarker[playerid] = INVALID_OBJECT_ID;
    }
    return 
1;
}
//zone 51 markers
public update_player_zone_mark()
{
    new 
ijcol;
    new 
Float:xFloat:yFloat:z;
    new 
Float:x0Float:y0Float:z0Float:pathFloat:speed;
    for(
0MAX_PLAYERS; ++i)
    {
        if(
IsPlayerConnected(i))
        {
            
col GetPlayerColor(i);
            
GetPlayerPos(ixyz);
            if(
3000.03000.0;
            if(
< -3000.0)= -3000.0;
            if(
3000.03000.0;
            if(
< -3000.0= -3000.0;
            
col = (col>>8)|(0xFF000000);
            
221.7 3.45*((3000.0 y)/6000.0);
            
1821.1 3.45*((3000.0 x)/6000.0);
            if(
gPlayerMarker[i] != INVALID_OBJECT_ID)
            {
                
GetDynamicObjectPos(gPlayerMarker[i], y0x0z0);
                
path VectorSize(y0-yx0-x0);
                
speed path/(ZONE_MARK_INTERVAL/1000.0);
                if(
IsPlayerNPC(i))
                    
MoveDynamicObject(gPlayerMarker[i], yx6.81speed);
                else
                    
MoveDynamicObject(gPlayerMarker[i], yx7.41speed);
            }
            else
            {
                if(
IsPlayerNPC(i))
                    
gPlayerMarker[i] = CreateDynamicObject(2590yx6.81000);
                else
                    
gPlayerMarker[i] = CreateDynamicObject(2590yx7.41000);
                if(
gPlayerMarker[i] != INVALID_OBJECT_ID)
                    
SetDynamicObjectMaterial(gPlayerMarker[i], 010770"carrier_sfse""ws_shipmetal4"col);
                for(
0MAX_PLAYERS; ++j)
                {
                    if(!
IsPlayerConnected(j))
                        continue;
                    if(
IsPlayerInRangeOfPoint(j10yx7.4))
                    {
                        
GetPlayerPos(jxyz);
                        
SetPlayerPos(jx+0.001yz);
                    }
                }
            }
        }
    }

Для работы скрипта требуется стример и любая система для задания цвета игрокам.
Reply
#2

Картинка хорошо, а вот видео бы ещё увидеть)
Кстати не первый раз замечаю, что некоторые программисты пишут в начале имени переменных символ g. Это просто пометка, что переменная глобальная (global) или некий стиль?
Reply
#3

Quote:
Originally Posted by Diman777
View Post
Картинка хорошо, а вот видео бы ещё увидеть)
Кстати не первый раз замечаю, что некоторые программисты пишут в начале имени переменных символ g. Это просто пометка, что переменная глобальная (global) или некий стиль?
Видео было бы обалденное - метки плавно перемещаются по карте. Вот только нет возможности заснять, железо не тянет. Если кто-то может, прошу: botinform.com:7797 (0.3z)
Не знаю, как у других программистов, а в моём коде g означает глобальную переменную. И, как правило, описание таких переменных помещаю в отдельный файл.
Reply
#4

Quote:
Originally Posted by Bombo
View Post
Видео было бы обалденное - метки плавно перемещаются по карте. Вот только нет возможности заснять, железо не тянет. Если кто-то может, прошу: botinform.com:7797 (0.3z)
Не знаю, как у других программистов, а в моём коде g означает глобальную переменную. И, как правило, описание таких переменных помещаю в отдельный файл.
А почему сервера на 0.3z? Я бы мог записать видео, но не хочу переустанавливать SA-MP...
Reply
#5

Quote:
Originally Posted by Kolstin
View Post
А почему сервера на 0.3z? Я бы мог записать видео, но не хочу переустанавливать SA-MP...
Из-за пресловутой вкладки Internet на 0.3.7.
А SA:MP переустанавливать необязательно: клац (или первая ссылка в подписи). Распаковываешь этот архив в любую папку на разделе NTFS и запускаешь Bombo.exe. Готово!
Reply
#6

Quote:
Originally Posted by Bombo
View Post
Из-за пресловутой вкладки Internet на 0.3.7.
Как по мне, это хорошо что вкладка Internet не работает. Теперь от Hosted большой толк есть.
Reply
#7

Версия 2.0
[+] Ники игроков
[@] Исправлен баг при неправильном положении маркера
[@] Исправлен баг при обновлении отображения маркеров



PHP Code:
//Map markers by Bombo
//v2.0
#define FILTERSCRIPT
#include <a_samp>
#include <streamer>
#define ZONE_MARK_INTERVAL 5000
new gPlayerMarker[MAX_PLAYERS];
new 
Text3D:gMarkerText[MAX_PLAYERS];
new 
gTimerPlayerZoneMark;
forward update_player_zone_mark();
#if defined FILTERSCRIPT
public OnFilterScriptInit()
{
    new 
i;
    
    print(
"\n--------------------------------------");
    print(
" Map markers in Area 51 by Bombo");
    print(
"--------------------------------------\n");
    for(
0MAX_PLAYERS; ++i)
    {
        
gPlayerMarker[i] = INVALID_OBJECT_ID;
    }
    
    
gTimerPlayerZoneMark SetTimer("update_player_zone_mark"ZONE_MARK_INTERVALtrue);
    return 
1;
}
public 
OnFilterScriptExit()
{
    new 
i;
    
    
KillTimer(gTimerPlayerZoneMark);
    for(
0MAX_PLAYERS; ++i)
    {
        if(
gPlayerMarker[i] != INVALID_OBJECT_ID)
        {
            
DestroyDynamicObject(gPlayerMarker[i]);
            
gPlayerMarker[i] = INVALID_OBJECT_ID;
            if(!
IsPlayerNPC(i))
            {
                if(
IsValidDynamic3DTextLabel(gMarkerText[i]))
                    
DestroyDynamic3DTextLabel(gMarkerText[i]);
            }
        }
    }
    return 
1;
}
#else
main()
{
    print(
"\n----------------------------------");
    print(
" Map markers in Area 51 by Bombo");
    print(
"----------------------------------\n");
}
#endif
public OnGameModeInit()
{
    
// Don't use these lines if it's a filterscript
    
SetGameModeText("Blank Script");
    
AddPlayerClass(01958.37831343.157215.3746269.1425000000);
    return 
1;
}
public 
OnGameModeExit()
{
    return 
1;
}
public 
OnPlayerRequestClass(playeridclassid)
{
    
SetPlayerPos(playerid1958.37831343.157215.3746);
    
SetPlayerCameraPos(playerid1958.37831343.157215.3746);
    
SetPlayerCameraLookAt(playerid1958.37831343.157215.3746);
    return 
1;
}
public 
OnPlayerConnect(playerid)
{
    return 
1;
}
public 
OnPlayerDisconnect(playeridreason)
{
    if(
gPlayerMarker[playerid] != INVALID_OBJECT_ID)
    {
        
DestroyDynamicObject(gPlayerMarker[playerid]);
        
gPlayerMarker[playerid] = INVALID_OBJECT_ID;
        if(!
IsPlayerNPC(playerid))
            if(
IsValidDynamic3DTextLabel(gMarkerText[playerid]))
                
DestroyDynamic3DTextLabel(gMarkerText[playerid]);
    }
    return 
1;
}
//area 51 markers
public update_player_zone_mark()
{
    new 
ijcolFloat:height;
    new 
Float:xFloat:yFloat:z;
    new 
Float:x0Float:y0Float:z0Float:pathFloat:speed;
    new 
name[64];
    static 
Float:MarkerXY[MAX_PLAYERS][2];
    for(
0MAX_PLAYERS; ++i)
    {
        if(
IsPlayerConnected(i))
        {
            
strdel(name0sizeof(name)-1);
            
GetPlayerName(inamesizeof(name));
            
col GetPlayerColor(i);
            
GetPlayerPos(ixyz);
            if(
3000.03000.0;
            if(
< -3000.0)= -3000.0;
            if(
3000.03000.0;
            if(
< -3000.0= -3000.0;
               for(
0height 0.0i; ++j)
            {
                if(
IsPlayerInRangeOfPoint(j200xyz))
                    
height floatadd(height0.04);
            }
            
col = (col>>8)|(0xFF000000);
            
floatsub(221.7,floatmul(3.45,floatdiv(floatadd(3000.0,y),6000.0)));
            
floatadd(1821.1,floatmul(3.45,floatdiv(floatadd(3000.0,x),6000.0)));
            if(
gPlayerMarker[i] != INVALID_OBJECT_ID)
            {
                
GetDynamicObjectPos(gPlayerMarker[i], y0x0z0);
                
path VectorSize(y0-yx0-x0);
                
speed floatdiv(path,floatdiv(ZONE_MARK_INTERVAL.0,1200.0));
                if(
IsPlayerNPC(i))
                    
MoveDynamicObject(gPlayerMarker[i], yx6.81speed);
                else
                {
                    
MoveDynamicObject(gPlayerMarker[i], yx7.41speed);
                    if(
VectorSize(MarkerXY[i][0]-xMarkerXY[i][1]-y0) > 0.03)
                    {
                        if(
IsValidDynamic3DTextLabel(gMarkerText[i]))
                            
DestroyDynamic3DTextLabel(gMarkerText[i]);
                        
gMarkerText[i] = CreateDynamic3DTextLabel(nameGetPlayerColor(i), yxfloatadd(7.51,height), 7.0INVALID_PLAYER_IDINVALID_VEHICLE_ID1);
                        
MarkerXY[i][0] = x;
                        
MarkerXY[i][1] = y;
                    }
                }
            }
            else
            {
                if(
IsPlayerNPC(i))
                    
gPlayerMarker[i] = CreateDynamicObject(2590yx6.81000);
                else
                {
                    
gPlayerMarker[i] = CreateDynamicObject(2590yx7.41000);
                    
gMarkerText[i] = CreateDynamic3DTextLabel(nameGetPlayerColor(i), yxfloatadd(7.51,height), 7.0INVALID_PLAYER_IDINVALID_VEHICLE_ID1);
                }
                if(
gPlayerMarker[i] != INVALID_OBJECT_ID)
                    
SetDynamicObjectMaterial(gPlayerMarker[i], 010770"carrier_sfse""ws_shipmetal4"col);
            }
        }
    }
    for(
0MAX_PLAYERS; ++j)
    {
        if(!
IsPlayerConnected(j))
            continue;
        if(
IsPlayerInRangeOfPoint(j10.022018227.4))
        {
            
GetPlayerPos(jxyz);
            
SetPlayerPos(jfloatadd(x,0.00001), yz);
        }
    }

Reply
#8

Кстати, можно было бы использовать выделение объектов курсором для детальной информации об игроке.
Reply
#9

Quote:
Originally Posted by VVWVV
View Post
Кстати, можно было бы использовать выделение объектов курсором для детальной информации об игроке.
На моём сервере это не требуется. Однако, код данного скрипта открыт - пожалуйста, экспериментируйте!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)