←  Tutoriale

AMXX.pl: Support AMX Mod X i SourceMod

»

Podmienianie modeli broni

  • +
  • -
DarkGL - zdjęcie DarkGL 27.07.2011

Pokaże dwie metody gorszą i lepszą na podmienia modeli broni które widzi gracz i modeli które widzą inni gracze patrząc na nas
  • Metoda gorsza:

    do plugin_init dodajemy
    register_event("CurWeapon","CurWeapon","be", "1=1")
    jest to event wywoływany przy zmianie broni , strzale / przeładowaniu (zmianie amunicji) więc dość często prawda ?
    gdzieś w pluginie dodajemy
    public CurWeapon(id)
    {
    	new wid = read_data(2)	// Id broni
    }
    
    w zmiennej wid mamy typ broni ( CSW_*)
    Nazwy broni i ammo do give_item (+ speed) - AMXX.pl: Support AMX Mod X
    załóżmy że chcemy podmienić model noża
    public CurWeapon(id)
    {
    	new wid = read_data(2)	// Id broni
    	if(wid == CSW_KNIFE){
    	}
    }
    teraz kod na podmianę
    • Wykorzystujący engine

      public CurWeapon(id)
      {
      	new wid = read_data(2)	// Id broni
      	if(wid == CSW_KNIFE){
      		entity_set_string(id, EV_SZ_viewmodel, "models/v_nowy_noz.mdl")  
      	}
      }
      
    • Wykorzystujący fakemete

      public CurWeapon(id)
      {
      	new wid = read_data(2)	// Id broni
      	if(wid == CSW_KNIFE){
      		set_pev(id,pev_viewmodel2,"models/v_nowy_noz.mdl")
      	}
      }
      
    może będziemy chcieli podmienić też model p_ czyli ten model którzy widzą inni gracze patrzący na gracza (nie ze specta poprostu patrzący na niego ;D )
    wtedy dodajemy
    • Wykorzystując engine

      public CurWeapon(id)
      {
      	new wid = read_data(2)	// Id broni
      	if(wid == CSW_KNIFE){
      		entity_set_string(id, EV_SZ_viewmodel, "models/v_nowy_noz.mdl")  
      		entity_set_string(id, EV_SZ_weaponmodel, "models/p_nowy_noz.mdl")  
      	}
      }
      
    • Wykorzystując fakemete

      public CurWeapon(id)
      {
      	new wid = read_data(2)	// Id broni
      	if(wid == CSW_KNIFE){
      		set_pev(id,pev_viewmodel2,"models/v_nowy_noz.mdl")
      		set_pev(id,pev_weaponmodel2,"models/p_nowy_noz.mdl")
      	}
      }
      
      jeśli będziemy chcieli podmienić broni to robimy
      public CurWeapon(id)
      {
      	new wid = read_data(2)	// Id broni
      	if(wid == CSW_KNIFE){
      		//podmiana modeli
      	}
      	else if(wid == inna bron){
      		//podmiana modeli
      	}
      }
      
  • Metoda lepsza:

    Wykorzystująca hamsandwich
    w plugin_init dodajemy
    RegisterHam(Ham_Item_Deploy, "weapon_knife", "fwItemDeploy",1);
    drugi parametr jest to classname w przykładzie dałem weapon_knife bo taki jest classname dla noża dla innych broni możecie sprawdzić tutaj
    Nazwy broni i ammo do give_item (+ speed) - AMXX.pl: Support AMX Mod X
    w pluginie w dowolnym miejscu dodajemy
    public fwItemDeploy(wpn){
    	static iOwner;
    	iOwner = pev(wpn,pev_owner);
    }
    
    w zmiennej iOwner mamy id gracza który trzyma broń
    i podmieniamy
    • Wykorzystując engine

      public fwItemDeploy(wpn){
      	static iOwner;
      	iOwner = entity_get_edict(wpn, EV_ENT_owner)
      	
      	entity_set_string(iOwner, EV_SZ_viewmodel, "models/v_nowy_noz.mdl")  
      	
      }
      
    • Wykorzystując fakemete

      public fwItemDeploy(wpn){
      	static iOwner;
      	iOwner = pev(wpn,pev_owner);
      	
      	set_pev(iOwner,pev_viewmodel2,"models/v_nowy_noz.mdl")
      	
      }
    no i jeśli model p także to
    • Wykorzystując engine

      public fwItemDeploy(wpn){
      	static iOwner;
      	iOwner = entity_get_edict(wpn, EV_ENT_owner)
      	
      	entity_set_string(iOwner, EV_SZ_viewmodel, "models/v_nowy_noz.mdl")  
      	entity_set_string(iOwner, EV_SZ_weaponmodel, "models/p_nowy_noz.mdl")  
      }
      
    • Wykorzystując fakemete

      public fwItemDeploy(wpn){
      	static iOwner;
      	iOwner = pev(wpn,pev_owner);
      	
      	set_pev(iOwner,pev_viewmodel2,"models/v_nowy_noz.mdl")
      	set_pev(iOwner,pev_weaponmodel2,"models/p_nowy_noz.mdl")
      }
      
    a jeśli będziemy chcieli podłączyć podmienianie dwóch lub więcej broni w jednej funkcji to robimy

    public fwItemDeploy(wpn){
    	static iOwner;
    	iOwner = pev(wpn,pev_owner);
    	
    	new wpnID = cs_get_weapon_id(wpn)
    	
    	if(wpnID == CSW_KNIFE){
    		//podmiana modelu
    	}
    	else if(wpnID == inna bron){
    		//podmiana modelu
    	}
    }
    ta metoda jest lepsza ponieważ model jest podmieniany tylko przy wyciąganiu (deploy) , przy strzale i przeładowaniu nie ma to miejsca
oczywiście nowe modele muszą być "zprecachowane" ( Dołączona grafika ) w plugin_precache
Odpowiedz

  • +
  • -
Ortega - zdjęcie Ortega 27.07.2011

Brakło tylko metody najlepszej ;)
Advanced File Replacer - AMXX.pl: Support AMX Mod X
Idealnie działającej na podmianie modeli broni.
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 27.07.2011

nie do końca najlepszej

Ważne: Nazwa nowego pliku nie może być dłuższa niż nazwa podmienianego pliku.

bardzo duża wada
Odpowiedz

  • +
  • -
Cyferki - zdjęcie Cyferki 27.07.2011

Tutek bardzo dobry. Tylko jak ktoś używa engine, zamiast:
iOwner = pev(wpn,pev_owner)
powinno być
iOwner = entity_get_edict(wpn, EV_ENT_owner)

Warto dodać również, że jeżeli ktoś używa fakemeta, do pobrania właściciela broni można użyć również:
iOwner = get_pdata_cbase(wpn, 41, 4)

Użytkownik Cyferki edytował ten post 27.07.2011 22:12
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 27.07.2011

dzięki :)
Odpowiedz

  • +
  • -
Ortega - zdjęcie Ortega 27.07.2011

bardzo duża wada

Wada :D? Dla kogoś komu zależy na efektywnym i nie zużywającym zasobów sposobie wybierze orpheu. Nazwać broń używając tych samych długości to nie problem a kombinacji jest mnóstwo. W końcu gracz nie ma nic do gadania i broń może nazywać się abcde.mdl.
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 27.07.2011

wymusza to stosowanie to krotkich nazw co nie jest wygodne a chodzi właśnie o wygodę
to ty rozwijasz kod i go edytujesz wiec to jest bardzo duża wada + orpheu to moduł niestandardowy
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 27.07.2011

jak ci zalezy to sobie wgrasz orpheu a co do nazw to od tego są komentarze w pluginie :D

szkoda tylko ze dzwiekow nie mozna w zaden "naturalny" sposob podmienic
Odpowiedz

  • +
  • -
Owner123 - zdjęcie Owner123 30.07.2011

Metodą najlepszą jest użycie CBasePlayerWeapon::DefaultDeploy przy użyciu Orpheu. Złapanie tej funkcji pozwala na szybką zmianę modelu oraz innych parametrów z maksymalną redukcją SVC_BAD ...
Powyżej opisane metody są sobie równe. Tyle że różnią się czasem reakcji i zapisem.
Użytkownik Owner123 edytował ten post 30.07.2011 22:51
Odpowiedz

  • +
  • -
Fili:P - zdjęcie Fili:P 06.04.2012

Przydałoby się jeszcze ustawienie modelu w_ ( broń leży np. na ziemi ).

PS: Jak daje classname w registerham "weapon_gali" to mam potem error:

L 04/06/2012 - 17:22:47: [HAMSANDWICH] Failed to retrieve classtype for "weapon_gali", hook for "ham_postItemDeploy" not active.
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 11.04.2012

spróbuj weapon_galil
gali to stara definicja
First one should have been left for backwards compatibility.
Odpowiedz

  • +
  • -
Fili:P - zdjęcie Fili:P 04.08.2012

Lepsza metoda nie zmienia modelu kiedy podniosę broń lub po zakończeniu rundy. Nie wiem czy gorsza też.

Działa po wykorzystaniu obu metod, czyli zarejestrowanie Ham_Item_Deploy na wszystkich broniach (weapon_) i użyciu CurWeapon.


public fw_ItemsDeploy(wpn)
{
static id;
id = pev(wpn, pev_owner);

if(!is_user_alive(id))
return 0;

if(ma_klase[id])
{
new old_weapon2[33];
old_weapon2[id]=old_weapon[id];
old_weapon[id]=cs_get_weapon_id(wpn);
if(old_weapon[id]==CSW_AWP && old_weapon2[id]!=CSW_AWP)
{
set_pev(id, pev_viewmodel2, WEAPON_1_V_MODEL);
set_pev(id, pev_weaponmodel2, WEAPON_1_P_MODEL);

UTIL_PlayWeaponAnimation(id, 5);
}
}
}
public CurrentWeapon(id)
{
if(ma_klase[id] && is_user_alive(id))
{
if(read_data(2) == CSW_AWP)
{
set_pev(id, pev_viewmodel2, WEAPON_1_V_MODEL);
set_pev(id, pev_weaponmodel2, WEAPON_1_P_MODEL);
if(old_weapon[id]!=CSW_AWP)
UTIL_PlayWeaponAnimation(id, 5);
}
}
}
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 04.08.2012

jest to bug gry
używanie obydwu metod naraz nie ma sensu
Odpowiedz

  • +
  • -
szelbi - zdjęcie szelbi 27.08.2014

Lepsza metoda nie zmienia modelu kiedy podniosę broń lub po zakończeniu rundy.

Wystarczy użyć Ham_Item_AttachToPlayer, aby w tych przypadkach również podmieniało model :)

Odpowiedz

  • +
  • -
vasetobtg - zdjęcie vasetobtg 04.05.2015

thanks for you=)

Odpowiedz

  • +
  • -
ZwiastuN - zdjęcie ZwiastuN 23.07.2015

Mam kłopot, bo gdy używam tego z precache to model nie zmienia się, ustawia się jako domyślny nóż.

Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 23.07.2015

To jest tylko tutorial nie pełnoprawny plugin

Odpowiedz

  • +
  • -
Hajz - zdjęcie Hajz 27.07.2015

A czy nie będzie przypadkiem sytuacji, że przy wyciągnięciu noża (z przykładu) jeżeli mamy do funkcji dodane również inne bronie to nie zostaną one niestety zmienione?

Z tego co jest napisane, można wywnioskować, że funkcja zostanie wykonana w przypadku deploy noża. Więc albo inne bronie nie zostaną zmienione, albo jeżeli w ogóle nie wyciągnę noża podczas gry - nic nie zostanie zmienione?

Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 27.07.2015

O którym sposobie mówisz ?
Odpowiedz

  • +
  • -
Hajz - zdjęcie Hajz 27.07.2015

Rzecz jasna nowszym.

I sprawdziłem to (na tyle na ile umiałem). registerHam HamItemDeploy, "weapon_knife" nie zmieni nam np mp5.
Czy z tego wynika że każdą zmienianą broń trzeba oddzielnie wywoływać?
 

public fwItemDeploy(wpn){
	static iOwner;
	iOwner = pev(wpn,pev_owner);
	
	new wpnID = cs_get_weapon_id(wpn)
	
	if(wpnID == CSW_MP5NAVY){
		set_pev(iOwner,pev_viewmodel2, "models/v_1.mdl")  
		set_pev(iOwner,pev_weaponmodel2, "models/p_1.mdl")  
	}
}

 


Użytkownik Hajz edytował ten post 27.07.2015 20:53
Odpowiedz