GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: scott1 le 05 Février 2010, 12:24:12
-
Bonjour,
J'aimerai savoir si il existe une fonction pour attacher un joueur a un autre.
Merci d'avance
-
Il n' y a pas de fonction pour ^^
Mais tu peut te la codé en utilisant OnPlayerUpdate
-
Ce ne sera as asser fluide, la marche sera sacadée :/
-
#include <a_samp>
new AttachedTo[MAX_PLAYERS];
public OnPlayerConnect(playerid)
{
AttachedTo[playerid] = -1;
}
public OnPlayerDisconnect(playerid,reason)
{
AttachedTo[playerid] = -1;
}
public OnPlayerUpdate(playerid)
{
AttachPlayer_Update_Function(playerid);
}
forward AttachPlayerToPlayer(playerid,To_Player);
public AttachPlayerToPlayer(playerid,To_Player)
{
if(IsPlayerConnected(playerid) && IsPlayerConnected(To_Player))
{
AttachedTo[playerid] = To_Player;
return true;
}
return false;
}
forward AttachPlayer_Update_Function(playerid);
public AttachPlayer_Update_Function(playerid)
{
if(AttachedTo[playerid] != -1)
{
if(IsPlayerConnected(AttachedTo[playerid])){AttachedTo[playerid] = -1; return false;}
new Float:p[3];
GetPlayerPos(AttachedTo[playerid],p[0],p[1],p[2]);
SetPlayerPos(playerid,p[0],p[1],p[2]);
}
return false;
}
forward DettachPlayerToPlayer(playerid);
public DettachPlayerToPlayer(playerid)
{
AttachedTo[playerid] = -1;
}
Tien je vient juste de le codé sans testé ^^ normalement c' est bon et c' est hyper fluide enfin c' est la meilleur fluidité possible sur samp
-
Salut,
ouais c'est pas mal, mais tu n'as pas tenu compte de la possibilité de mettre un Offset (comme pour les objets) et tu as fais une petite erreur dans la fonction mère, tu détache le joueur si le joueur auquel il est attaché est connecté
voici à peu près comment je le ferais
(peut-être qu'un TogglePlayerControllable et un calcul de la vitesse (avec SetPlayerVelocity) pourrait permettre un résultat acceptable)
#include <a_samp>
new AttachedTo[MAX_PLAYERS];
new Float:p_OffX[MAX_PLAYERS];
new Float:p_OffY[MAX_PLAYERS];
new Float:p_OffZ[MAX_PLAYERS];
public OnPlayerConnect(playerid)
{
AttachedTo[playerid] = -1;
}
public OnPlayerDisconnect(playerid,reason)
{
AttachedTo[playerid] = -1;
}
public OnPlayerUpdate(playerid)
{
AttachPlayer_Update_Function(playerid);
return 1;
}
forward AttachPlayerToPlayer(playerid,To_Player, Float:OffX, Float:OffY, Float:OffZ);
public AttachPlayerToPlayer(playerid,To_Player, Float:OffX, Float:OffY, Float:OffZ)
{
if(IsPlayerConnected(playerid) && IsPlayerConnected(To_Player))
{
AttachedTo[playerid] = To_Player;
p_OffX[playerid] = OffX;
p_OffY[playerid] = OffY;
p_OffZ[playerid] = OffZ;
return true;
}
return false;
}
AttachPlayer_Update_Function(playerid)
{
if(AttachedTo[playerid] != -1)
{
if(IsPlayerConnected(AttachedTo[playerid]))
{
new Float:X, Float:Y, Float:Z, Float:Angle;
GetPlayerPos(AttachedTo[playerid], X, Y, Z);
if(IsPlayerInAnyVehicle(playerid))
{
GetVehicleZAngle(GetPlayerVehicleID(AttachedTo[playerid]), Angle);
}
else
{
GetPlayerFacingAngle(AttachedTo[playerid], Angle);
}
X += floatcos(Angle, degrees) * p_OffX[playerid] - floatsin(Angle, degrees) * p_OffY[playerid];
Y += floatsin(Angle, degrees) * p_OffX[playerid] + floatcos(Angle, degrees) * p_OffY[playerid];
Z += p_OffZ[playerid];
SetPlayerPos(playerid, X, Y, Z);
GetPlayerVelocity(AttachedTo[playerid], X, Y, Z);
SetPlayerVelocity(playerid, X, Y, Z);
return true;
}
else
{
AttachedTo[playerid] = -1;
}
}
return false;
}
forward DettachPlayerFromPlayer(playerid);
public DettachPlayerFromPlayer(playerid)
{
AttachedTo[playerid] = -1;
return true;
}
bien sûr c'est loin d'être parfait
d'ailleurs je suis loin d'être sur en ce qui concerne les cos et sin, je les ai fait en essayant de le voir dans ma tête alors ce n'est pas évident...
++Sim++
-
Autant la fonction de Sasuke j'ai tout compris, autant la tienne sim je n'ai rien compris :D
Double post
Par contre pour faire une commande avec ça xD
Comme je n'arrive pas avec la fonction de Sim, j'ai essayer avec celle de Sasuke, ça donne
if(strcmp(cmd, "/attach", true) == 0)
{
if(IsPlayerConnected(playerid))
{
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
SendClientMessage(playerid, COLOR_GRAD2, "USAGE: /attach [playerid/PartOfName]");
return 1;
}
new playa;
playa = ReturnUser(tmp);
if (PlayerInfo[playerid][pAdmin] >=1)
{
if(IsPlayerConnected(playa))
{
if(playa != INVALID_PLAYER_ID)
{
AttachPlayerToPlayer(playerid,playa);
}
}
}
else
{
SendClientMessage(playerid, COLOR_GRAD1, "Vous n'êtes pas autorisé à utiliser cette commande!");
}
}
return 1;
}
Mais elle ne fonctionne pas, alors la je me tâte aiis je réellement compris ta fonction? xD
:dejadehors
Merci pour votre aide
-
Béh celle de sim c' est une amélioration de ma fonction il à ajouté des offset pour par exemple Si tu veut que le joueur 1 soit collé au 2 mais qu' il y est une distance de 2 M qui les sépare, il a aussi implanté la vitesse de déplacement mais j' aurais préféré prend celle du joueur 2 pis la Mettre à celle du joueur 1 ^^
-
Ok merci.
J'ai donc pris celle de Sim ^^
Seulement le soucis, quand je compile
C:\Documents and Settings\Propriétaire\Bureau\serveur samp\LARP\Bon serv\filterscripts\Attachplayertoplayer2.pwn(57) : error 017: undefined symbol "OffX"
C:\Documents and Settings\Propriétaire\Bureau\serveur samp\LARP\Bon serv\filterscripts\Attachplayertoplayer2.pwn(57) : warning 215: expression has no effect
C:\Documents and Settings\Propriétaire\Bureau\serveur samp\LARP\Bon serv\filterscripts\Attachplayertoplayer2.pwn(57) : error 001: expected token: ";", but found "]"
C:\Documents and Settings\Propriétaire\Bureau\serveur samp\LARP\Bon serv\filterscripts\Attachplayertoplayer2.pwn(57) : error 029: invalid expression, assumed zero
C:\Documents and Settings\Propriétaire\Bureau\serveur samp\LARP\Bon serv\filterscripts\Attachplayertoplayer2.pwn(57) : fatal error 107: too many error messages on one line
Et si je rajoute new Float:OffX[MAX_PLAYERS];
new Float:OffY[MAX_PLAYERS];
new Float:OffZ[MAX_PLAYERS];
C:\Documents and Settings\Propriétaire\Bureau\serveur samp\LARP\Bon serv\filterscripts\Attachplayertoplayer2.pwn(31) : warning 219: local variable "OffX" shadows a variable at a preceding level
C:\Documents and Settings\Propriétaire\Bureau\serveur samp\LARP\Bon serv\filterscripts\Attachplayertoplayer2.pwn(31) : warning 219: local variable "OffY" shadows a variable at a preceding level
C:\Documents and Settings\Propriétaire\Bureau\serveur samp\LARP\Bon serv\filterscripts\Attachplayertoplayer2.pwn(31) : warning 219: local variable "OffZ" shadows a variable at a preceding level
La je n'ais pas compris l'erreur xD, je ne vois as de conflict :/
-
Salut,
pas besoin, j'avais seulement fais une petite erreur, oublié une partie du nom de mes varaibles, le p_
j'ai corrigé te suffit de la reprendre
++Sim++
-
Pour celui qui aimerai la fonction de Sim, attention, une petite erreur. u a oublié un I
AttachPlayer_Update_Function(playerid)
{
if(AttachedTo[playerid] != -1)
{
if(sPlayerConnected(AttachedTo[playerid]))
{
par
AttachPlayer_Update_Function(playerid)
{
if(AttachedTo[playerid] != -1)
{
if(IsPlayerConnected(AttachedTo[playerid]))
{
S'est bien gentil, je n'ai plus qu'a travailler sur la commande. La tache s'annonce ardue xD
Merci !
-
Ardu? lol Au contraire
-
Hey on est pas tous de grand maitre en pawn