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:
parent
535bc99608
commit
2a24e662cd
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
|
@ -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() );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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 *);
|
||||
|
Loading…
x
Reference in New Issue
Block a user