Page 1 of 1

Kamuolys

Posted: 2013 Sep 02 18:40
by OriGinal
Sveiki. Atsinaujinau serverį į amxmodx 1.8.3 ir pradėjo netinkamai veikt vienas iš pluginų. Palietus kamuolį jis iškart dingsta, nors prieš tai viskas veikė puikiai. Kame galėtų būti klaida?

Code: Select all

register_touch( g_szBallName, "player", "FwdTouchPlayer" ); public FwdTouchPlayer( Ball, id ) {    if( is_user_bot( id ) )        return PLUGIN_CONTINUE;        static iOwner; iOwner = pev( Ball, pev_iuser1 );        if( iOwner == 0 ) {        entity_set_int( Ball, EV_INT_iuser1, id );        beam(10)        emit_sound(Ball, CHAN_ITEM, gotball, 1.0, ATTN_NORM, 0, PITCH_NORM);    }        return PLUGIN_CONTINUE;}
Jokių klaidų loguose nėra.

Re: Kamuolys

Posted: 2013 Sep 02 18:48
by InvIs
Pabandyk pluginą susikompiliuoti su naujausiais .inc failais.

Re: Kamuolys

Posted: 2013 Sep 02 18:51
by OriGinal
Prieš atnaujindamas padariau tai visiems pluginams, šiam taip pat.

Re: Kamuolys

Posted: 2013 Sep 02 20:00
by aaarnas
Kamuolys kad dingtų, tai arba:
* Jis yra kažkur nukeliamas (nuteleportuojamas)
* Padaromas nematomu (pakeičiamas modelis, render)
* Ištrinamas entity.

Jei nė vienas iš šių dalykų negali būti padaromas toje funkcijoje. Vadinasi - amxmodx bug.

Re: Kamuolys

Posted: 2013 Sep 02 20:58
by OriGinal
Galbūt tai gali būti susiję su engine atnaujinimais (nes kaip sakiau, tai prasidėjo tada)?

Re: Kamuolys

Posted: 2013 Sep 02 21:07
by aaarnas
Visko įmanoma. Geriausia būtų atsekti ties kuria funkcija kamuolys pradingsta.

Re: Kamuolys

Posted: 2013 Sep 03 18:00
by OriGinal
Tikriausiai dingsta šioje funkcijoje:

Code: Select all

register_think( g_szBallName, "FwdThinkBall" ); public FwdThinkBall( iEntity ) {    if( !is_valid_ent( g_iBall   ) )        return PLUGIN_HANDLED;        entity_set_float( iEntity, EV_FL_nextthink, halflife_time( ) + 0.05 );        static Float:vOrigin[ 3 ], Float:vBallVelocity[ 3 ];    entity_get_vector( iEntity, EV_VEC_origin, vOrigin );    entity_get_vector( iEntity, EV_VEC_velocity, vBallVelocity );        static iOwner; iOwner = pev( iEntity, pev_iuser1 );    static iSolid; iSolid = pev( iEntity, pev_solid );        // palietus kamuolį iOwner tampa > 0    if( iOwner > 0 ) {        static Float:vOwnerOrigin[ 3 ];        entity_get_vector( iOwner, EV_VEC_origin, vOwnerOrigin );                static const Float:vVelocity[ 3 ] = { 1.0, 1.0, 0.0 };                if( !is_user_alive( iOwner ) ) {            entity_set_int( iEntity, EV_INT_iuser1, 0 );                        vOwnerOrigin[ 2 ] += 5.0;                        entity_set_origin( iEntity, vOwnerOrigin );            entity_set_vector( iEntity, EV_VEC_velocity, vVelocity );                        return PLUGIN_CONTINUE;        }                if( iSolid != SOLID_NOT )            set_pev( iEntity, pev_solid, SOLID_NOT );        // galbūt kažkur čia?        static Float:vAngles[ 3 ], Float:vReturn[ 3 ];        entity_get_vector( iOwner, EV_VEC_v_angle, vAngles );                vReturn[ 0 ] = ( floatcos( vAngles[ 1 ], degrees ) * 55.0 ) + vOwnerOrigin[ 0 ];        vReturn[ 1 ] = ( floatsin( vAngles[ 1 ], degrees ) * 55.0 ) + vOwnerOrigin[ 1 ];        vReturn[ 2 ] = vOwnerOrigin[ 2 ];        vReturn[ 2 ] -= ( entity_get_int( iOwner, EV_INT_flags ) & FL_DUCKING ) ? 10 : 30;                entity_set_vector( iEntity, EV_VEC_velocity, vVelocity );        entity_set_origin( iEntity, vReturn );        //    } else {        if( iSolid != SOLID_BBOX )            set_pev( iEntity, pev_solid, SOLID_BBOX );                static Float:flLastVerticalOrigin;                if( vBallVelocity[ 2 ] == 0.0 ) {            static iCounts;                        if( flLastVerticalOrigin > vOrigin[ 2 ] ) {                iCounts++;                                if( iCounts > 10 ) {                    iCounts = 0;                                        UpdateBall( 0 );                }            } else {                iCounts = 0;                                if( PointContents( vOrigin ) != CONTENTS_EMPTY )                    UpdateBall( 0 );            }                        flLastVerticalOrigin = vOrigin[ 2 ];        }    }        return PLUGIN_CONTINUE;}

Re: Kamuolys

Posted: 2013 Sep 03 19:13
by aaarnas
SOLID_XXX pakeičia tik sąveikos su pasauliu parametrus, bet pradanginti nelabai gali. Jei pagal šitą funkciją, tai arba koordinatės blogos, arba vektorius kažkoks blogas nustatomas, kad kamuolys išlėkia kažkur (bet matytųsi tada).
Ką galima pamėginti, tai parašyti chat komandą kokią, kuri patiktina ar entity egzistuoja, kokia jo būsena, koordinatės ir tt:

Code: Select all

#include <engine> public plugin_init() {        register_clcmd("say /check", "check_ball")} public check_ball(id) {     new ent = ballid // kamuolio ent id        if (is_valid_ent(ent)) {                new Float:ballorig[3], Float:porig[3]        entity_get_vector(ent, EV_VEC_origin, ballorig)        entity_get_vector(id, EV_VEC_origin, porig)                client_print(id, print_chat, "Kamuolio koordinates: %.1f %.1f %.1f", ballorig[0], ballorig[1], ballorig[2])        client_print(id, print_center, "Tavo koordinates: %.1f %.1f %.1f", porig[0], porig[1], porig[2])                client_print(id, print_chat, "Atstumas nuo taves iki kamuolio: %.2f",        floatsqroot((ballorig[0]-porig[0])*(ballorig[0]-porig[0])+(ballorig[1]-porig[1])*(ballorig[1]-porig[1])+(ballorig[2]-porig[2])*(ballorig[2]-porig[2])))        client_print(id, print_chat, "Render mode: %d Render fx: %d Render amount: %.2f",        entity_get_int(ent, EV_INT_rendermode), entity_get_int(ent, EV_INT_renderfx), entity_get_float(ent, EV_FL_renderamt))    }    else {        client_print(id, print_chat, "Kamuolys neegzistuoja! Istrintas")    }} 

Re: Kamuolys

Posted: 2013 Sep 03 20:22
by OriGinal
Padariau kelis patikrinimus paėmęs kamuolį:

Code: Select all

Kamuolio koordinates: 186.0 298.2 1102069759.9Tavo koordinates: 212.1 346.6 52.0Atstumas nuo taves iki kamuolio: 1102069759.99Render mode: 0 Render fx: 19 Render amount: 1.00

Code: Select all

Kamuolio koordinates: -405.3 351.6 1102069759.9Tavo koordinates: -352.9 334.8 52.0Atstumas nuo taves iki kamuolio: 1102069759.99Render mode: 0 Render fx: 19 Render amount: 1.00

Code: Select all

Kamuolio koordinates: -535.2 747.2 1102069759.9Tavo koordinates: -491.0 779.8 52.0Atstumas nuo taves iki kamuolio: 1102069759.99Render mode: 0 Render fx: 19 Render amount: 1.00

Code: Select all

Kamuolio koordinates: 1408.9 782.5 1102069759.9Tavo koordinates: 1463.9 783.5 52.0Atstumas nuo taves iki kamuolio: 1102069759.99Render mode: 0 Render fx: 19 Render amount: 1.00
Tad kaip čia tas koordinates sutvarkyt reiktų?

Re: Kamuolys

Posted: 2013 Sep 03 21:11
by aaarnas
Tai kažkur arba origin[2] arba velocity[2] nustatomas labai didelis skaičius. Dėl to, kamuolys taip aukštai atsiduria.
Čia jau reikėtų sėsti prie plugino ir žiūrėti kur kas. Galima pasidebuginti. Prieš visas vietas, kur nustatomas [2] kamuolio origin ir vector parametras atspauzdinti į log reikšmės ir žiūrėti kur jos tampa negeros.

Code: Select all

log_amx("'Funkcijos pavadinimas' origin[2]: %0.1f vector[2]: %0.1f", origin[2], vector[2])