helper function for weapon scripts (less duplicate code)

cleanup some register code
angelscript exceptions have a stacktrace now
optimize some networking code (only create packet when a packet is gonna be sent, instead of every frame
This commit is contained in:
learn_more 2013-11-03 17:13:49 +01:00
parent 535bc99608
commit 2a24e662cd
6 changed files with 101 additions and 173 deletions

View File

@ -355,24 +355,15 @@ namespace spades {
renderer->RegisterModel("Models/Weapons/Shotgun/Weapon.kv6");
renderer->RegisterModel("Models/Weapons/Shotgun/WeaponNoPump.kv6");
renderer->RegisterModel("Models/Weapons/Shotgun/Pump.kv6");
renderer->RegisterModel
("Models/Player/Arm.kv6");
renderer->RegisterModel
("Models/Player/UpperArm.kv6");
renderer->RegisterModel
("Models/Player/LegCrouch.kv6");
renderer->RegisterModel
("Models/Player/TorsoCrouch.kv6");
renderer->RegisterModel
("Models/Player/Leg.kv6");
renderer->RegisterModel
("Models/Player/Torso.kv6");
renderer->RegisterModel
("Models/Player/Arms.kv6");
renderer->RegisterModel
("Models/Player/Head.kv6");
renderer->RegisterModel
("Models/MapObjects/Intel.kv6");
renderer->RegisterModel("Models/Player/Arm.kv6");
renderer->RegisterModel("Models/Player/UpperArm.kv6");
renderer->RegisterModel("Models/Player/LegCrouch.kv6");
renderer->RegisterModel("Models/Player/TorsoCrouch.kv6");
renderer->RegisterModel("Models/Player/Leg.kv6");
renderer->RegisterModel("Models/Player/Torso.kv6");
renderer->RegisterModel("Models/Player/Arms.kv6");
renderer->RegisterModel("Models/Player/Head.kv6");
renderer->RegisterModel("Models/MapObjects/Intel.kv6");
renderer->RegisterModel("Models/MapObjects/CheckPoint.kv6");
renderer->RegisterImage("Gfx/Sight.tga");
renderer->RegisterImage("Gfx/Bullet/7.62mm.tga");
@ -390,9 +381,6 @@ namespace spades {
net = new NetClient(this);
net->Connect(hostname);
//net->Connect("192.168.24.24");
//net->Connect("127.0.0.1");
// decide log file name
std::string fn = hostname.asString(false);
std::string fn2;

View File

@ -65,116 +65,42 @@ namespace spades {
IRenderer *renderer = client->GetRenderer();
IAudioDevice *audio = client->GetAudioDevice();
static ScriptFunction spadeFactory
("ISpadeSkin@ CreateThirdPersonSpadeSkin(Renderer@, AudioDevice@)");
ctx = spadeFactory.Prepare();
ctx->SetArgObject(0, reinterpret_cast<void*>(renderer));
ctx->SetArgObject(1, reinterpret_cast<void*>(audio));
ctx.ExecuteChecked();
spadeSkin = reinterpret_cast<asIScriptObject *>(ctx->GetReturnObject());
spadeSkin->AddRef();
static ScriptFunction spadeFactory("ISpadeSkin@ CreateThirdPersonSpadeSkin(Renderer@, AudioDevice@)");
spadeSkin = initScriptFactory( spadeFactory, renderer, audio );
static ScriptFunction spadeViewFactory
("ISpadeSkin@ CreateViewSpadeSkin(Renderer@, AudioDevice@)");
ctx = spadeViewFactory.Prepare();
ctx->SetArgObject(0, reinterpret_cast<void*>(renderer));
ctx->SetArgObject(1, reinterpret_cast<void*>(audio));
ctx.ExecuteChecked();
spadeViewSkin = reinterpret_cast<asIScriptObject *>(ctx->GetReturnObject());
spadeViewSkin->AddRef();
static ScriptFunction spadeViewFactory("ISpadeSkin@ CreateViewSpadeSkin(Renderer@, AudioDevice@)");
spadeViewSkin = initScriptFactory( spadeViewFactory, renderer, audio );
static ScriptFunction blockFactory
("IBlockSkin@ CreateThirdPersonBlockSkin(Renderer@, AudioDevice@)");
ctx = blockFactory.Prepare();
ctx->SetArgObject(0, reinterpret_cast<void*>(renderer));
ctx->SetArgObject(1, reinterpret_cast<void*>(audio));
ctx.ExecuteChecked();
blockSkin = reinterpret_cast<asIScriptObject *>(ctx->GetReturnObject());
blockSkin->AddRef();
static ScriptFunction blockFactory("IBlockSkin@ CreateThirdPersonBlockSkin(Renderer@, AudioDevice@)");
blockSkin = initScriptFactory( blockFactory, renderer, audio );
static ScriptFunction blockViewFactory
("IBlockSkin@ CreateViewBlockSkin(Renderer@, AudioDevice@)");
ctx = blockViewFactory.Prepare();
ctx->SetArgObject(0, reinterpret_cast<void*>(renderer));
ctx.ExecuteChecked();
blockViewSkin = reinterpret_cast<asIScriptObject *>(ctx->GetReturnObject());
blockViewSkin->AddRef();
static ScriptFunction blockViewFactory("IBlockSkin@ CreateViewBlockSkin(Renderer@, AudioDevice@)");
blockViewSkin = initScriptFactory( blockViewFactory, renderer, audio );
static ScriptFunction grenadeFactory
("IGrenadeSkin@ CreateThirdPersonGrenadeSkin(Renderer@, AudioDevice@)");
ctx = grenadeFactory.Prepare();
ctx->SetArgObject(0, reinterpret_cast<void*>(renderer));
ctx->SetArgObject(1, reinterpret_cast<void*>(audio));
ctx.ExecuteChecked();
grenadeSkin = reinterpret_cast<asIScriptObject *>(ctx->GetReturnObject());
grenadeSkin->AddRef();
static ScriptFunction grenadeFactory("IGrenadeSkin@ CreateThirdPersonGrenadeSkin(Renderer@, AudioDevice@)");
grenadeSkin = initScriptFactory( grenadeFactory, renderer, audio );
static ScriptFunction grenadeViewFactory
("IGrenadeSkin@ CreateViewGrenadeSkin(Renderer@, AudioDevice@)");
ctx = grenadeViewFactory.Prepare();
ctx->SetArgObject(0, reinterpret_cast<void*>(renderer));
ctx->SetArgObject(1, reinterpret_cast<void*>(audio));
ctx.ExecuteChecked();
grenadeViewSkin = reinterpret_cast<asIScriptObject *>(ctx->GetReturnObject());
grenadeViewSkin->AddRef();
static ScriptFunction grenadeViewFactory("IGrenadeSkin@ CreateViewGrenadeSkin(Renderer@, AudioDevice@)");
grenadeViewSkin = initScriptFactory( grenadeViewFactory, renderer, audio );
static ScriptFunction rifleFactory
("IWeaponSkin@ CreateThirdPersonRifleSkin(Renderer@, AudioDevice@)");
static ScriptFunction smgFactory
("IWeaponSkin@ CreateThirdPersonSMGSkin(Renderer@, AudioDevice@)");
static ScriptFunction shotgunFactory
("IWeaponSkin@ CreateThirdPersonShotgunSkin(Renderer@, AudioDevice@)");
static ScriptFunction rifleViewFactory
("IWeaponSkin@ CreateViewRifleSkin(Renderer@, AudioDevice@)");
static ScriptFunction smgViewFactory
("IWeaponSkin@ CreateViewSMGSkin(Renderer@, AudioDevice@)");
static ScriptFunction shotgunViewFactory
("IWeaponSkin@ CreateViewShotgunSkin(Renderer@, AudioDevice@)");
static ScriptFunction rifleFactory("IWeaponSkin@ CreateThirdPersonRifleSkin(Renderer@, AudioDevice@)");
static ScriptFunction smgFactory("IWeaponSkin@ CreateThirdPersonSMGSkin(Renderer@, AudioDevice@)");
static ScriptFunction shotgunFactory("IWeaponSkin@ CreateThirdPersonShotgunSkin(Renderer@, AudioDevice@)");
static ScriptFunction rifleViewFactory("IWeaponSkin@ CreateViewRifleSkin(Renderer@, AudioDevice@)");
static ScriptFunction smgViewFactory("IWeaponSkin@ CreateViewSMGSkin(Renderer@, AudioDevice@)");
static ScriptFunction shotgunViewFactory("IWeaponSkin@ CreateViewShotgunSkin(Renderer@, AudioDevice@)");
switch(p->GetWeapon()->GetWeaponType()){
case RIFLE_WEAPON:
ctx = rifleFactory.Prepare();
ctx->SetArgObject(0, reinterpret_cast<void*>(renderer));
ctx->SetArgObject(1, reinterpret_cast<void*>(audio));
ctx.ExecuteChecked();
weaponSkin = reinterpret_cast<asIScriptObject *>(ctx->GetReturnObject());
weaponSkin->AddRef();
ctx = rifleViewFactory.Prepare();
ctx->SetArgObject(0, reinterpret_cast<void*>(renderer));
ctx->SetArgObject(1, reinterpret_cast<void*>(audio));
ctx.ExecuteChecked();
weaponViewSkin = reinterpret_cast<asIScriptObject *>(ctx->GetReturnObject());
weaponViewSkin->AddRef();
weaponSkin = initScriptFactory( rifleFactory, renderer, audio );
weaponViewSkin = initScriptFactory( rifleViewFactory, renderer, audio );
break;
case SMG_WEAPON:
ctx = smgFactory.Prepare();
ctx->SetArgObject(0, reinterpret_cast<void*>(renderer));
ctx->SetArgObject(1, reinterpret_cast<void*>(audio));
ctx.ExecuteChecked();
weaponSkin = reinterpret_cast<asIScriptObject *>(ctx->GetReturnObject());
weaponSkin->AddRef();
ctx = smgViewFactory.Prepare();
ctx->SetArgObject(0, reinterpret_cast<void*>(renderer));
ctx->SetArgObject(1, reinterpret_cast<void*>(audio));
ctx.ExecuteChecked();
weaponViewSkin = reinterpret_cast<asIScriptObject *>(ctx->GetReturnObject());
weaponViewSkin->AddRef();
weaponSkin = initScriptFactory( smgFactory, renderer, audio );
weaponViewSkin = initScriptFactory( smgViewFactory, renderer, audio );
break;
case SHOTGUN_WEAPON:
ctx = shotgunFactory.Prepare();
ctx->SetArgObject(0, reinterpret_cast<void*>(renderer));
ctx->SetArgObject(1, reinterpret_cast<void*>(audio));
ctx.ExecuteChecked();
weaponSkin = reinterpret_cast<asIScriptObject *>(ctx->GetReturnObject());
weaponSkin->AddRef();
ctx = shotgunViewFactory.Prepare();
ctx->SetArgObject(0, reinterpret_cast<void*>(renderer));
ctx->SetArgObject(1, reinterpret_cast<void*>(audio));
ctx.ExecuteChecked();
weaponViewSkin = reinterpret_cast<asIScriptObject *>(ctx->GetReturnObject());
weaponViewSkin->AddRef();
weaponSkin = initScriptFactory( shotgunFactory, renderer, audio );
weaponViewSkin = initScriptFactory( shotgunViewFactory, renderer, audio );
break;
default:
SPAssert(false);
@ -193,6 +119,18 @@ namespace spades {
grenadeViewSkin->Release();
}
asIScriptObject* ClientPlayer::initScriptFactory( ScriptFunction& creator, IRenderer* renderer, IAudioDevice* audio )
{
ScriptContextHandle ctx = creator.Prepare();
ctx->SetArgObject(0, reinterpret_cast<void*>(renderer));
ctx->SetArgObject(1, reinterpret_cast<void*>(audio));
ctx.ExecuteChecked();
asIScriptObject* result = reinterpret_cast<asIScriptObject *>(ctx->GetReturnObject());
result->AddRef();
return result;
}
void ClientPlayer::Invalidate() {
player = NULL;
}
@ -325,12 +263,7 @@ namespace spades {
Matrix4 ClientPlayer::GetEyeMatrix() {
Player *p = player;
Matrix4 eyeMatrix = Matrix4::FromAxis(-p->GetRight(),
p->GetFront(),
-p->GetUp(),
p->GetEye());
return eyeMatrix;
return Matrix4::FromAxis(-p->GetRight(), p->GetFront(), -p->GetUp(), p->GetEye());
}
void ClientPlayer::SetSkinParameterForTool(Player::ToolType type,
@ -546,10 +479,8 @@ namespace spades {
ModelRenderParam param;
param.depthHack = true;
IModel *model = renderer->RegisterModel
("Models/Player/Arm.kv6");
IModel *model2 = renderer->RegisterModel
("Models/Player/UpperArm.kv6");
IModel *model = renderer->RegisterModel("Models/Player/Arm.kv6");
IModel *model2 = renderer->RegisterModel("Models/Player/UpperArm.kv6");
IntVector3 col = p->GetColor();
param.customColor = MakeVector3(col.x/255.f,
@ -717,8 +648,7 @@ namespace spades {
leg1 = lower * leg1;
leg2 = lower * leg2;
model = renderer->RegisterModel
("Models/Player/LegCrouch.kv6");
model = renderer->RegisterModel("Models/Player/LegCrouch.kv6");
param.matrix = leg1 * scaler;
renderer->RenderModel(model, param);
param.matrix = leg2 * scaler;
@ -727,8 +657,7 @@ namespace spades {
torso = Matrix4::Translate(0.f,0.f,-0.55f);
torso = lower * torso;
model = renderer->RegisterModel
("Models/Player/TorsoCrouch.kv6");
model = renderer->RegisterModel("Models/Player/TorsoCrouch.kv6");
param.matrix = torso * scaler;
renderer->RenderModel(model, param);
@ -757,8 +686,7 @@ namespace spades {
leg1 = lower * leg1;
leg2 = lower * leg2;
model = renderer->RegisterModel
("Models/Player/Leg.kv6");
model = renderer->RegisterModel("Models/Player/Leg.kv6");
param.matrix = leg1 * scaler;
renderer->RenderModel(model, param);
param.matrix = leg2 * scaler;
@ -767,8 +695,7 @@ namespace spades {
torso = Matrix4::Translate(0.f,0.f,-1.0f);
torso = lower * torso;
model = renderer->RegisterModel
("Models/Player/Torso.kv6");
model = renderer->RegisterModel("Models/Player/Torso.kv6");
param.matrix = torso * scaler;
renderer->RenderModel(model, param);
@ -792,8 +719,7 @@ namespace spades {
arms = arms * Matrix4::Rotate(MakeVector3(1,0,0),
armPitch);
model = renderer->RegisterModel
("Models/Player/Arms.kv6");
model = renderer->RegisterModel("Models/Player/Arms.kv6");
param.matrix = arms * scaler;
renderer->RenderModel(model, param);
@ -801,8 +727,7 @@ namespace spades {
head = head * Matrix4::Rotate(MakeVector3(1,0,0),
pitch);
model = renderer->RegisterModel
("Models/Player/Head.kv6");
model = renderer->RegisterModel("Models/Player/Head.kv6");
param.matrix = head * scaler;
renderer->RenderModel(model, param);
@ -831,8 +756,7 @@ namespace spades {
col2.z/255.f);
Matrix4 mIntel = torso * Matrix4::Translate(0,0.6f,0.5f);
model = renderer->RegisterModel
("Models/MapObjects/Intel.kv6");
model = renderer->RegisterModel("Models/MapObjects/Intel.kv6");
param.matrix = mIntel * scaler;
renderer->RenderModel(model, param);

View File

@ -26,9 +26,14 @@
#include "Player.h"
namespace spades {
class ScriptFunction;
namespace client {
class Client;
class IRenderer;
class IAudioDevice;
/** Representation of player which is used by
* drawing/view layer of game client. */
@ -66,6 +71,8 @@ namespace spades {
float GetLocalFireVibration();
bool ShouldRenderInThirdPersonView();
asIScriptObject* initScriptFactory( ScriptFunction& creator, IRenderer* renderer, IAudioDevice* audio );
protected:
virtual ~ClientPlayer();
public:

View File

@ -865,10 +865,7 @@ namespace spades {
SPRaise("Received invalid weapon: %d", weapon);
}
Player *p = new Player(GetWorld(), pId,
wType, team,
savedPlayerPos[pId],
GetWorld()->GetTeam(team).color);
Player *p = new Player(GetWorld(), pId, wType, team, savedPlayerPos[pId], GetWorld()->GetTeam(team).color);
p->SetHeldBlockColor(color);
//p->SetOrientation(savedPlayerFront[pId]);
GetWorld()->SetPlayer(pId, p);
@ -1483,9 +1480,7 @@ namespace spades {
void NetClient::SendPlayerInput(PlayerInput inp) {
SPADES_MARK_FUNCTION();
NetPacketWriter wri(PacketTypeInputData);
wri.Write((uint8_t)GetLocalPlayer()->GetId());
uint8_t bits = 0;
if(inp.moveForward) bits |= 1 << 0;
if(inp.moveBackward) bits |= 1 << 1;
@ -1495,29 +1490,32 @@ namespace spades {
if(inp.crouch) bits |= 1 << 5;
if(inp.sneak) bits |= 1 << 6;
if(inp.sprint) bits |= 1 << 7;
wri.Write(bits);
if((unsigned int)bits == lastPlayerInput)
return;
lastPlayerInput = bits;
NetPacketWriter wri(PacketTypeInputData);
wri.Write((uint8_t)GetLocalPlayer()->GetId());
wri.Write(bits);
enet_peer_send(peer, 0, wri.CreatePacket());
}
void NetClient::SendWeaponInput( WeaponInput inp) {
SPADES_MARK_FUNCTION();
NetPacketWriter wri(PacketTypeWeaponInput);
wri.Write((uint8_t)GetLocalPlayer()->GetId());
uint8_t bits = 0;
if(inp.primary) bits |= 1 << 0;
if(inp.secondary) bits |= 1 << 1;
wri.Write(bits);
if((unsigned int)bits == lastWeaponInput)
return;
lastWeaponInput = bits;
NetPacketWriter wri(PacketTypeWeaponInput);
wri.Write((uint8_t)GetLocalPlayer()->GetId());
wri.Write(bits);
enet_peer_send(peer, 0, wri.CreatePacket());
}

View File

@ -21,6 +21,7 @@
#include "ScriptManager.h"
#include <Core/Debug.h>
#include <vector>
#include <sstream>
#include <Core/Exception.h>
#include <Core/AutoLocker.h>
#include <Core/FileManager.h>
@ -63,13 +64,11 @@ namespace spades {
fn += filename;
data = FileManager::ReadAllBytes(fn.c_str());
}catch(const std::exception& ex) {
SPLog("Failed to include '%s':%s",
filename, ex.what());
SPLog("Failed to include '%s':%s", filename, ex.what());
return -1;
}
SPLog("Loading script '%s'",
filename);
SPLog("Loading script '%s'", filename);
return ProcessScriptSection(data.c_str(), (unsigned int)(data.length()), filename);
}
};
@ -99,12 +98,9 @@ namespace spades {
SPLog("Registering APIs");
engine->SetDefaultNamespace("");
ScriptObjectRegistrar::RegisterAll(this,
ScriptObjectRegistrar::PhaseObjectType);
ScriptObjectRegistrar::RegisterAll(this,
ScriptObjectRegistrar::PhaseGlobalFunction);
ScriptObjectRegistrar::RegisterAll(this,
ScriptObjectRegistrar::PhaseObjectMember);
ScriptObjectRegistrar::RegisterAll(this, ScriptObjectRegistrar::PhaseObjectType);
ScriptObjectRegistrar::RegisterAll(this, ScriptObjectRegistrar::PhaseGlobalFunction);
ScriptObjectRegistrar::RegisterAll(this, ScriptObjectRegistrar::PhaseObjectMember);
SPLog("Loading scripts");
engine->SetDefaultNamespace("");
@ -333,6 +329,11 @@ namespace spades {
ScriptContextUtils::ScriptContextUtils(asIScriptContext *ctx):
context(ctx){}
void ScriptContextUtils::appendLocation( std::stringstream& ss, asIScriptFunction* func, const char *secName, int line, int column )
{
ss << "[" << (secName?secName:"(stub)") << ":" << line << "," << column << "] " << func->GetDeclaration(true, true);
}
void ScriptContextUtils::ExecuteChecked() {
SPADES_MARK_FUNCTION();
int r = context->Execute();
@ -345,11 +346,19 @@ namespace spades {
const char *secName = NULL;
int line = 0, column = 0;
asIScriptFunction *func = context->GetExceptionFunction();
// TODO: backtrace generation
line = context->GetExceptionLineNumber(&column, &secName);
SPRaise("%s @ [%s:%d,%d] %s", context->GetExceptionString(),
secName?secName:"(stub)", line, column,
func->GetDeclaration(true, true));
std::stringstream ss;
ss << context->GetExceptionString() << " @ ";
appendLocation( ss, func, secName, line, column );
asUINT num = context->GetCallstackSize();
for( asUINT n = 1; n < num; ++n ) { //skip entry 0, that's the current / exception addr
func = context->GetFunction( n );
line = context->GetLineNumber( n, &column, &secName);
ss << std::endl << " > ";
appendLocation( ss, func, secName, line, column );
}
std::string tmp = ss.str();
SPRaise( tmp.c_str() );
}
}

View File

@ -63,6 +63,8 @@ namespace spades {
class ScriptContextUtils {
asIScriptContext *context;
void appendLocation( std::stringstream& ss, asIScriptFunction* func, const char *secName, int line, int column );
public:
ScriptContextUtils();
ScriptContextUtils(asIScriptContext *);