[Ajuda] Criar arma falsa actor
#1

Estou querendo criar uma arma falsa, de enfeite para um actor, como essa:


Eu tentei fazer com esses cуdigos:
Код:
public OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ)
{
	new Float:oldX, Float:oldY, Float:oldZ, Float:oldRotX, Float:oldRotY, Float:oldRotZ;
	GetObjectPos(objectid, oldX, oldY, oldZ);
	GetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
	if(!playerobject) // If this is a global object, sync the position for other players
	{
		if(!IsValidObject(objectid)) return 1;
		SetObjectPos(objectid, fX, fY, fZ);		          
		SetObjectRot(objectid, fRotX, fRotY, fRotZ);
	}
	if(response == EDIT_RESPONSE_FINAL)
	{
		// The player clicked on the save icon
		// Do anything here to save the updated object position (and rotation)
		new string[128];
		format(string, sizeof(string), "fX[%f] fY[%f] fZ[%f] fRotX[%f] fRotY[%f] fRotZ[%f]", fX, fY, fZ, fRotX, fRotY, fRotZ );
		SendClientMessage(playerid, COLOR_GREY, string);
	}
	if(response == EDIT_RESPONSE_CANCEL)
	{
		//The player cancelled, so put the object back to it's old position
		if(!playerobject) //Object is not a playerobject
		{
			SetObjectPos(objectid, oldX, oldY, oldZ);
			SetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
		}
		else
		{
			SetPlayerObjectPos(playerid, objectid, oldX, oldY, oldZ);
			SetPlayerObjectRot(playerid, objectid, oldRotX, oldRotY, oldRotZ);
		}
	}
	return 1;
}
Код:
CMD:actorweapon(playerid, params[]) {
	// https://sampwiki.blast.hk/wiki/EditAttachedObject  ~  https://sampwiki.blast.hk/wiki/EditObjec...5.47354661	if(admin[playerid] < 1337) return 0;
	new actorid;
	if(sscanf(params,"i", actorid)) return SendClientMessage(playerid, -1, "Use: /actorweapon [actorid]");
	if(IsValidActor(actorid)) {
		new Float:x, Float:y, Float:z;
		GetActorPos(actorid, x, y, z);
		new string[128];
		format(string, sizeof(string), "[ACTOR POS] x[%f] y[%f] z[%f] RotX[0] RotY[0] RotZ[0]", x, y, z);
		SendClientMessage(playerid, COLOR_GREY, string);
		new weaponobj = CreateObject(GetGunObjectID(25), x, y, z, 0.0, 0.0, 0.0);
		EditObject(playerid, weaponobj);
	}
	return 1;
}
Pra pegar o valor do ator e o valor da arma ajeitada na mгo do ator como mostra nessa imagem:


Depois com os dois valores eu tentei fazer a matematica pra poder se auto ajeitar todas as armas e fiz essa conta
Код:
[ACTOR POS] x[207.732498] y[-98.704498] z[1005.257812] RotX[0] RotY[0] RotZ[0]
[WEAPO POS] X[207.578094] Y[-98.815635] Z[1005.568115] RotX[1.599998] RotY[-0.400000] RotZ[-66.699996]

[NEW POS] X[-0.154404] Y[-0.111137] Z[+-0.310303] RotX[+1.599998] RotY[-0.400000] RotZ[-66.699996]
Ficando assim depois de criar os npcs:
Код:
	CreateActor(142, -28.9448,-186.8204,1003.5469, 0.0);
	CreateActor(142, 1.9909,-30.7009,1003.5494, 357.6201);
	CreateActor(223, 207.7325,-98.7045,1005.2578, 178.9347);
	CreateActor(29, 203.6479,-40.7589,1001.8047, 181.8473);
	CreateActor(141, 161.4051,-80.0589,1001.8047, 180.1522); 
	CreateActor(205, 375.6144,-65.7069,1001.5078, 140.8397);
	CreateActor(85, 501.8527,-21.4871,1000.6797, 90.2779);
	CreateActor(155, 373.9646,-117.2686,1001.4995, 180.2793);
	new actstring[128];
	for(new a; a< GetActorPoolSize()+1; ++a) {
		if(IsValidActor(a)) {
            SetActorVirtualWorld(a, 0);
            SetActorInvulnerable(a, false);
            SetActorHealth(a, 10);
			new Float:x, Float:y, Float:z;
			GetActorPos(a, x, y, z);
			CreateObject(GetGunObjectID(25), x-0.154404, y-0.111137, z-0.310303, 1.599998, -0.400000, -66.699996);
		}
	}
Mas nгo estб funcionando direito, a arma fica no meio da perna do jogador, em outro actor ficou ao contrario
Fora que toda vez que eu chego perto desses actores meu GTA crasha

Alguйm tem alguma ideia?
Reply
#2

Eu fiz aqui e deu certo, se vocк nгo conseguir comente que eu irei ajudar.

Seguinte, vocк terб que ir atй o actor que vc quer pegar a posiзгo do objeto, dps digite o cmd (abaixo), e pegue a posiзгo.

Comando para editar:
PHP код:
CMD:edit(playerid)
{
    static 
Floatpos[3];
    
GetPlayerPos(playeridpos[0], pos[1], pos[2]);
    
EditObject(playeridCreateObject(348pos[0], pos[1], pos[2], 0.00.00.0));
    return 
true;

Use essa callback para vocк pegar as coordenadas do objeto.
PHP код:
public OnPlayerEditObject(playeridplayerobjectobjectidresponseFloat:fXFloat:fYFloat:fZFloat:fRotXFloat:fRotYFloat:fRotZ)
{
    if(!
playerobject) {
        if(!
IsValidObject(objectid)) return 1;
        
SetObjectPos(objectidfXfYfZ);
        
SetObjectRot(objectidfRotXfRotYfRotZ);
    }
    if(
response == EDIT_RESPONSE_FINAL) {
        static 
str[70];
        
        
format(strsizeof str"Pos: %f, %f, %f"fXfYfZ);
        
SendClientMessage(playerid, -1str);
        
        
format(strsizeof str"Rot: %f, %f, %f"fRotXfRotYfRotZ);
        
SendClientMessage(playerid, -1str);
        
        
printf("\n%f, %f, %f\n%f, %f, %f\n"fXfYfZfRotXfRotYfRotZ);
    }
    if(
response == EDIT_RESPONSE_CANCEL) {
        
DestroyObject(objectid);
    }
    return 
1;

Depois de ter pego a posiзгo do objeto, vб em OnGameModeInit e crie o objeto.
PHP код:
CreateObject(/*ID do Objeto*/posXposYposZrotXrotYrotZ);
Troque "posX, posY, ..." pela posiзгo que vocк pegou apуs editar o objeto
Reply
#3

Quote:
Originally Posted by AuhMaru
Посмотреть сообщение
Eu fiz aqui e deu certo, se vocк nгo conseguir comente que eu irei ajudar.

Seguinte, vocк terб que ir atй o actor que vc quer pegar a posiзгo do objeto, dps digite o cmd (abaixo), e pegue a posiзгo.

Comando para editar:
PHP код:
CMD:edit(playerid)
{
    static 
Floatpos[3];
    
GetPlayerPos(playeridpos[0], pos[1], pos[2]);
    
EditObject(playeridCreateObject(348pos[0], pos[1], pos[2], 0.00.00.0));
    return 
true;

Use essa callback para vocк pegar as coordenadas do objeto.
PHP код:
public OnPlayerEditObject(playeridplayerobjectobjectidresponseFloat:fXFloat:fYFloat:fZFloat:fRotXFloat:fRotYFloat:fRotZ)
{
    if(!
playerobject) {
        if(!
IsValidObject(objectid)) return 1;
        
SetObjectPos(objectidfXfYfZ);
        
SetObjectRot(objectidfRotXfRotYfRotZ);
    }
    if(
response == EDIT_RESPONSE_FINAL) {
        static 
str[70];
        
        
format(strsizeof str"Pos: %f, %f, %f"fXfYfZ);
        
SendClientMessage(playerid, -1str);
        
        
format(strsizeof str"Rot: %f, %f, %f"fRotXfRotYfRotZ);
        
SendClientMessage(playerid, -1str);
        
        
printf("\n%f, %f, %f\n%f, %f, %f\n"fXfYfZfRotXfRotYfRotZ);
    }
    if(
response == EDIT_RESPONSE_CANCEL) {
        
DestroyObject(objectid);
    }
    return 
1;

Depois de ter pego a posiзгo do objeto, vб em OnGameModeInit e crie o objeto.
PHP код:
CreateObject(/*ID do Objeto*/posXposYposZrotXrotYrotZ);
Troque "posX, posY, ..." pela posiзгo que vocк pegou apуs editar o objeto
Mano eu fiz e na hora ficou certo como na imagem abaixo:


O meu problema й na soma de valores, pq eu quero fazer isso pra todos os Actores sem ter que ficar pegando de um a um...
O problema ta na soma aqui:
Код:
	for(new a; a < MAX_STOREACTOR; ++a) {
		if(IsValidActor(a)) {
            SetActorVirtualWorld(a, 0);
            SetActorInvulnerable(a, false);
            SetActorHealth(a, 10);
			new Float:x, Float:y, Float:z;
			GetActorPos(a, x, y, z);
			ApplyActorAnimation(a, "PED", "GUN_STAND", 4.0, 1, 0, 0, 0, 0);
			CreateObject(GetGunObjectID(25), x-0.154404, y-0.111137, z-0.310303, 1.599998, -0.400000, -66.699996);
		}
	}
E por que o GTA ta crashando...

Tu fez a soma dos valores pra pegar a posiзгo do actor e pela posiзгo dele jogar a arma na mгo dele?
Reply
#4

Код HTML:
"x-0.154404, y-0.111137, z-0.310303"
Isso nгo irб funcionar, eu acho que vocк precisaria usar floatsin/cos para pegar a posiзгo do objeto em relaзгo ao actor
Reply
#5

Quote:
Originally Posted by Injury
Посмотреть сообщение
Код HTML:
"x-0.154404, y-0.111137, z-0.310303"
Isso nгo irб funcionar, eu acho que vocк precisaria usar floatsin/cos para pegar a posiзгo do objeto em relaзгo ao actor
Vocк quis dizer em conjunto com aquele cуdigo?

https://sampwiki.blast.hk/wiki/Floatsin
https://sampwiki.blast.hk/wiki/Floatcos

Olhando as wiki nгo entendi como fazer, tem como dar uma simplificada por favor?
Reply
#6

Quote:
Originally Posted by Injury
Посмотреть сообщение
Код HTML:
"x-0.154404, y-0.111137, z-0.310303"
Isso nгo irб funcionar, eu acho que vocк precisaria usar floatsin/cos para pegar a posiзгo do objeto em relaзгo ao actor
Quote:
Originally Posted by pedrotvr
Посмотреть сообщение
Vocк quis dizer em conjunto com aquele cуdigo?

https://sampwiki.blast.hk/wiki/Floatsin
https://sampwiki.blast.hk/wiki/Floatcos

Olhando as wiki nгo entendi como fazer, tem como dar uma simplificada por favor?
Essas funзхes sгo para pegar o seno(floatsin) e o cosseno(floatcos), eu nгo entendo muito disso, sou pйssimo em matйmatica, mas eu acho que ele quis dizer pra vocк fazer algo que se auto ajuste independentemente do вngulo do actor
Reply
#7

Quote:
Originally Posted by JPedro
Посмотреть сообщение
Essas funзхes sгo para pegar o seno(floatsin) e o cosseno(floatcos), eu nгo entendo muito disso, sou pйssimo em matйmatica, mas eu acho que ele quis dizer pra vocк fazer algo que se auto ajuste independentemente do вngulo do actor
Verdade, sу com algum matematico pro pra ajudar XD
Reply
#8

Obrigado, tambйm nгo sei, mas jб й um passo pra resolver... +rep

Alguйm que saiba das matematicas com as funзхes:

https://sampwiki.blast.hk/wiki/Floatsin
https://sampwiki.blast.hk/wiki/Floatcos

Poderia me ajudar a terminar meu codigo e setar uma arma na mгo do NPC usando a animaзгo:
Код:
GUN GUN_STAND
De acordo com a posiзгo do NPC?
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)