Jump to content

Armor Effects with Python


Recommended Posts

Hey Guys,

 

 

Since this is my first post i want to release a little module i wrote 5 minutes ago.
 
First of all this is for everybody who hates sockets(like me) and don't want to use item_proto for Shinings/Effects whatever.
 
The Code is quiet "crappy" but it is working flawlessly. 
 
So lets get started.

 

You wanna create something like this where you declare your maps to store the vnum and effectfilepath

#include <map>

#ifndef ShiningSettings_H
#define ShiningSettings_H 1

extern std::map<int, char*> shiningdata;
extern std::map<int, char*>::iterator shiningit;

#endif

Then you wanna create your function for your python module

 
#include "StdAfx.h"
#include "ShiningSettings.h"

PyObject* addEffect(PyObject* poSelf, PyObject* poArgs) {

int vnum;
char* effectpath;

if(!PyTuple_GetInteger(poArgs, 0, &vnum)) {

return Py_BuildException();

}
if(!PyTuple_GetString(poArgs, 1, &effectpath)) {

return Py_BuildException();

}
if(!shiningdata.count(vnum)){
shiningdata[vnum] = effectpath;
}

return Py_BuildNone();
}





void initShining()
{
static PyMethodDef s_methods[] =
{
{ "Add", addEffect, METH_VARARGS },
{ NULL, NULL },
};

Py_InitModule("Shining", s_methods);
}
 
Make also sure you start your function in UserInterface.cpp
bool RunMainScript(CPythonLauncher& pyLauncher, const char* lpCmdLine){
//Otherfunctions
initShining();
}

AND in stdafx.h

add this

void initShining();

After that open up your InstanceBase.cpp

and define your early declared maps also include boost algorithm

Just copy this at the start of the file

#include "boost/algorithm/string.hpp"

std::map<int, char*> shiningdata;
std::map<int, char*>::iterator shiningit;

Then search for if (12010 <= vnum && vnum <= 12049)

and copy the following code after the if-clause

			if(!shiningdata.empty()){
				for (shiningit=shiningdata.begin(); shiningit!=shiningdata.end(); shiningit++)
					if (shiningit->first == vnum) {
						std::string substr(shiningit->second);
						std::vector<string> chars;
						boost::split(chars, substr, boost::is_any_of("#"));
						for(std::vector<string>::size_type i = 0; i != chars.size(); i++) {
							__AttachEffectToArmours(chars[i]);
						}
					}
			}
		}

This will split after a # for multiple shining attached to one amour.

Then you need to declare and define a function in InstanceBaseEffect.cpp and InstanceBase.h

 

InstanceBaseEffect.cpp

DWORD CInstanceBase::__AttachEffectToArmours(string effectfilename) {
	const char * effectpath = effectfilename.c_str();
	CEffectManager::Instance().RegisterEffect(effectpath, false, false);
	return m_GraphicThingInstance.AttachEffectByName(0, "Bip01", effectpath);
}

Again if you wish you can modify it. I already hardcoded the bonename and the boneindex.

 

 

In InstanceBase.h

Search for this:

	protected:
		DWORD	__AttachEffect(UINT eEftType);
		DWORD	__AttachEffectToArmours(string effectfilename);
		void	__DetachEffect(DWORD dwEID);

Replace with this:

	protected:
		DWORD	__AttachEffect(UINT eEftType);
		DWORD	__AttachEffectToArmours(string effectfilename);
		DWORD	__AttachEffect(char filename[128]);
		void	__DetachEffect(DWORD dwEID);

Oh Yeah watch out that your filename is no longer than 128 characters.

 

 

Last but not least:

 

Create a Python Script in your root Folder (call it whatever you like)

import Shining

##Modded Version
# Implemented Delim for C++
# delimiter : #

EffectTable = {

	11290 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse"],
	11291 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse"],
	11292 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse"],
	11293 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse"],
	11294 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse"],
	11295 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse"],
	11296 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse"],
	11297 : ["d:/ymir work/pc/common/effect/armor/grun_shining.mse#d:/ymir work/pc/common/effect/armor/armor-4-2-1.mse"],
	11298 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse#d:/ymir work/pc/common/effect/armor/armor-4-2-1.mse"],
	11299 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse#d:/ymir work/pc/common/effect/armor/armor-4-2-1.mse"],
	11259 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse#d:/ymir work/pc/common/effect/armor/armor-4-2-1.mse"],
	11269 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse#d:/ymir work/pc/common/effect/armor/armor-4-2-1.mse"]
}


def LoadEffectTable():
	for effect in EffectTable:
		for i in range(len(EffectTable[effect])):
			vnum = effect
			effectpath = EffectTable[effect][i]
		Shining.Add(vnum, effectpath)

As you can see 2 Shinings are seperated with an "#".

 

Last but no least import your file in your game 

 

and add the following line under the  python constructor

effecttable.LoadEffectTable()

I Hope i didn't forgot anything

  • Metin2 Dev 1
  • Love 18
Link to comment
Share on other sites

  • 1 month later...

Hey Guys,

 

 

Since this is my first post i want to release a little module i wrote 5 minutes ago.

 

First of all this is for everybody who hates sockets(like me) and don't want to use item_proto for Shinings/Effects whatever.

 

The Code is quiet "crappy" but it is working flawlessly. 

 

So lets get started.

 

You wanna create something like this where you declare your maps to store the vnum and effectfilepath

#include <map>

#ifndef ShiningSettings_H
#define ShiningSettings_H 1

extern std::map<int, char*> shiningdata;
extern std::map<int, char*>::iterator shiningit;

#endif

Then you wanna create your function for your python module

 
#include "StdAfx.h"
#include "ShiningSettings.h"

PyObject* addEffect(PyObject* poSelf, PyObject* poArgs) {

int vnum;
char* effectpath;

if(!PyTuple_GetInteger(poArgs, 0, &vnum)) {

return Py_BuildException();

}
if(!PyTuple_GetString(poArgs, 1, &effectpath)) {

return Py_BuildException();

}
if(!shiningdata.count(vnum)){
shiningdata[vnum] = effectpath;
}

return Py_BuildNone();
}





void initShining()
{
static PyMethodDef s_methods[] =
{
{ "Add", addEffect, METH_VARARGS },
{ NULL, NULL },
};

Py_InitModule("Shining", s_methods);
}
 
Make also sure you start your function in UserInterface.cpp
bool RunMainScript(CPythonLauncher& pyLauncher, const char* lpCmdLine){
//Otherfunctions
initShining();
}

AND in stdafx.h

add this

void initShining();

After that open up your InstanceBase.cpp

and define your early declared maps also include boost algorithm

Just copy this at the start of the file

#include "boost/algorithm/string.hpp"

std::map<int, char*> shiningdata;
std::map<int, char*>::iterator shiningit;

Then search for if (12010 <= vnum && vnum <= 12049)

and copy the following code after the if-clause

			if(!shiningdata.empty()){
				for (shiningit=shiningdata.begin(); shiningit!=shiningdata.end(); shiningit++)
					if (shiningit->first == vnum) {
						std::string substr(shiningit->second);
						std::vector<string> chars;
						boost::split(chars, substr, boost::is_any_of("#"));
						for(std::vector<string>::size_type i = 0; i != chars.size(); i++) {
							__AttachEffectToArmours(chars[i]);
						}
					}
			}
		}

This will split after a # for multiple shining attached to one amour.

Then you need to declare and define a function in InstanceBaseEffect.cpp and InstanceBase.h

 

InstanceBaseEffect.cpp

DWORD CInstanceBase::__AttachEffectToArmours(string effectfilename) {
	const char * effectpath = effectfilename.c_str();
	CEffectManager::Instance().RegisterEffect(effectpath, false, false);
	return m_GraphicThingInstance.AttachEffectByName(0, "Bip01", effectpath);
}

Again if you wish you can modify it. I already hardcoded the bonename and the boneindex.

 

 

In InstanceBase.h

Search for this:

	protected:
		DWORD	__AttachEffect(UINT eEftType);
		DWORD	__AttachEffectToArmours(string effectfilename);
		void	__DetachEffect(DWORD dwEID);

Replace with this:

	protected:
		DWORD	__AttachEffect(UINT eEftType);
		DWORD	__AttachEffectToArmours(string effectfilename);
		DWORD	__AttachEffect(char filename[128]);
		void	__DetachEffect(DWORD dwEID);

Oh Yeah watch out that your filename is no longer than 128 characters.

 

 

Last but not least:

 

Create a Python Script in your root Folder (call it whatever you like)

import Shining

##Modded Version
# Implemented Delim for C++
# delimiter : #

EffectTable = {

	11290 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse"],
	11291 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse"],
	11292 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse"],
	11293 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse"],
	11294 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse"],
	11295 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse"],
	11296 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse"],
	11297 : ["d:/ymir work/pc/common/effect/armor/grun_shining.mse#d:/ymir work/pc/common/effect/armor/armor-4-2-1.mse"],
	11298 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse#d:/ymir work/pc/common/effect/armor/armor-4-2-1.mse"],
	11299 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse#d:/ymir work/pc/common/effect/armor/armor-4-2-1.mse"],
	11259 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse#d:/ymir work/pc/common/effect/armor/armor-4-2-1.mse"],
	11269 : ["d:/ymir work/pc/common/effect/armor/armor-4-2-2.mse#d:/ymir work/pc/common/effect/armor/armor-4-2-1.mse"]
}


def LoadEffectTable():
	for effect in EffectTable:
		for i in range(len(EffectTable[effect])):
			vnum = effect
			effectpath = EffectTable[effect][i]
		Shining.Add(vnum, effectpath)

As you can see 2 Shinings are seperated with an "#".

 

Last but no least import your file in your game 

 

and add the following line under the  python constructor

effecttable.LoadEffectTable()

I Hope i didn't forgot anything

 

can help me ? pls

Link to comment
Share on other sites

  • 1 month later...
  • 5 months later...
  • 1 month later...
  • Former Staff

Where do I put this?

 

#include <map>

#ifndef ShiningSettings_H
#define ShiningSettings_H 1

extern std::map<int, char*> shiningdata;
extern std::map<int, char*>::iterator shiningit;

#endif

Then you wanna create your function for your python module

 
#include "StdAfx.h"
#include "ShiningSettings.h"

PyObject* addEffect(PyObject* poSelf, PyObject* poArgs) {

int vnum;
char* effectpath;

if(!PyTuple_GetInteger(poArgs, 0, &vnum)) {

return Py_BuildException();

}
if(!PyTuple_GetString(poArgs, 1, &effectpath)) {

return Py_BuildException();

}
if(!shiningdata.count(vnum)){
shiningdata[vnum] = effectpath;
}

return Py_BuildNone();
}





void initShining()
{
static PyMethodDef s_methods[] =
{
{ "Add", addEffect, METH_VARARGS },
{ NULL, NULL },
};

Py_InitModule("Shining", s_methods);
}
Link to comment
Share on other sites

I got this error:

0103 14:06:26506 :: Traceback (most recent call last):

0103 14:06:26507 ::   File "networkModule.py", line 237, in SetGamePhase

0103 14:06:26507 ::   File "system.py", line 130, in __pack_import

0103 14:06:26507 ::   File "system.py", line 110, in _process_result

0103 14:06:26507 ::   File "game.py", line 53, in ?

0103 14:06:26507 ::   File "system.py", line 130, in __pack_import

0103 14:06:26507 ::   File "
0103 14:06:26507 :: <string>
0103 14:06:26507 :: ", line 
0103 14:06:26507 :: 14
0103 14:06:26507 :: 

0103 14:06:26507 ::     
0103 14:06:26507 :: Shining.Add(vnum, effectpath)
0103 14:06:26507 :: 

0103 14:06:26507 ::     
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 :: ^

0103 14:06:26508 :: SyntaxError
0103 14:06:26508 :: : 
0103 14:06:26508 :: invalid syntax
0103 14:06:26508 :: 

Can you help me? Thank's

Link to comment
Share on other sites

  • Premium

I got this error:

0103 14:06:26506 :: Traceback (most recent call last):

0103 14:06:26507 ::   File "networkModule.py", line 237, in SetGamePhase

0103 14:06:26507 ::   File "system.py", line 130, in __pack_import

0103 14:06:26507 ::   File "system.py", line 110, in _process_result

0103 14:06:26507 ::   File "game.py", line 53, in ?

0103 14:06:26507 ::   File "system.py", line 130, in __pack_import

0103 14:06:26507 ::   File "
0103 14:06:26507 :: <string>
0103 14:06:26507 :: ", line 
0103 14:06:26507 :: 14
0103 14:06:26507 :: 

0103 14:06:26507 ::     
0103 14:06:26507 :: Shining.Add(vnum, effectpath)
0103 14:06:26507 :: 

0103 14:06:26507 ::     
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26507 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 ::  
0103 14:06:26508 :: ^

0103 14:06:26508 :: SyntaxError
0103 14:06:26508 :: : 
0103 14:06:26508 :: invalid syntax
0103 14:06:26508 :: 
Can you help me? Thank's

You wrong place TAB

Link to comment
Share on other sites

  • Former Staff

 

Where do I put this?

 

#include <map>

#ifndef ShiningSettings_H
#define ShiningSettings_H 1

extern std::map<int, char*> shiningdata;
extern std::map<int, char*>::iterator shiningit;

#endif

Then you wanna create your function for your python module

 
#include "StdAfx.h"
#include "ShiningSettings.h"

PyObject* addEffect(PyObject* poSelf, PyObject* poArgs) {

int vnum;
char* effectpath;

if(!PyTuple_GetInteger(poArgs, 0, &vnum)) {

return Py_BuildException();

}
if(!PyTuple_GetString(poArgs, 1, &effectpath)) {

return Py_BuildException();

}
if(!shiningdata.count(vnum)){
shiningdata[vnum] = effectpath;
}

return Py_BuildNone();
}





void initShining()
{
static PyMethodDef s_methods[] =
{
{ "Add", addEffect, METH_VARARGS },
{ NULL, NULL },
};

Py_InitModule("Shining", s_methods);
}

 

Link to comment
Share on other sites

  • 3 weeks later...
  • Former Staff

 

 

Where do I put this?

 

#include <map>

#ifndef ShiningSettings_H
#define ShiningSettings_H 1

extern std::map<int, char*> shiningdata;
extern std::map<int, char*>::iterator shiningit;

#endif

Then you wanna create your function for your python module

 
#include "StdAfx.h"
#include "ShiningSettings.h"

PyObject* addEffect(PyObject* poSelf, PyObject* poArgs) {

int vnum;
char* effectpath;

if(!PyTuple_GetInteger(poArgs, 0, &vnum)) {

return Py_BuildException();

}
if(!PyTuple_GetString(poArgs, 1, &effectpath)) {

return Py_BuildException();

}
if(!shiningdata.count(vnum)){
shiningdata[vnum] = effectpath;
}

return Py_BuildNone();
}





void initShining()
{
static PyMethodDef s_methods[] =
{
{ "Add", addEffect, METH_VARARGS },
{ NULL, NULL },
};

Py_InitModule("Shining", s_methods);
}

 

 

Link to comment
Share on other sites

  • 8 months later...
  • 7 months later...
  • 4 weeks later...
  • Premium

 

Where do I put this part of the code?

 

You wanna create something like this where you declare your maps to store the vnum and effectfilepath

#include <map>

#ifndef ShiningSettings_H
#define ShiningSettings_H 1

extern std::map<int, char*> shiningdata;
extern std::map<int, char*>::iterator shiningit;

#endif

Then you wanna create your function for your python module

 
#include "StdAfx.h"
#include "ShiningSettings.h"

PyObject* addEffect(PyObject* poSelf, PyObject* poArgs) {

int vnum;
char* effectpath;

if(!PyTuple_GetInteger(poArgs, 0, &vnum)) {

return Py_BuildException();

}
if(!PyTuple_GetString(poArgs, 1, &effectpath)) {

return Py_BuildException();

}
if(!shiningdata.count(vnum)){
shiningdata[vnum] = effectpath;
}

return Py_BuildNone();
}





void initShining()
{
static PyMethodDef s_methods[] =
{
{ "Add", addEffect, METH_VARARGS },
{ NULL, NULL },
};

Py_InitModule("Shining", s_methods);
}
 
 
Link to comment
Share on other sites

Announcements



×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.