126 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
| #pragma semicolon 1
 | |
| #include <sourcemod>
 | |
| 
 | |
| #include <sdktools>
 | |
| #include <entitylump>
 | |
| 
 | |
| #pragma newdecls required
 | |
| 
 | |
| #define PLUGIN_VERSION "0.0.0"
 | |
| public Plugin myinfo = {
 | |
| 	name = "Entity Lump Core Native Test",
 | |
| 	author = "nosoop",
 | |
| 	description = "A port of the Level KeyValues entity test to the Entity Lump implementation in core SourceMod",
 | |
| }
 | |
| 
 | |
| #define OUTPUT_NAME "OnCapTeam2"
 | |
| 
 | |
| public void OnMapInit() {
 | |
| 	// set every area_time_to_cap value to 30
 | |
| 	for (int i, n = EntityLump.Length(); i < n; i++) {
 | |
| 		EntityLumpEntry entry = EntityLump.Get(i);
 | |
| 		
 | |
| 		int ttc = entry.FindKey("area_time_to_cap");
 | |
| 		if (ttc != -1) {
 | |
| 			entry.Update(ttc, NULL_STRING, "30");
 | |
| 			PrintToServer("Set time to cap for item %d to 30", i);
 | |
| 		}
 | |
| 		
 | |
| 		delete entry;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| public void OnMapStart() {
 | |
| 	int captureArea = FindEntityByClassname(-1, "trigger_capture_area");
 | |
| 	
 | |
| 	if (!IsValidEntity(captureArea)) {
 | |
| 		LogMessage("---- %s", "No capture area");
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	int hammerid = GetEntProp(captureArea, Prop_Data, "m_iHammerID");
 | |
| 	EntityLumpEntry entry = FindEntityLumpEntryByHammerID(hammerid);
 | |
| 	
 | |
| 	if (!entry) {
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	LogMessage("---- %s", "Found a trigger_capture_area with keys:");
 | |
| 	
 | |
| 	for (int i, n = entry.Length; i < n; i++) {
 | |
| 		char keyBuffer[128], valueBuffer[128];
 | |
| 		entry.Get(i, keyBuffer, sizeof(keyBuffer), valueBuffer, sizeof(valueBuffer));
 | |
| 		
 | |
| 		LogMessage("%s -> %s", keyBuffer, valueBuffer);
 | |
| 	}
 | |
| 	
 | |
| 	LogMessage("---- %s", "List of " ... OUTPUT_NAME ... " outputs:");
 | |
| 	char outputString[256];
 | |
| 	for (int k = -1; (k = entry.GetNextKey(OUTPUT_NAME, outputString, sizeof(outputString), k)) != -1;) {
 | |
| 		char targetName[32], inputName[64], variantValue[32];
 | |
| 		float delay;
 | |
| 		int nFireCount;
 | |
| 		
 | |
| 		ParseEntityOutputString(outputString, targetName, sizeof(targetName),
 | |
| 				inputName, sizeof(inputName), variantValue, sizeof(variantValue),
 | |
| 				delay, nFireCount);
 | |
| 		
 | |
| 		LogMessage("target %s -> input %s (value %s, delay %.2f, refire %d)",
 | |
| 				targetName, inputName, variantValue, delay, nFireCount);
 | |
| 	}
 | |
| 	delete entry;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Returns the first EntityLumpEntry with a matching hammerid.
 | |
|  */
 | |
| EntityLumpEntry FindEntityLumpEntryByHammerID(int hammerid) {
 | |
| 	for (int i, n = EntityLump.Length(); i < n; i++) {
 | |
| 		EntityLumpEntry entry = EntityLump.Get(i);
 | |
| 		
 | |
| 		char value[32];
 | |
| 		if (entry.GetNextKey("hammerid", value, sizeof(value)) != -1
 | |
| 				&& StringToInt(value) == hammerid) {
 | |
| 			return entry;
 | |
| 		}
 | |
| 		delete entry;
 | |
| 	}
 | |
| 	return null;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Parses an entity's output value (as formatted in the entity string).
 | |
|  * Refer to https://developer.valvesoftware.com/wiki/AddOutput for the format.
 | |
|  * 
 | |
|  * @return True if the output string was successfully parsed, false if not.
 | |
|  */
 | |
| stock bool ParseEntityOutputString(const char[] output, char[] targetName, int targetNameLength,
 | |
| 		char[] inputName, int inputNameLength, char[] variantValue, int variantValueLength,
 | |
| 		float &delay, int &nFireCount) {
 | |
| 	int delimiter;
 | |
| 	char buffer[32];
 | |
| 	
 | |
| 	{
 | |
| 		// validate that we have something resembling an output string (four commas)
 | |
| 		int i, c, nDelim;
 | |
| 		while ((c = FindCharInString(output[i], ',')) != -1) {
 | |
| 			nDelim++;
 | |
| 			i += c + 1;
 | |
| 		}
 | |
| 		if (nDelim < 4) {
 | |
| 			return false;
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	delimiter = SplitString(output, ",", targetName, targetNameLength);
 | |
| 	delimiter += SplitString(output[delimiter], ",", inputName, inputNameLength);
 | |
| 	delimiter += SplitString(output[delimiter], ",", variantValue, variantValueLength);
 | |
| 	
 | |
| 	delimiter += SplitString(output[delimiter], ",", buffer, sizeof(buffer));
 | |
| 	delay = StringToFloat(buffer);
 | |
| 	
 | |
| 	nFireCount = StringToInt(output[delimiter]);
 | |
| 	
 | |
| 	return true;
 | |
| }
 |