| 
					
				 | 
			
			
				@@ -0,0 +1,176 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * vim: set ts=4 sw=4 tw=99 noet : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * ====================================================== 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * TF2 Dynamic Schema Injector 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Written by nosoop 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * ====================================================== 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <stdio.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "mmsplugin.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "natives.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "econmanager.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+HandleType_t g_EconInjectedAttributeType{}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+EconInjectedAttributeHandler g_EconInjectedAttributeHandler; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void EconInjectedAttributeHandler::OnHandleDestroy(HandleType_t type, void* object) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (type == g_EconInjectedAttributeType) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		delete reinterpret_cast<AutoKeyValues*>(object); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+cell_t sm_EconAttributeCreate(IPluginContext *pContext, const cell_t *params) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	AutoKeyValues *pContainer = new AutoKeyValues(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return g_pHandleSys->CreateHandle(g_EconInjectedAttributeType, pContainer, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			pContext->GetIdentity(), myself->GetIdentity(), NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// void EconInjectedAttribute.SetClass(const char[] attrClass) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+cell_t sm_EconAttributeSetClass(IPluginContext *pContext, const cell_t *params) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	HandleError err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Handle_t hndl = static_cast<Handle_t>(params[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	AutoKeyValues *pContainer = nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if ((err = g_pHandleSys->ReadHandle(hndl, g_EconInjectedAttributeType, &sec, (void**) &pContainer)) != HandleError_None) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return pContext->ThrowNativeError("Invalid EconInjectedAttribute handle %x (error: %d)", hndl, err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	char *value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	pContext->LocalToString(params[2], &value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(*pContainer)->SetString("attribute_class", value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// void EconInjectedAttribute.SetName(const char[] attrName) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+cell_t sm_EconAttributeSetName(IPluginContext *pContext, const cell_t *params) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	HandleError err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Handle_t hndl = static_cast<Handle_t>(params[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	AutoKeyValues *pContainer = nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if ((err = g_pHandleSys->ReadHandle(hndl, g_EconInjectedAttributeType, &sec, (void**) &pContainer)) != HandleError_None) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return pContext->ThrowNativeError("Invalid EconInjectedAttribute handle %x (error: %d)", hndl, err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	char *value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	pContext->LocalToString(params[2], &value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(*pContainer)->SetString("name", value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// void EconInjectedAttribute.SetDescriptionFormat(const char[] attrDescFmt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+cell_t sm_EconAttributeSetDescriptionFormat(IPluginContext *pContext, const cell_t *params) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	HandleError err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Handle_t hndl = static_cast<Handle_t>(params[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	AutoKeyValues *pContainer = nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if ((err = g_pHandleSys->ReadHandle(hndl, g_EconInjectedAttributeType, &sec, (void**) &pContainer)) != HandleError_None) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return pContext->ThrowNativeError("Invalid EconInjectedAttribute handle %x (error: %d)", hndl, err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	char *value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	pContext->LocalToString(params[2], &value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(*pContainer)->SetString("description_format", value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// void EconInjectedAttribute.SetCustom(const char[] key, const char[] value) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+cell_t sm_EconAttributeSetCustomKeyValue(IPluginContext *pContext, const cell_t *params) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	HandleError err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Handle_t hndl = static_cast<Handle_t>(params[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	AutoKeyValues *pContainer = nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if ((err = g_pHandleSys->ReadHandle(hndl, g_EconInjectedAttributeType, &sec, (void**) &pContainer)) != HandleError_None) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return pContext->ThrowNativeError("Invalid EconInjectedAttribute handle %x (error: %d)", hndl, err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	char *key, *value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	pContext->LocalToString(params[2], &key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	pContext->LocalToString(params[3], &value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(*pContainer)->SetString(key, value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// void EconInjectedAttribute.SetDefIndex(int attrdef) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+cell_t sm_EconAttributeSetDefIndex(IPluginContext *pContext, const cell_t *params) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	HandleError err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Handle_t hndl = static_cast<Handle_t>(params[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	AutoKeyValues *pContainer = nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if ((err = g_pHandleSys->ReadHandle(hndl, g_EconInjectedAttributeType, &sec, (void**) &pContainer)) != HandleError_None) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return pContext->ThrowNativeError("Invalid EconInjectedAttribute handle %x (error: %d)", hndl, err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(*pContainer)->SetName(std::to_string(params[2]).c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// void EconInjectedAttribute.ClearDefIndex() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+cell_t sm_EconAttributeClearDefIndex(IPluginContext *pContext, const cell_t *params) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	HandleError err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Handle_t hndl = static_cast<Handle_t>(params[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	AutoKeyValues *pContainer = nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if ((err = g_pHandleSys->ReadHandle(hndl, g_EconInjectedAttributeType, &sec, (void**) &pContainer)) != HandleError_None) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return pContext->ThrowNativeError("Invalid EconInjectedAttribute handle %x (error: %d)", hndl, err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(*pContainer)->SetName("auto"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// bool EconInjectedAttribute.Register() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+cell_t sm_EconAttributeRegister(IPluginContext *pContext, const cell_t *params) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	HandleError err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Handle_t hndl = static_cast<Handle_t>(params[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	AutoKeyValues *pContainer = nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if ((err = g_pHandleSys->ReadHandle(hndl, g_EconInjectedAttributeType, &sec, (void**) &pContainer)) != HandleError_None) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return pContext->ThrowNativeError("Invalid EconInjectedAttribute handle %x (error: %d)", hndl, err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!g_EconManager.RegisterAttribute(*pContainer) || !g_EconManager.InsertOrReplaceAttribute(*pContainer)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// void EconInjectedAttribute.Clear(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+cell_t sm_EconAttributeClear(IPluginContext *pContext, const cell_t *params) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	HandleError err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Handle_t hndl = static_cast<Handle_t>(params[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	AutoKeyValues *pContainer = nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if ((err = g_pHandleSys->ReadHandle(hndl, g_EconInjectedAttributeType, &sec, (void**) &pContainer)) != HandleError_None) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return pContext->ThrowNativeError("Invalid EconInjectedAttribute handle %x (error: %d)", hndl, err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KeyValues::AutoDelete empty("auto"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	pContainer->Assign(empty); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |