Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
12.09.2001, 21:50
Retro



Moin, ich hab nen paar Fragen, obwohl einige eher Wiederholungen sind, aber ich hab noch keine Antwort drauf, und ich kann mir selber schlecht weiterhelfen, wenn ich es nicht Weis. Obwohl ich viel rumprobiere...

1) Es werde Licht...
Also ich möchte immer nen kleines Licht an der Einschlagstelle von ner Kugel spwanen lassen. Bei der Handgranate oder dem Crossbow ist das Server-Side per Msg gemacht.

Die anderen Schusswaffen von mir haben natürlöich ne höhere Schussrate, somit müsste ja bei jedem Schuss ne Msg übertragen werden. Aber das geht je etwas zu sehr auf den Traffic. Ich hab hier wo anders schonmal gefragt, wie man nen TempLight Clientside spwanen lassen kann, und habe im normalen Code das hier gefunden:Quellcode:dlight_t *dl = gEngfuncs.pEfxAPI->CL_AllocDlight (0);
vecSrc;
dl->radius = 60;
dl->color.r = 255;
dl->color.g = 120;
dl->color.b = 0;
dl->die = 5;
das sollte ja reichen um nen Lichteffekt hin zu kriegen, zwar nicht am Auftreffpunk der Kugel, aber beim Player. Und das reicht mir erstmal, da ich dann ja nur noch den Vektor ändern muss.
Naja, hört sich ja so schön an - aber leider passiert da garnichts ;(
Ich hab es in die EV_FireM16 geschrieben, also auch dort wo der andere visuelle kram gemacht wird. Leider passiert garnichts, kein Licht...

2) Nen Ziel-laser (strahl)
Also den ganzen Post gibts Hier.

Also ich habe den Folgenden Code in der ev_hldm.cpp, hinter den FireBullets.Quellcode:void EV_FireLaser( event_args_t *args )
{
int idx;
vec3_t origin;
vec3_t angles;
vec3_t velocity;
float flDamage = 9; //setz da ein was du willst

int m_iWeaponVolume = GAUSS_PRIMARY_FIRE_VOLUME;
vec3_t vecSrc;
vec3_t vecDest;
pmtrace_t tr, beam_tr;
physent_t *pEntity;
int m_iBeam;
vec3_t up, right, forward;

idx = args->entindex;
VectorCopy( args->origin, origin );
VectorCopy( args->angles, angles );
VectorCopy( args->velocity, velocity );

EV_GetGunPosition( args, vecSrc, origin );

m_iBeam = gEngfuncs.pEventAPI->EV_FindModelIndex( "sprites/lgtning.spr" ); //Oder irgendeinanderes Sprite

AngleVectors( angles, forward, right, up );

VectorMA( vecSrc, 8192, forward, vecDest );

if ( EV_IsLocal( idx ) )
{
gEngfuncs.pEventAPI->EV_WeaponAnimation( MP5_FIRE2, 2 );
}

gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/hks1.wav", 1, ATTN_NORM, 0, 94 + gEngfuncs.pfnRandomLong( 0, 0xf ) ); //kannst auch irgendein anderen Sound nehmen, musst du nur in deiner Waffe precachen

gEngfuncs.pEventAPI->EV_SetUpPlayerPrediction( false, true );

// Store off the old count
gEngfuncs.pEventAPI->EV_PushPMStates();

// Now add in all of the players.
gEngfuncs.pEventAPI->EV_SetSolidPlayers ( idx - 1 );

gEngfuncs.pEventAPI->EV_SetTraceHull( 2 );
gEngfuncs.pEventAPI->EV_PlayerTrace( vecSrc, vecDest, PM_STUDIO_BOX, -1, &tr );

gEngfuncs.pEventAPI->EV_PopPMStates();

pEntity = gEngfuncs.pEventAPI->EV_GetPhysent( tr.ent );

if ( EV_IsLocal( idx ) )
{
// Add muzzle flash to current weapon model
EV_MuzzleFlash();
}

gEngfuncs.pEfxAPI->R_BeamEntPoint(
origin + up * 15, //ungefähre Gesichtsposi
tr.endpos,
m_iBeam,
0.1, //Life
0.7, // Width * 50
0.20, // Noise * 100
255.0, //Brightness
0, 0, 0, 255, // Red
0, // Green
0 // BLue
);

//Decal
EV_HLDM_DecalGunshot( &tr, BULLET_MONSTER_12MM );
}
(Thx an Overmind)

So, nun soll dieser Laser jedesmal erscheinen wenn bei der M16 SecondaryAttack aufgerufen wird. Aber wie soll ich den Event in der ev_hldm.cpp nun aufrufen? Ist die Frage peinlich? Ich weis im moment nicht ob sie zu lächerlich für ne Antwort ist, oder ob es wirklich keiner weis =(

3) Etwas Triggern...
Auch ne Wiederholung =( Hier.

Tja, dürfte selbsterklärend sein... Aber ich finde im Code auch nichts derartiges, das man sich abgucken könnte.

4) Die letzte.. ;)
Rechts oben in der Ecke erscheint ja immer nen Kill-Icon, wenn man im MP jemanden getötet hat. Jetzt habe ich in die Mod Headshots implementiert.
Vom Schaden her geht es auch super, nur als Bonus möchte ich es auch oben rechts anzeigen lassen, wenn man jemanden mit nem Headshot gekillt hat. So wie in CS (oder wars TFC?) auch...

Also das Icon habe ich jetzt schon als Sprite da, wie man den selben setzt is mir auch klar. Aber wo wird festgelegt, welcher Sprite immer gezeigt wird?
Normalerweise wird ja immer das Icon der Waffe angezeigt, mit welcher der Gegner getötet wurde.

So, das wars, ich hoffe es wird was. Thx schonmal im Voraus.

--

shielding people from their own stupidity is an evolutionary step backwards anyway.

/* God is dead!............Nietzsche */
/* Nietzsche is dead!......God */
/* Nietzsche is God!.......The Dead */


Dieser Beitrag wurde am 12.09.2001 um 21:52 von Retro bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
12.09.2001, 22:23
The_Overmind



1.) Statt vecSrc muss da dl->origin = vecSrc; hin
2.) Die Funktion oben in der ev_hldm.cpp definieren
Dann in der hl_events.cpp auch nochmal oben definieren und unten die Funktion einer SC Datei zuordnen. Diese Datei MUSS im Events Ordner sein.
Dann kannst du Server-Seitig wie bei der MP5 in der SecondaryAttack() Funktion per "PLAYBACK_EVENT( 0, m_pPlayer->edict(), m_usFireLaser );" den Laser abspielen. Natürlich musst du das Event wie in der Mp5 auch Precachen und in der Klasse mitangeben.

3.) no idea
4.) no idea

Hoffe ich konnt dir soweit helfen :)

MfG
[-XHP-]The Overmind

[Edit]
Hab grad bei meinem eigenem Code gesehen:

dl->die = gEngfuncs.GetClientTime() + 0.5;

So musses sein :)

--


Dieser Beitrag wurde am 12.09.2001 um 22:24 von The_Overmind bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
002
12.09.2001, 23:20
Retro



Aaaalso, das mit dem Licht funzt jetzt super.. Thx! ;)
War auch irgendwie logisch wenn da überall dl-> davor steht *g*
Und das mit GetClientTime war auch im Code so, stimmt...

Der laser tut leider immer noch nichts =\
m16.cpp
Quellcode:(...)
private:
unsigned short m_usM16;

unsigned short m_usArtilleryLaser;
Quellcode:void CM16::Precache( void )
{
(...)
PRECACHE_SOUND ("weapons/357_cock1.wav");

m_usM16 = PRECACHE_EVENT( 1, "events/m16.sc" );

m_usArtilleryLaser = PRECACHE_EVENT( 1, "events/artillerylaser.sc" );
}
Quellcode:void CM16::SecondaryAttack()
{
// Laser effect
PLAYBACK_EVENT( 2, m_pPlayer->edict(), m_usArtilleryLaser );
}

So, sieht komplett aus.
Aber wenn ich es teste, passiert garnichts =(
Client-Side ist alles so wies sein soll, also auch mit dem Event...

--

shielding people from their own stupidity is an evolutionary step backwards anyway.

/* God is dead!............Nietzsche */
/* Nietzsche is dead!......God */
/* Nietzsche is God!.......The Dead */

zum Seitenanfang zum Seitenende Profil || Suche
003
12.09.2001, 23:22
The_Overmind



siehe oberen Post
bezüglich hl_events.cpp :))

--

zum Seitenanfang zum Seitenende Profil || Suche
004
12.09.2001, 23:31
Retro



Hehe, denkste ;)Quellcode:/***
*
* Copyright (c) 1999, Valve LLC. All rights reserved.
*
* This product contains software technology licensed from Id
* Software, Inc. ("Id Technology").  Id Technology (c) 1996 Id Software, Inc.
* All Rights Reserved.
*
*   Use, distribution, and modification of this source code and/or resulting
*   object code is restricted to non-commercial enhancements to products from
*   Valve LLC.  All other use, distribution, or modification is prohibited
*   without written permission from Valve LLC.
*
****/
#include "../hud.h"
#include "../cl_util.h"
#include "event_api.h"

extern "C"
{
// HLDM
void EV_FireGlock1( struct event_args_s *args  );
void EV_FireGlock2( struct event_args_s *args  );
void EV_FireShotGunSingle( struct event_args_s *args  );
void EV_FireShotGunDouble( struct event_args_s *args  );
void EV_FireMP5( struct event_args_s *args  );
void EV_FireM16( struct event_args_s *args  );
void EV_FireFAMAS( struct event_args_s *args  );
void EV_FirePython( struct event_args_s *args  );
void EV_FireGauss( struct event_args_s *args  );
void EV_SpinGauss( struct event_args_s *args  );
void EV_TrainPitchAdjust( struct event_args_s *args );
void EV_ArtilleryLaser( struct event_args_s *args );
}

/*
======================
Game_HookEvents

Associate script file name with callback functions.  Callback's must be extern "C" so
the engine doesn't get confused about name mangling stuff.  Note that the format is
always the same.  Of course, a clever mod team could actually embed parameters, behavior
into the actual .sc files and create a .sc file parser and hook their functionality through
that.. i.e., a scripting system.

That was what we were going to do, but we ran out of time...oh well.
======================
*/
void Game_HookEvents( void )
{
gEngfuncs.pfnHookEvent( "events/glock1.sc", EV_FireGlock1 );
gEngfuncs.pfnHookEvent( "events/glock2.sc", EV_FireGlock2 );
gEngfuncs.pfnHookEvent( "events/shotgun1.sc", EV_FireShotGunSingle );
gEngfuncs.pfnHookEvent( "events/shotgun2.sc", EV_FireShotGunDouble );
gEngfuncs.pfnHookEvent( "events/mp5.sc", EV_FireMP5 );
gEngfuncs.pfnHookEvent( "events/m16.sc", EV_FireM16 );
gEngfuncs.pfnHookEvent( "events/famas.sc", EV_FireFAMAS );
gEngfuncs.pfnHookEvent( "events/python.sc", EV_FirePython );
gEngfuncs.pfnHookEvent( "events/gauss.sc", EV_FireGauss );
gEngfuncs.pfnHookEvent( "events/gaussspin.sc", EV_SpinGauss );
gEngfuncs.pfnHookEvent( "events/train.sc", EV_TrainPitchAdjust );
gEngfuncs.pfnHookEvent( "events/artillerylaser.sc", EV_ArtilleryLaser );
}

Oben und unten drinne... hmpf. =\

--

shielding people from their own stupidity is an evolutionary step backwards anyway.

/* God is dead!............Nietzsche */
/* Nietzsche is dead!......God */
/* Nietzsche is God!.......The Dead */

zum Seitenanfang zum Seitenende Profil || Suche
005
12.09.2001, 23:45
The_Overmind



Bitte ?? *dumm guck*
Ich hab meine Events ALLE so eingebunden und es funktioniert tadellos...

--

zum Seitenanfang zum Seitenende Profil || Suche
006
13.09.2001, 12:44
Polymorph



@Retro: könnte es sein, dass der Event nicht abgespielt wird wegen der 2 im PLAYBACK_EVENT ? mach daraus mal ne 0.

Außerdem nochmal zu deinem DLight stuff, ich hab auch so tolles buntes Licht bei Kugel einschlägen. Hier:
einfach in EV_HLDM_DecalGunshot in ev_hldm.cpp packen

Quellcode:
dlight_t *dl = EFX_CL_ALLOC_DLIGHT (0);
VectorCopy (pTrace->endpos, dl->origin);
dl->radius = 48;
dl->color.r = 255;
dl->color.g = 170;
dl->color.b = 0;
dl->die = ENG_GET_CLIENT_TIME () + 0.25;

natürlich an die richtige case-Marke.

3.) Wo ist denn da jetzt das Problem, wenn du drei Felder hast, wo du Targets eintragen kannst? Wenn du allerdings variabel viele Entities eintragen kannst bzw. das so willst, wirds auf jedenfall n bischen tricky.

Quellcode:
switch (RANDOM_LONG(0,2))
{
  case 0:
        FireTargets (m_pszErstesTarget, pActivator, pCaller, useType, value);
        break;
  case 1:
        FireTargets (m_pszZwotesTarget, pActivator, pCaller, useType, value);
        break;
  case 2:
        FireTargets (m_pszDrittesTarget, pActivator, pCaller, useType, value);
        break;
}

4.) Wo genau kann ich dir auch nicht sagen, aber guck mal in death.cpp und dann in der Funktion MsgFunc_DeathMsg. Dort gibs ein paar Lines die das korrekte Sprite raussuchen (nämlich das, was anzeigt mit welcher Waffe man gekillt wurde). Und zwar hier:

Quellcode:
char killedwith[32];
strcpy( killedwith, "d_" );
strncat( killedwith, READ_STRING(), 32 );

in der letzten zeile (das strncat) liest er den namen der Waffe aus der Message, also gehen wir jetzt mal fluchs zum Server... ;)
Eine Suche nach gmsgDeathNotice führt uns direkt zu CHalfLifeMultiplay::DeathNotice. Am Anfang der Funktion wird festgelegt, mit welcher Waffe bzw. welches Monster einen getötet hat und die Prefixe werden rausgenommen (weapon_* und monster_* etc.). Irgendwo hier solltest du folgenden check einbauen, bzw. etwas ähnliches (nicht getestet, also ohne Gewehr ;)

Quellcode:
if ( pVictim->m_LastHitGroup == HITGROUP_HEAD )
strcpy (killer_weapon_name, "headshot");

das sollte funzen, IMHO. dann packst du einfach nen Sprite namens d_headshot in deinmod\sprites und schon dürfteste ne Headshot Anzeige haben.

Hoffe, ich konnte dir helfen

--

----------------------------------------
[url="mailto:polymorph@gdnmail.net"]Polymorph[/url]
Lead Programmer of Paroxysm - Alien Encounters

zum Seitenanfang zum Seitenende Profil || Suche
007
13.09.2001, 14:48
Retro



1) Hab ichs chon alleine gelöst ;) Hab ne Extra Funktion EV_HLDM_BulletFlash gemacht, die dann von den jeweiligen BULLETS in der EV_HLDM_FIREBULLETS aufgerufen wird :) Aber trotzdem Thx

2) Stimmt, warum ich dort ne 2 geschrieben habe weiss ich auch nicht. Jetzt hab ichs durch ne 0 ersetzt, aber es passiert trotzdem nichts =(

3) Hmm, easy - Thx, nen bissel trixen werd ich schon, da die angabe von Zielobjekten variable ist, aber das hab ich mir schon aus dem multi_manager abgeschaut =)

4) Thx, hat mich auch weiter gebracht, mit der Info krieg ichs hin!

Tja, jetzt bleibt nur noch der dumme Laser ;(

--

shielding people from their own stupidity is an evolutionary step backwards anyway.

/* God is dead!............Nietzsche */
/* Nietzsche is dead!......God */
/* Nietzsche is God!.......The Dead */

zum Seitenanfang zum Seitenende Profil || Suche