lfnetwork.com mark read register faq members calendar

Thread: Handy include for Module Building
Thread Tools Display Modes
Post a new thread. Add a reply to this thread. Indicate all threads in this forum as read. Subscribe to this forum. RSS feed: this forum RSS feed: all forums
Old 05-24-2013, 09:34 PM   #1
glovemaster
Now-a-days GroovyCarrot
 
Join Date: Jan 2007
Location: Liverpool, UK
Posts: 697
Current Game: No time for games, sadly
Helpful! 
Lightbulb Handy include for Module Building

Reference this thread for questions

Since I've still got my tutorial forum privileges I figured it would be worth referring this thing here too


A while back (2008 to be precise) I wrote this script for module building, a debugging function in addition to several useful functions which I figure will be more useful to you guys than myself now - It's been a while but IIRC it compiles fine - you just need to use the line:
Code:
#include "gm_include"
Luckily I documented it, I'm pretty good at forgetting what I write these for so feel free to pick it apart
Code:
/*
	:: Written by Glovemaster - 26/12/08 ::
	Quanon and Glovemaster's Scrapyard Games Modification

	gm_include.nss
*/

// Declaring functions... So I can use each function in each
void debug(string Message, int Time = FALSE);
vector getRandomVector(float fDistance);
void applyEffectNearObject(int DURATION_TYPE, effect eEffect, object oTarget, float fDistance = 1.0, float fDur = 0.0);
void createVisualEffectsArc(float fDuration, object oStart, location lTarget, int iEffect, int isBeam = TRUE);
int calculateDamage(int nDice, int nDiceSize);
float locationToObject(location lPoint, object oTo);
void checkWeaponSlotsForItem(object oCheck, string itemTag, int requiredCert);

/*
	-[ debug ]---------------------------------------------------
	Sends a message to the Party Leader for debugging purposes,
	generally to see if some "if" statement has triggered or not.
	-------------------------------------------------------------
*/
void debug(string Message, int Time = FALSE) {
	string TimeNote = "";
	if (Time) {
		int Hour = GetTimeHour();
		int Minute  = GetTimeMinute();
		int Second  = GetTimeSecond();
		TimeNote = (Hour < 10 ? "0" : "") + IntToString(Hour) + ":" +
					(Minute  < 10 ? "0" : "") + IntToString(Minute) + ":" +
					(Second  < 10 ? "0" : "") + IntToString(Second) + " ";
	}
	SendMessageToPC(GetFirstPC(), "[ DEBUG " + TimeNote + "]" + Message);
	AurPostString("[ DEBUG " + TimeNote + "]" + Message, 0, 0, 5.0); // Removed I assume, since AFAIK it does nothing.
}

/*
	-[ getRandomVector ]-----------------------------------------
	Get a random vector within fDistance. This is because
	GetRandomDestination actually only generates 5 random
	destinations and looks crappy in the effect I was going for.
	-------------------------------------------------------------
*/
vector getRandomVector(float fDistance) {
	float fAngle = IntToFloat((Random(361) + (Random(100) / 100))); // Pretty damn random.
	vector vRandom = AngleToVector(fAngle);
		// Annoyingly, vectors can't be multiplyed in KotOR . well I get a compile error so we'll just play it this way:
			vRandom.x = vRandom.x * fDistance;
			vRandom.y = vRandom.y * fDistance;
	return vRandom;
}

/*
	-[ applyEffectNearObject ]-----------------------------------
	EffectBeam() when set to miss, doesn't actually miss. Or do
	anything at all for that matter, Therefore we need to create
	a function that does. Also, apparently you can't apply
	EffectBeam() to a location? Well we'll use nodes anyway.
	-------------------------------------------------------------
*/
void applyEffectNearObject(int DURATION_TYPE, effect eEffect, object oTarget, float fDistance = 1.0, float fDur = 0.0) {
	vector vAdd = AngleToVector(GetFacing(oTarget) - 180.0);
			vAdd.x = (vAdd.x * fDistance);
			vAdd.y = (vAdd.y * fDistance);
	vector vNear = getRandomVector(1.0) + vAdd;
	object oNode = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisible", Location(vNear, 0.0));
		AssignCommand(oNode, DestroyObject(oNode, (fDur + 1.0)));
	ApplyEffectToObject(DURATION_TYPE, eEffect, oNode, fDur);
}

/*
	-[ createVisualEffectsArc ]----------------------------------
	Creates an arc of nodes, works better as a beam but over a 
	short distance then its fine to use visual effects.
	Lightning is advised for this as it does not "bend" in an
	ugly way. I initially used this for fire but it was rather
	crude.
	-------------------------------------------------------------
*/
void createVisualEffectsArc(float fDuration, object oStart, location lTarget, int iEffect, int isBeam = TRUE) {
	// Right then, we'll have 10 nodes making up the arc.
	object oNode, oNode1, oNode2, oNode3, oNode4, oNode5, oNode6, oNode7, oNode8, oNode9, oNode10;
	float fDistanceOver = locationToObject(lTarget, oStart);
	float fGap = fDistanceOver / 10;
	// Get the direction to create the arc and change magnitude of the vector to fGap.
	vector vDir = GetPosition(oStart) - GetPositionFromLocation(lTarget);
			vDir = AngleToVector(VectorToAngle(vDir)); // Seems wierd, I know
				vDir.x = vDir.x * fGap;
				vDir.y = vDir.y * fGap;
	
	// Lets get those nodes made then.
	vector vPos;
	float fHeight = 1.8;
	int i;
	for(i = 1; i <= 10; i++) {
		// Set the node's height.
		if(i <= 4) { // Going up.
			fHeight += 1.0; // Up 1m each time.
		}
		else if(i >= 6) { // Going down.
			fHeight -= 1.45; // Down 65cm each time. By my maths: 20cm * 4 is 80cm + our 1.8m is 2.6m
							 // divided by 4 more steps and we get 65cm? BTW unto the Americans:
							 // its MATHS not MATH you illiterate f*$@ers. -.-
		}
		vPos = vDir;
			vPos.x = vPos.x * i;
			vPos.y = vPos.y * i;
			vPos.z = fHeight;
		oNode = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisible", Location(vPos, 0.0));
		AssignCommand(oNode, DestroyObject(oNode, fDuration + 1.0));
		// If only KotOR had arrays. .
		if(i == 1) oNode1 = oNode;
		else if(i == 2) oNode2 = oNode;
		else if(i == 3) oNode3 = oNode;
		else if(i == 4) oNode4 = oNode;
		else if(i == 5) oNode5 = oNode;
		else if(i == 6) oNode6 = oNode;
		else if(i == 7) oNode7 = oNode;
		else if(i == 8) oNode8 = oNode;
		else if(i == 9) oNode9 = oNode;
		else if(i == 10) oNode10 = oNode;
	}
	
	if(isBeam) {
		effect eBeam = EffectBeam(iEffect, oNode1, BODY_NODE_CHEST);
		ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam, oNode2, fDuration);
		eBeam = EffectBeam(iEffect, oNode2, BODY_NODE_CHEST);
		DelayCommand(0.2, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam, oNode3, fDuration));
		eBeam = EffectBeam(iEffect, oNode3, BODY_NODE_CHEST);
		DelayCommand(0.4, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam, oNode4, fDuration));
		eBeam = EffectBeam(iEffect, oNode4, BODY_NODE_CHEST);
		DelayCommand(0.6, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam, oNode5, fDuration));
		eBeam = EffectBeam(iEffect, oNode5, BODY_NODE_CHEST);
		DelayCommand(0.8, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam, oNode6, fDuration));
		eBeam = EffectBeam(iEffect, oNode6, BODY_NODE_CHEST);
		DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam, oNode7, fDuration));
		eBeam = EffectBeam(iEffect, oNode7, BODY_NODE_CHEST);
		DelayCommand(1.2, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam, oNode8, fDuration));
		eBeam = EffectBeam(iEffect, oNode8, BODY_NODE_CHEST);
		DelayCommand(1.4, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam, oNode9, fDuration));
		eBeam = EffectBeam(iEffect, oNode9, BODY_NODE_CHEST);
		DelayCommand(1.6, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam, oNode10, fDuration));
	}
	else {
		effect eVis = EffectVisualEffect(iEffect);
		ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oNode1, fDuration);
		ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oNode2, fDuration);
		ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oNode3, fDuration);
		ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oNode4, fDuration);
		ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oNode5, fDuration);
		ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oNode6, fDuration);
		ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oNode7, fDuration);
		ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oNode8, fDuration);
		ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oNode9, fDuration);
		ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oNode10, fDuration);
	}
}

/*
	-[ calculateDamage ]-----------------------------------------
	Calculates damage to deal using nDice amount of dice with
	nDiceSize faces.
	-------------------------------------------------------------
*/
int calculateDamage(int nDice, int nDiceSize) {
	// Calculate a reasonable amount of damage to deal.
	int iDamage = 0; // Start off, no damage.
	switch(nDiceSize) {
		case 2: 	iDamage = d2(nDice); 	break;
		case 3: 	iDamage = d3(nDice); 	break;
		case 4: 	iDamage = d4(nDice); 	break;
		case 6: 	iDamage = d6(nDice); 	break;
		case 8: 	iDamage = d8(nDice); 	break;
		case 10: 	iDamage = d10(nDice); 	break;
		case 12: 	iDamage = d12(nDice); 	break;
		case 20: 	iDamage = d20(nDice); 	break;
		case 100: 	iDamage = d100(nDice); 	break;
		default:
			iDamage = Random(nDice * nDiceSize) + 1; // Otherwise just get a random number.
			if (iDamage < nDice) iDamage = nDice; // Not too low ofc. XD
			break;
	}
	
	return iDamage;
}

/*
	-[ locationToObject ]----------------------------------------
	Just a quick GetDistanceBetweenLocations() only with a
	location and an object.
	-------------------------------------------------------------
*/
float locationToObject(location lPoint, object oTo) {
	location lTo = GetLocation(oTo);
	return GetDistanceBetweenLocations(lPoint, lTo);
}

/*
	-[ checkWeaponSlotsForItem ]---------------------------------
	Checks certain weapons slots for an item with itemTag, this
	is for Scrapyard Games only.
	-------------------------------------------------------------
*/
// Cut this one out since it relied on global vars for SG
I've also included the Notepad++ Syntax User Defined Language I threw together to help with writing your scripts. And also wish you all the best with modding and I'm glad to see this community is still going
Attached Files
File Type: zip Notepad++ Syntax.zip (13.2 KB, 39 views)


If you're looking for any of the junk I did a few years ago; you can probably still find it all on filefront

Last edited by glovemaster; 05-25-2013 at 02:46 PM.
glovemaster is offline   you may: quote & reply,
Post a new thread. Add a reply to this thread. Indicate all threads in this forum as read. Subscribe to this forum. RSS feed: this forum RSS feed: all forums
Go Back   LucasForums > Network > Knights of the Old Republic > Editing / Modding > Holowan Laboratories > Tutorials: Scripting > Handy include for Module Building

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 01:41 PM.

LFNetwork, LLC ©2002-2011 - All rights reserved.
Powered by vBulletin®
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.