Witam, mam problem... gdy robie tak jak napisal Ortega w tym temacie: Piorun - Nieoficjalny polski support AMX Mod X to wywala mi serwer;/ ma ktos jakis inny kod?
Z gory thx...
Witamy w Nieoficjalnym polskim support'cie AMX Mod X
Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
|
Guest Message by DevFuse
0
Piorun
Started By Weed, 08.10.2010 21:32
8 replies to this topic
#2
Posted 08.10.2010 22:03
Nie testowałem go, ale wydawał mi się dobrze napisany. Po pierwsze czy masz odpowiedni plik sprite, po drugie jeśli dźwięk nie jest standardowym dźwiękiem z HL to musisz zrobić jego precache. Jeśli nie ustawiłeś swojej zmiennej g_item odpowiednio to nie ma prawa nawet zadziałać. Ewentualnie może coś pochrzaniłem z funkcją change_health z diablo moda, bo dokładnie jej się nie przyglądałem. No i tak apropos to przydały by się logi( bo podejrzewam, że to przez błędne precache ).
#3
Posted 08.10.2010 22:08
Ten sam problem. Gadałem z Weed i mamy to samo. Podaje swój:
Jak widać wszystko ok, wywaliłem tylko dźwięk, logi czyste.
Jak wcisnę na przeciwniku E na nożu crashuje serwer.
#include < amxmodx >
#include < engine >
#include < fakemeta >
new light;
new g_thunderbolt[ 33 ];
new piorun[33];
public plugin_precache( ) {
light = precache_model("sprites/piorunek.spr");
}
public plugin_init( ) {
register_forward( FM_PlayerPreThink, "fw_PlayerPreThink");
}
public fw_PlayerPreThink( client ) {
if( !is_user_alive( client ) )
return;
if ( ( get_user_button( client ) & IN_USE ) && piorun[client] == 1 )
{
MakeThunderBolt( client );
}
}
public MakeThunderBolt( client ) {
if( g_thunderbolt[ client ] == 2 )
return;
new iMakerOrigin[ 3 ], Float:iMakeOriginSe[3];
get_user_origin( client, iMakerOrigin );
for( new i = 0; i < 3; i++ ){
iMakeOriginSe[i] = float( iMakerOrigin[i] );
}
new entPlayer;
entPlayer = -1;
while( ( entPlayer = find_ent_in_sphere( client, iMakeOriginSe, 550.0 ) ) != 0 )
{
new iVictimOrigin[ 3 ];
get_user_origin( entPlayer, iVictimOrigin );
change_health( entPlayer, -80, client, "world" );
CreateBolt( entPlayer, iMakerOrigin, iVictimOrigin );
g_thunderbolt[ client ]++;
}
}
CreateBolt( iPlayer, iMaker[3], iVictim[3] ) {
message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
write_byte( 0 )
write_coord( iMaker[ 0 ] )
write_coord( iMaker[ 1 ] )
write_coord( iMaker[ 2 ] )
write_coord( iVictim[ 0 ] )
write_coord( iVictim[ 1 ] )
write_coord( iVictim[ 2 ] )
write_short( light )
write_byte( 1 )
write_byte( 5 )
write_byte( 2 )
write_byte( 20 )
write_byte( 30 )
write_byte( 255 )
write_byte( 255 )
write_byte( 255 )
write_byte( 200 )
write_byte( 200 )
message_end( )
}
Jak widać wszystko ok, wywaliłem tylko dźwięk, logi czyste.
Jak wcisnę na przeciwniku E na nożu crashuje serwer.
#4
Posted 08.10.2010 22:29
if( !is_user_alive( client ) )
return;
na
if( !is_user_alive( client ) )
return PLUGIN_CONTINUE;
new entPlayer;
entPlayer = -1;
while( ( entPlayer = find_ent_in_sphere( client, iMakeOriginSe, 550.0 ) ) != 0 )
{
new iVictimOrigin[ 3 ];
get_user_origin( entPlayer, iVictimOrigin );
change_health( entPlayer, -80, client, "world" );
CreateBolt( entPlayer, iMakerOrigin, iVictimOrigin );
g_thunderbolt[ client ]++;
}
na
new entPlayer;
entPlayer = -1;
new iVictimOrigin[ 3 ];
while( ( entPlayer = find_ent_in_sphere( client, iMakeOriginSe, 550.0 ) ) != 0 )
{
if( IsPlayer( entPlayer ) && entPlayer != client )
{
get_user_origin( entPlayer, iVictimOrigin );
CreateBolt( entPlayer, iMakerOrigin, iVictimOrigin );
change_health( entPlayer, -80, 0, "world" );
g_thunderbolt[ client ]++;
}
}
public MakeThunderBolt( client ) {
if( g_thunderbolt[ client ] == 2 )
return;
na
public MakeThunderBolt( client ) {
if( ( !is_user_alive( client ) ) || ( g_thunderbolt[ client ] == 2 ) )
return;
dodaj
#define IsPlayer(%1) (1 <= %1 <= g_MaxPlayers)
new g_MaxPlayers;
w plugin_init
g_MaxPlayers = get_maxplayers( );
Edited by Ortega, 08.10.2010 22:43.
#5
Posted 08.10.2010 22:31
Ortega, wystarczy zmienić:
na
I crash'a nie ma.
Tylko sprite nie mam. Testowałem na laserbeam.
change_health( entPlayer, -80, client, "world" );
na
change_health( entPlayer, -80, 0, "world" );
I crash'a nie ma.
Tylko sprite nie mam. Testowałem na laserbeam.
Edited by Screeaam..., 08.10.2010 22:34.
#6
Posted 08.10.2010 22:37
Mimo wszystko zalecam optymalizacje albo przynajmniej wyrzucenie tworzenia tablicy przed pętlę while Tak czułem, że to wina tej funkcji, bo mogłem zastosować zwykłą ale, że pokusiłem się na mniej kodu taką z diablo to wyszło tak, a nie inaczej.
#7
Posted 08.10.2010 22:47
To jutro zrobie to co opisałeś.
A może ma ktoś sprite lghtning.spr? Albo czy tego sprite da się zrobić, żeby bił z góry, a nie od gracza który tego używa?
A może ma ktoś sprite lghtning.spr? Albo czy tego sprite da się zrobić, żeby bił z góry, a nie od gracza który tego używa?
#8
Posted 08.10.2010 22:54
CreateBolt( entPlayer, iVictimOrigin );
CreateBolt( iPlayer, iVictim[3] ) {
message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
write_byte( 0 )
write_coord( iVictim[ 0 ] ) //x
write_coord( iVictim[ 1 ] ) //y
write_coord( iVictim[ 2 ] ) //z
write_coord( iVictim[ 0 ] )
write_coord( iVictim[ 1 ] )
write_coord( iVictim[ 2 ] )
write_short( light )
write_byte( 1 )
write_byte( 5 )
write_byte( 2 )
write_byte( 20 )
write_byte( 30 )
write_byte( 255 )
write_byte( 255 )
write_byte( 255 )
write_byte( 200 )
write_byte( 200 )
message_end( )
}
I dowolnie ustalasz wektory od gracza w który ma uderzyć
Sprite możesz wziąć, z ZP albo War3, bo były na pewno.
#9
Posted 08.10.2010 23:04
DELETED.
Dodano 09 październik 2010 - 21:08:
Teraz to już mi crashuje serwer. Po pierwsze można użyć ile razy się chce i nawet na M4 a jak odejde za daleko i wcisne E to crashuje serwer.
Dodano 10 październik 2010 - 19:06:
Może ktoś to lepiej zrobić? Bo niestety nie działa... Stara wersja tylko raz razi a potem crashuje.
Dodano 09 październik 2010 - 21:08:
Teraz to już mi crashuje serwer. Po pierwsze można użyć ile razy się chce i nawet na M4 a jak odejde za daleko i wcisne E to crashuje serwer.
public fw_PlayerPreThink( client ) {
if( !is_user_alive( client ) )
return PLUGIN_CONTINUE;
if ( ( get_user_button( client ) & IN_USE ) && piorunek[client] == 1 )
{
MakeThunderBolt( client );
}
return PLUGIN_CONTINUE;
}
public MakeThunderBolt( client ) {
if( ( !is_user_alive( client ) ) || ( g_thunderbolt[ client ] == 17 ) )
return;
new iMakerOrigin[ 3 ], Float:iMakeOriginSe[3];
get_user_origin( client, iMakerOrigin );
for( new i = 0; i < 3; i++ ){
iMakeOriginSe[i] = float( iMakerOrigin[i] );
}
new entPlayer;
entPlayer = -1;
new iVictimOrigin[ 3 ];
while( ( entPlayer = find_ent_in_sphere( client, iMakeOriginSe, 550.0 ) ) != 0 )
{
if( IsPlayer( entPlayer ) && entPlayer != client )
{
get_user_origin( entPlayer, iVictimOrigin );
CreateBolt( iVictimOrigin );
change_health( entPlayer, -80, 0, "world" );
g_thunderbolt[ client ]++;
}
}
}
CreateBolt( iVictim[3] ) {
message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
write_byte( 0 )
write_coord( iVictim[ 0 ] )
write_coord( iVictim[ 1 ] )
write_coord( iVictim[ 2 ] + 700)
write_coord( iVictim[ 0 ] )
write_coord( iVictim[ 1 ] )
write_coord( iVictim[ 2 ] )
write_short( light )
write_byte( 1 )
write_byte( 5 )
write_byte( 2 )
write_byte( 20 )
write_byte( 30 )
write_byte( 255 )
write_byte( 255 )
write_byte( 255 )
write_byte( 200 )
write_byte( 200 )
message_end( )
}
Dodano 10 październik 2010 - 19:06:
Może ktoś to lepiej zrobić? Bo niestety nie działa... Stara wersja tylko raz razi a potem crashuje.
Edited by Screeaam..., 09.10.2010 21:08.