Jump to content

VegaS

Banned
  • Posts

    363
  • Joined

  • Last visited

  • Days Won

    40
  • Feedback

    0%

Posts posted by VegaS

  1. Since eternexus etc. can not find certain characters unpack eg 01.¼º / ³ª¹ "and then be renamed locations and made new ones.

    This is in the property, some of its folders/files have Chinese chars in its names. 

    Here are resolved:

    This is the hidden content, please
    !mUpUbnlzFcJaltR7nKBaLuiIUifpKIVX8WFxHGbl1eI

    You can go in property/property and creates a file named for * list * like that:

    http://pastebin.com/ee7RJ35v

    • Metin2 Dev 40
    • Eyes 2
    • Angry 3
    • Not Good 1
    • Scream 1
    • Lmao 1
    • Good 5
    • Love 25
  2. M2 Download Center

    This is the hidden content, please
    ( Internal )

    5BAQb.png

    I mention that all these functions are shit, we just did in a hurry, we have not tested, they are just tools to check code that do not have very bright but functional.

    Someone wanted this and even more people from a certain conference, so I made this little tutorial.

     

    These features give you the chance to check the following:
    - To introduce reading a game DLL source automatically.
    - To check the size of the DLL in question.
    - To check more files in the client if that which corresponds md5 version of the file.

    ffd:h -> http://pastebin.com/1TXW32Qu

     

    Src/Client/UserInterface/Locale_inc.h

    #define __ENABLE_DLL_CHECK__ // enable
    #define __ENABLE_CHECK_SIZE__ // check size of files
    #define __ENABLE_CHECK_MD5__ // check md5 of files
    #define __SIZE_DLL__ 54200 // size in kb

    Src/Client/UserInterface/UserInterface.cpp

    #include "ffd.h" // Put file ffd.h in Extern/include/ 

     

    #ifdef __ENABLE_DLL_CHECK__
    int FunctionGetFileSize(char* FileName) {
    	 HANDLE pFile_done = CreateFileA(FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    	 return FunctionGetFileSize(pFile_done, NULL);
    	}
    #endif
    
    #ifdef __ENABLE_CHECK_MD5__
    void FunctionGetFileMD5(char* cFile, char* hash) {
    	MD5 ffd;
    
    	if (strcmp(ffd.digestFile(cFile), hash)) {
    		MessageBoxA(NULL, "It was detected a change to a file. Please do update the autopatcher!", "#System Error", NULL);
    		exit(0);
    	}
    }
    #endif

    You can check this function in : 

     int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

     

    #ifdef __ENABLE_DLL_CHECK__
    	const char* keyName		= "name_your_dll";
    
    	HINSTANCE hGetProcIDDLL = LoadLibrary(keyName + ".dll");
    	
    	if (hGetProcIDDLL == NULL) 
    	{
    		MessageBox(NULL, "The customer name can not start without dll_vegas.dll, please update your autopatcher.", "#System Error", MB_ICONSTOP);  
    		return 0;
    	}
    #endif
    
    #ifdef __ENABLE_CHECK_SIZE__
    	if (FunctionGetFileSize(keyName + ".dll") != __SIZE_DLL__) //kb
    	{
    		MessageBox(NULL, "DLL has been changed, please update.", "#System Error", MB_ICONSTOP);   	
    		return 0;
    	}
    #endif

     

    #ifdef __ENABLE_CHECK_MD5__
    	const char* MILES_key_MD5_Index_0	=	"miles/mssdsp.flt";
    	const char* MILES_key_MD5_Index_0	=	"miles/msssoft.m3d";
    	const char* MILES_key_MD5_Index_0	=	"miles/mssa3d.m3d";
    	const char* MILES_key_MD5_Index_0	=	"miles/mss32.dll";
    	
    	const char* DLL_key_MD5_Index_0	=	"python27.dll";
    	const char* DLL_key_MD5_Index_1	=	"mss32.dll";
    	
    	const char* LIB_key_MD5_Index_0	=	"ib/__future__.pyc";
    	const char* LIB_key_MD5_Index_1	=	"lib/copy_reg.pyc";
    	const char* LIB_key_MD5_Index_2	=	"lib/linecache.pyc";	
    	const char* LIB_key_MD5_Index_3	=	"lib/ntpath.pyc";	
    	const char* LIB_key_MD5_Index_4	=	"lib/os.pyc";	
    	const char* LIB_key_MD5_Index_5	=	"lib/site.pyc";	
    	const char* LIB_key_MD5_Index_6	=	"lib/stat.pyc";
    	const char* LIB_key_MD5_Index_7	=	"lib/string.pyc";	
    	const char* LIB_key_MD5_Index_8	=	"lib/traceback.pyc";	
    	const char* LIB_key_MD5_Index_9	=	"lib/types.pyc";
    	const char* LIB_key_MD5_Index_10	=	"lib/UserDict.pyc";		
    	
    	const char* Index_key_md5_	=	"pack/Index";	
    
    	const char* PACK_key_MD5_Index_0	=	"pack/root.eix";	
    	const char* PACK_key_MD5_Index_1	=	"pack/ETC.eix";
    	const char* PACK_key_MD5_Index_2	=	"pack/locale_en.eix";			
    	
    		///////////// VERIFICATION PATCH MILES ///////////////////
    	FunctionGetFileMD5(MILES_key_MD5_Index_0,"cb71b1791009eca618e9b1ad4baa4fa9");		
    	FunctionGetFileMD5(MILES_key_MD5_Index_1,"bdc9ad58ade17dbd939522eee447416f");		
    	FunctionGetFileMD5(MILES_key_MD5_Index_2,"e089ce52b0617a6530069f22e0bdba2a");
    	FunctionGetFileMD5(MILES_key_MD5_Index_3,"6400e224b8b44ece59a992e6d8233719");
    		///////////// VERIFICATION PATCH DLL ///////////////////
    	FunctionGetFileMD5(DLL_key_MD5_Index_0,"d219c0a8aff2c771946d73554916bd9a");
    	FunctionGetFileMD5(DLL_key_MD5_Index_1,"6400e224b8b44ece59a992e6d8233719");
    		///////////// VERIFICATION PATCH LIB ///////////////////
    	FunctionGetFileMD5(LIB_key_MD5_Index_0,"d2505c6e64dc44a1745dda0905f4e787");
    	FunctionGetFileMD5(LIB_key_MD5_Index_1,"5e996d35b598676b253dd25fa3809ef2");
    	FunctionGetFileMD5(LIB_key_MD5_Index_2,"c4c28529b05b4093f629fb7b23603cd2");
    	FunctionGetFileMD5(LIB_key_MD5_Index_3,"966048f390a65bebf60f912845441110");
    	FunctionGetFileMD5(LIB_key_MD5_Index_4,"9e1e72faaafcde16dfd0e643a31f0b74");
    	FunctionGetFileMD5(LIB_key_MD5_Index_5,"8336371539a459e72d7110f0cb1ed84f");
    	FunctionGetFileMD5(LIB_key_MD5_Index_6,"3dc2d3d11ba4c668a0097fbd631c7be6");
    	FunctionGetFileMD5(LIB_key_MD5_Index_7,"39c29074226b2196e7f13ce93560d3d0");
    	FunctionGetFileMD5(LIB_key_MD5_Index_8,"009e6647dfac211b6e69c6b3f1ed5600");
    	FunctionGetFileMD5(LIB_key_MD5_Index_9,"2bff75340aa1d94b88bfc7915a291564");
    	FunctionGetFileMD5(LIB_key_MD5_Index_10,"aabdd94dfe3a1b0092f0a414a935c091");
    		///////////// VERIFICATION INDEX ///////////////////
    	FunctionGetFileMD5(Index_key_md5_,"8823ca827dfc980798856e97f3568cef");
    		///////////// VERIFICATION FILES PACK ///////////////////
    	FunctionGetFileMD5(PACK_key_MD5_Index_0,"ce13b7c96f725b7d7c39cbe1ae2f8b4d");
    	FunctionGetFileMD5(PACK_key_MD5_Index_1,"7c0b756d079a9c76a220a724b9594eeb");
    	FunctionGetFileMD5(PACK_key_MD5_Index_2,"5b1aea18b89330481e16eca94673951c");
    #endif	

     

    • Metin2 Dev 19
    • kekw 2
    • Eyes 1
    • Dislove 1
    • Angry 1
    • Good 2
    • Love 23
  3. M2 Download Center

    This is the hidden content, please
    ( Internal )

    I made these tutorial at the request of a member from this community who wanted to buy this very simple verification.

    Spoiler

    2254507b46693f53f201bd91bbb1b7fb1b8636.g

     

    Example quest:

    quest shit_function begin
    	state start begin
    		when kill with npc.is_pc() begin
    			local global_insult_sex
    				if pc.get_sex() == 0 then
    					global_insult_sex = "gay"
    				else
    					global_insult_sex = "bitch"
    				end
    				
    			local check_my_ip = pc.get_ip()
    			local check_enemy_ip = npc.get_ip()
      
    				if check_my_ip == check_enemy_ip then
    					say("You're too "..global_insult_sex.."!")
    					return	
    			end
    		end
    	end
    end

    Server/quest_functions

    pc.get_ip
    npc.get_ip

    Src/game/questlua_pc.cpp

    	int pc_get_ip(lua_State* L)
    	{
    		LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
    		if(!ch) return 0;
     
    		lua_pushstring(L, ch->GetDesc()->GetHostName());
    		return 1;
    	}
    	
    	{ "get_ip",				pc_get_ip							},

    Src/game/questlua_npc.cpp

    	int npc_get_ip(lua_State* L)
        {
            LPCHARACTER npc = CQuestManager::instance().GetCurrentNPCCharacterPtr();
            if (npc && npc->IsPC())
                lua_pushstring(L, npc->GetDesc()->GetHostName());
            else
                lua_pushstring(L, "");
            return 1;
        }
    	
    	{ "get_ip",						npc_get_ip						},

     

        #include "desc.h"

     

    Bonus

    Spoiler

     

    mKCWHQU.png

    Shit code (Not tested, only for see how to check function in count kill):

    
    --[[
    ##########################################
    # Quest: Blocking IP address to killings #
    # Date: 25/05/2016    	                 #
    ##########################################
    ]]
    
    	function Verification_Ip_Adress()
    		local search_me = pc.get_ip()
    		local search_enemy = npc.get_ip()	
    		local table_count_kill_ip = pc.getqf("count_ip_block")	
    		if search_me == search_enemy then
    			pc.setqf("count_ip_block", pc.getqf("count_ip_block") + 1)
    		end	
    	end
    	function Verification_Block()
    		local go_to_text_insult_find_by_race
    		if pc.get_sex() == 0 then
    			go_to_text_insult_find_by_race = "gay"
    		else
    			go_to_text_insult_find_by_race = "bitch"
    		end	
    		local block_me = pc.get_ip()
    		local block_enemy = npc.get_ip()	
    		local list_block_ = pc.getqf("count_ip_block")	
    		if block_me == block_enemy and list_block_ == 10 then
    			say("You're too "..go_to_text_insult_find_by_race.."!")
    			pc.setqf("count_ip_block", 0) -- restart 
     ---- your function for ban or etc etc... --------
    			return
    		end
    	end
            when kill with npc.is_pc() begin	
    			if get_time() < pc.getqf("time_kill") then
    				syschat("Not yet passed the 5 minutes after the last killing!")
    				return
    			end
    
    			pvp_global.Verification_Block()
    			pvp_global.Verification_Ip_Adress()
    			pc.setqf("time_kill", get_time()+ 300)
    		end
    	end

    These features already exist in the source, but for some it may have been helpful.

     

     

    • Metin2 Dev 6
    • Love 1
  4. I see you want to use for description in refine, you can start with this:

     

        

    	def OverInItem(self, value_t):
    		global description_refine
    		import grp
    		if description_refine:
    			table_description = {
    							30501 : ["[1] Value text","[2] Value text","[3] Value text"],	
    							30502 : ["[1] Value text","[2] Value text","[3] Value text"],	
    							30503 : ["[1] Value text","[2] Value text","[3] Value text"],	
    							30504 : ["[1] Value text","[2] Value text","[3] Value text"],	
    							30505 : ["[1] Value text","[2] Value text","[3] Value text"],	
    							30506 : ["[1] Value text","[2] Value text","[3] Value text"],								
    			}
    			try:
    				self.tooltipItem.ClearToolTip()
    				item.SelectItem(description_refine[value_t])
    				self.tooltipItem.AutoAppendTextLine("%s" % item.GetItemName(), self.tooltipItem.TITLE_COLOR)
    				self.tooltipItem.AppendSpace(5)
    				self.tooltipItem.AutoAppendTextLine("Test value:", self.SPECIAL_POSITIVE_COLOR)			
    				for i in xrange(len(table_description[description_refine[value_t]])):
    					self.tooltipItem.AutoAppendTextLine("%s" % table_description[description_refine[value_t]][i])
    				self.tooltipItem.AlignHorizonalCenter()
    				self.tooltipItem.ShowToolTip()
    			except:
    				pass
    
     
    • Love 1
  5. If I understood well you want it, here is a simple function (i not tested):

    // Search in game.py function OnUpdate and add:

    		if 1 == constInfo.ENABLE_PICKUP:
    			self.PickUpItem()	

    // Search:

    onPressKeyDict[app.DIK_F4]    = lambda : self.__PressQuickSlot(7)

    // Add bellow:

    onPressKeyDict[app.DIK_F5]    = lambda : self.__EnablePickUpItem()

     

    	def	__EnablePickUpItem(self):
    		global CHECK_ACTIVE_PICKUP
    		if CHECK_ACTIVE_PICKUP == 0:
    			CHECK_ACTIVE_PICKUP = 1
    			constInfo.ENABLE_PICKUP = 1
    		else:
    			CHECK_ACTIVE_PICKUP = 0
    			constInfo.ENABLE_PICKUP = 0

    // Search:

    testAlignment = 0

    // Add bellow:

    CHECK_ACTIVE_PICKUP = 0

    // Add in constInfo.py:

    ENABLE_PICKUP = 0
    • Good 1
  6. mKCWHQU.png

     

    3 hours ago, MartaSampaio said:

    I believe you can add a qf counting the kills, using Vegas example

    But having it reset after some time, for example 15min?

    Dont actually know how to write it, just supposing it could be that way, im sure theres someone that may write it or even better then my example

     

    It was written in 15 minutes, may be some mistakes and the code is not one of the best.

    --[[
    ##########################################
    # Dev: VegaS        	  				 #
    # Quest: Blocking IP address to killings #
    # Date: 25/05/2016    	  				 #
    ##########################################
    ]]
    quest pvp_global begin
        state start begin
    	function Verification_Ip_Adress()
    		local search_me = pc.get_ip()
    		local search_enemy = npc.get_ip()	
    		local table_count_kill_ip = pc.getqf("count_ip_block")	
    		if search_me == search_enemy then
    			pc.setqf("count_ip_block", pc.getqf("count_ip_block") + 1)
    		end	
    	end
    	function Verification_Block()
    		local go_to_text_insult_find_by_race
    		if pc.get_sex() == 0 then
    			go_to_text_insult_find_by_race = "gay"
    		else
    			go_to_text_insult_find_by_race = "bitch"
    		end	
    		local block_me = pc.get_ip()
    		local block_enemy = npc.get_ip()	
    		local list_block_ = pc.getqf("count_ip_block")	
    		if block_me == block_enemy and list_block_ == 10 then
    			say("You're too "..go_to_text_insult_find_by_race.."!")
    			return
    		end
    	end
            when login with pc.level >= 1 begin
                set_state(player_kill)
            end
        end
        state player_kill begin
            when letter begin
                send_letter("Kill PvP")
            end
    
            when button or info begin
                say_title("Experts pvp")
                say_reward("Kill 30 player!")
                pc.setqf("state_kill", 30)
                q.set_counter("Kills left:", 30)
    			set_state(kill)
            end
       end
       state kill begin
          when letter begin
             send_letter("Duel")
          end
    		when button or info begin
    			say("Your text........")
    			say_reward("Kills left: "..pc.getqf("state_kill").." ")
    		end
    
            when kill with npc.is_pc() begin	
    			if get_time() < pc.getqf("time_kill") then
    				syschat("Not yet passed the 5 minutes after the last killing!")
    				return
    			end
    
    			pvp_global.Verification_Block()
    			
                local count_kill = pc.getqf("state_kill") - 1
                if count_kill <= 30 then
    				pvp_global.Verification_Ip_Adress()
    
                    pc.setqf("state_kill", count_kill)
                    q.set_counter("Kills left:", count_kill)
    				pc.setqf("time_kill", get_time()+ 300) -- 5 minutes
                end
                if count_kill == 0 then
                    say_title("Congratulations!")
    				notice_all("".. pc.get_name() .." mission completed your details!")
                    clear_letter()
                    set_state(__COMPLETE__)
                end
    		end
    	end
    		state __COMPLETE__ begin
        end
    end

     

    3 hours ago, Exygo said:

    Don't forget #include "desc_client.h"

    for quest_lua_npc

    Is ok and, perhaps it already has:

        #include "desc.h"
    
     

     

     

    • Love 1
  7. 7b46693f53f201bd91bbb1b7fb1b8636.gif

     

    I made this 5 minutes .. why pay for this easy work? xD

    Quest:

    quest lua_function_vegas begin
    	state start begin
    		when kill with npc.is_pc() begin
    			local global_insult_sex
    				if pc.get_sex() == 0 then
    					global_insult_sex = "gay"
    				else
    					global_insult_sex = "bitch"
    				end
    				
    			local check_my_ip = pc.get_ip()
    			local check_enemy_ip = npc.get_ip()
      
    				if check_my_ip == check_enemy_ip then
    					say("You're too "..global_insult_sex.."!")
    					return	
    			end
    		end
    	end
    end
    Server/quest_functions
    
    pc.get_ip
    npc.get_ip
    Src/game/questlua_pc.cpp
    	int pc_get_ip(lua_State* L)
    	{
    		LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
    		if(!ch) return 0;
     
    		lua_pushstring(L, ch->GetDesc()->GetHostName());
    		return 1;
    	}
    	
    	{ "get_ip",				pc_get_ip							},
    Src/game/questlua_npc.cpp  
    	int npc_get_ip(lua_State* L)
        {
            LPCHARACTER npc = CQuestManager::instance().GetCurrentNPCCharacterPtr();
            if (npc && npc->IsPC())
                lua_pushstring(L, npc->GetDesc()->GetHostName());
            else
                lua_pushstring(L, "");
            return 1;
        }
    	
    	{ "get_ip",						npc_get_ip						},
    • Love 2
  8.  

    if (GetGMLevel() == GM_VIP)
    	    {
    	        m_afAffectFlag.Set(AFF_VIP);
    	    }
    else if (GetGMLevel() == GM_VIP)
    	        {
    	            m_afAffectFlag.Set(AFF_VIP);
    	        }
    if (IsVIP())
            return;    
    
      - delete
    

    For remove  PK_PROTECTED .

    • Love 1
  9. Not completely your tutorial, here i give you full parts xD

    1. Search in char.cpp:

    cannot_dead = false;
    
    2. Add below:
    costume_visible = true;
    
    1. Search:
    WORD CHARACTER::GetPart(BYTE bPartPos) const
    	{
    	    assert(bPartPos < PART_MAX_NUM);
    	    return m_pointsInstant.parts[bPartPos];
    	}
    
    2. Change with:
    WORD CHARACTER::GetPart(BYTE bPartPos) const
    {
    	assert(bPartPos < PART_MAX_NUM);
    	if(bPartPos == PART_MAIN && GetWear(WEAR_COSTUME_BODY) && CostumeVisible() == false)
    		if(const LPITEM pArmor = GetWear(WEAR_BODY))
    			return pArmor->GetVnum();
    
    	return m_pointsInstant.parts[bPartPos];
    }

    1. Search:

    WORD CHARACTER::GetOriginalPart(BYTE bPartPos) const
    {
    	switch (bPartPos)
    	{
    		case PART_MAIN:
    			if (!IsPC())
    				return GetPart(PART_MAIN);
    			else
    				return m_pointsInstant.bBasePart;
    		case PART_HAIR:
    			return GetPart(PART_HAIR);	
    		case PART_ACCE:
    			return GetPart(PART_ACCE);
    		default:
    			return 0;
    	}
    }
    
     2. Change with:
    WORD CHARACTER::GetOriginalPart(BYTE bPartPos) const
    {
    	switch(bPartPos)
    	{
    		case PART_MAIN:
    			if(GetWear(WEAR_COSTUME_BODY) && CostumeVisible() == false)
    				if(const LPITEM pArmor = GetWear(WEAR_BODY))
    					return pArmor->GetVnum();
    
    			if(!IsPC())
    				return GetPart(PART_MAIN);
    			else
    				return m_pointsInstant.bBasePart;
    		case PART_HAIR:
    			return GetPart(PART_HAIR);
    #ifdef __ENABLE_ACCE_
            case PART_ACCE:
                return GetPart(PART_ACCE);
    #endif
    		default:
    			return 0;
    	}
    }

    1. Search in char.h:

    void            SetLastSyncTime(const timeval &tv) { memcpy(&m_tvLastSyncTime, &tv, sizeof(timeval)); }
    	        const timeval&    GetLastSyncTime() { return m_tvLastSyncTime; }
    	        void            SetSyncHackCount(int iCount) { m_iSyncHackCount = iCount;}
    	        int                GetSyncHackCount() { return m_iSyncHackCount; }
    
    2. Add below:
    	public:
    
    	    bool CostumeVisible() const { return costume_visible; };
    
    	    void SetCostumeVisible(bool visible) { costume_visible = visible; };
    
    	private:
    
    	    bool costume_visible;
    
    1. Search in item.cpp:
    		case ITEM_ARMOR:
    			{
    				if (0 != m_pOwner->GetWear(WEAR_COSTUME_BODY))
    					break;
    
    				if (GetSubType() == ARMOR_BODY || GetSubType() == ARMOR_HEAD || GetSubType() == ARMOR_FOOTS || GetSubType() == ARMOR_SHIELD)
    				{
    					if (bAdd)
    					{
    						if (GetProto()->bSubType == ARMOR_BODY)
    							m_pOwner->SetPart(PART_MAIN, GetVnum());
    					}
    					else
    					{
    						if (GetProto()->bSubType == ARMOR_BODY)
    							m_pOwner->SetPart(PART_MAIN, m_pOwner->GetOriginalPart(PART_MAIN));
    					}
    				}
    			}
    			break;

    2. Delete function and change with this:

    		case ITEM_ARMOR:
    		{
    			if(m_pOwner->GetWear(WEAR_COSTUME_BODY) && m_pOwner->CostumeVisible() == true)
    				break;
    
    			if(GetSubType() == ARMOR_BODY || GetSubType() == ARMOR_HEAD || GetSubType() == ARMOR_FOOTS || GetSubType() == ARMOR_SHIELD)
    			{
    				if(bAdd)
    				{
    					if(GetProto()->bSubType == ARMOR_BODY)
    						m_pOwner->SetPart(PART_MAIN, GetVnum());
    				}
    				else
    				{
    					if(GetProto()->bSubType == ARMOR_BODY)
    						m_pOwner->SetPart(PART_MAIN, m_pOwner->GetOriginalPart(PART_MAIN));
    				}
    			}
    		}
    			break;

    1. Search:

    		case ITEM_COSTUME:
    			{
    				DWORD toSetValue = this->GetVnum();
    				EParts toSetPart = PART_MAX_NUM;
    				if (GetSubType() == COSTUME_BODY)
    				{
    					toSetPart = PART_MAIN;
    					if (false == bAdd)
    					{
    						const CItem* pArmor = m_pOwner->GetWear(WEAR_BODY);
    						toSetValue = (NULL != pArmor) ? pArmor->GetVnum() : m_pOwner->GetOriginalPart(PART_MAIN);						
    					}
    					
    				}

    2. Change with:

    		case ITEM_COSTUME:
    		{
    			DWORD toSetValue = this->GetVnum();
    			EParts toSetPart = PART_MAX_NUM;
    
    			if(GetSubType() == COSTUME_BODY)
    			{
    				toSetPart = PART_MAIN;
    				if(false == bAdd || (m_pOwner->GetWear(WEAR_BODY) && m_pOwner->CostumeVisible() == false))
    				{
    					const CItem* pArmor = m_pOwner->GetWear(WEAR_BODY);
    					toSetValue = (NULL != pArmor) ? pArmor->GetVnum() : m_pOwner->GetOriginalPart(PART_MAIN);
    				}
    			}

    Good quest:

    quest costume begin
    	state start begin
    		when login begin
    			cmdchat("costume "..q.getcurrentquestindex())
    		end
    		when button or info begin
    			if pc.getqf("costume") == 1 then
    				chat("You chose visibility costume.")
    				pc.setqf("costume", 2)
    				pc.costume(0)
    			elseif pc.getqf("costume") == 2 then
    				chat("You chose visibility armor.")
    				pc.setqf("costume", 1)
    				pc.costume(1)
    			end
    		end
    	end
    end
     
    quest login_costume_use begin
    	state start begin
    		when login with pc.getqf("block_quest") == 0 begin
    			pc.setqf("block_quest", 1)
    			pc.setf("costume", "costume", 1)
    		end
    	end
    end
    
     
    • Love 8
  10. And why is it necessary to make a reply with that? :

    • price,
    • bugs of the design,
    • if there is a possibility for minor custom job (more like 2 small fixes) and if so,
    • specify if there is an extra fee about custom job and how much is this fee...

    When you can easily put it that people have to contact you through a private message or give your skype.

    I apologize for this comment but it was only an opinion, not something bad.

  11. 1 hour ago, avertuss said:

    @VegaS

     

    It's work but it add bonus after relog and if i change align points to 0 this bonus don't remove. 

     

    if (FindAffect(ALIGNMENT_BONUS_1))
    	{
    		if (GetRealAlignment() != NAME_ALIGNMENT_1)  
    		{	
    			RemoveAffect(ALIGNMENT_BONUS_1);
    			//return false;
    		}	
    	}
    I apologize for this ugly code, but I'm very tired.

    I haven't tested this, but I can help you more on skype, because we did not stay very long forum.

  12. affect.h:

    // 1) Search: 

    AFFECT_CUBE_12,
     

    // 2) After make a new line and paste:

    ALIGNMENT_BONUS_1,
    ALIGNMENT_BONUS_2,
     

    Code for use:

    	#ifdef __ALIGNMENT_BONUS__ 
    	    if (GetRealAlignment() == NAME_ALIGNMENT_1)
    	    {
    	        AddAffect(ALIGNMENT_BONUS_1, POINT_MAX_HP, VALUE_BONUS_ALIGNMENT_1, 0, ALIGNMENT_TIME, 0, true);
    	    }
    	    if (GetRealAlignment() == NAME_ALIGNMENT_2)
    	    {
    	        AddAffect(ALIGNMENT_BONUS_2, POINT_MAX_HP, VALUE_BONUS_ALIGNMENT_2, 0, ALIGNMENT_TIME, 0, true);
    	    }
    	#endif
     service.h:
    
    	#define	__ALIGNMENT_BONUS__ 
    
    	#define	NAME_ALIGNMENT_1	100000
    	#define	NAME_ALIGNMENT_2	200000
    
    	#define ALIGNMENT_TIME (60*60*24*365)
    
    	#define	VALUE_BONUS_ALIGNMENT_1	1000
    	#define	VALUE_BONUS_ALIGNMENT_2	2000

     

    You can add code execution in input_login.cpp -> EnterGame

    • Love 1
  13. char.cpp:

     

    Search and delete:

                

    if (GetRealAlignment() < 0)
    	            {
    	                if (IsEquipUniqueItem(UNIQUE_ITEM_FASTER_ALIGNMENT_UP_BY_TIME))
    	                    UpdateAlignment(120 * (dwPlayedTime / 60000));
    	                else
    	                    UpdateAlignment(60 * (dwPlayedTime / 60000));
    	            }
    	            else
    	                UpdateAlignment(5 * (dwPlayedTime / 60000));
    
    	        }
    
     

     

    If you want when you sign King item (70050) as your degree of alignment to grow then alter the function only with this:

                 

    			if (GetRealAlignment() < 0)
    	            {
    	                if (IsEquipUniqueItem(UNIQUE_ITEM_FASTER_ALIGNMENT_UP_BY_TIME))
    	                    UpdateAlignment(120 * (dwPlayedTime / 60000));
    	            } 
    
     

     

    And search in char_battle.cpp and delete function:

        

    if (pkAttacker->IsPC())
    	    {
    	        if (GetLevel() - pkAttacker->GetLevel() >= -10)
    	            if (pkAttacker->GetRealAlignment() < 0)
    	            {
    	                if (pkAttacker->IsEquipUniqueItem(UNIQUE_ITEM_FASTER_ALIGNMENT_UP_BY_KILL))
    	                    pkAttacker->UpdateAlignment(14);
    	                else
    	                    pkAttacker->UpdateAlignment(7);
    	            }
    	            else
    	                pkAttacker->UpdateAlignment(2);
    
     

    I hope I understood what you said, correct me if not, this is want you want?

     

     

    • Love 2
  14. # 1.) Search in game.py:

    onPressKeyDict[app.DIK_F4]    = lambda : self.__PressQuickSlot(7)
    
     

    # 2.) Add below:

    onPressKeyDict[app.DIK_F5]        = lambda : self.LoadScript()
    
     
    def LoadScript(self):
    	        import mtdbg
    	        mtdbg.LoadMichaFile("files_work_1.py", "NameClassWindow")
    
     

    Add in root new files mtdbg.py and he added:

    import ui
    	import imp as micha_imp
    	global actual_michabg_files
    	actual_michabg_files = {}
    
    class LoadMichaFile(ui.ScriptWindow):
        def __init__(self, micha_f, micha):
            global actual_michabg_files
            ui.ScriptWindow.__init__(self)
            self.Show()
            k = micha_f + "|"+ micha 
            if(actual_michabg_files.has_key(k)):
                if(actual_michabg_files[k] != None):
                    actual_michabg_files[k].Hide()
                    actual_michabg_files[k] = None
            self.s = micha_imp.load_source(micha, micha_f)
            self._c= getattr(self.s, micha)()
            self._c.Show()
            actual_michabg_files[k] = self._c
            print "Reloaded "+ micha_f + "." + micha
    
        def __del__(self):
            ui.ScriptWindow.__del__(self)

     

    Example of use:

    Put the script you want to edit root client and rename it in files_work_1.py then enter and edit your class like:

        class NameClassWindow(ui.BoardWithTitleBar): # --* NEW

     

    Thanks to @Micha aka xCPx

     

     

    • Love 1
  15. 13 minutes ago, wezt said:

    Here is an other way with using socket_pct from item_proto (you'll be able to set different effects for costumes):

    In UserInterface\InstanceBase.cpp -> UINT CInstanceBase::__GetRefinedEffect(CItemData* pItem) add after 'case CItemData::ITEM_TYPE_ARMOR:':

    
    	case CItemData::ITEM_TYPE_COSTUME:
    		if (refine < 7)
    			return 0;
    
    		if (pItem->GetSubType() == CItemData::COSTUME_BODY)
    		{
    			__ClearArmorRefineEffect();
    			m_armorRefineEffect = EFFECT_REFINED+EFFECT_BODYARMOR_REFINED7+refine-7;
    			__AttachEffect(m_armorRefineEffect);
    		}
    		break;

    Regards.

    Another solution easier:

     

    #ifdef __ENABLE_EFFECT_COSTUME_FUNCTION_PROTO_ 
    	case CItemData::ITEM_TYPE_COSTUME:
    	
    		if (pItem->GetSubType() == CItemData::COSTUME_BODY)
    		{
    			DWORD vnum = pItem->GetIndex();
    			long value_proto = pItem->GetValue(3);
    
    			if (value_proto == 1000)
    				__AttachEffect(EFFECT_REFINED+EFFECT_COSTUME_TITAN_1);
    			else  if (value_proto == 1500)
    				__AttachEffect(EFFECT_REFINED+EFFECT_COSTUME_TITAN_2);
    			else  if (value_proto == 2000)
    				__AttachEffect(EFFECT_REFINED+EFFECT_COSTUME_TITAN_3);
    			else  if (value_proto == 2500)
    				__AttachEffect(EFFECT_REFINED+EFFECT_COSTUME_TITAN_4);
    			else  if (value_proto == 3000)
    				__AttachEffect(EFFECT_REFINED+EFFECT_COSTUME_TITAN_5);
    		}
    }
    #endif

      

    • Good 1
    • Love 1
  16. For yellow:

    i4xitF3.png

     

    colorInfo.py:

     

    CHR_NAME_RGB_MOB = (235, 22, 9)
    CHR_NAME_RGB_NPC = (122, 231, 93)
    CHR_NAME_RGB_PC = (255, 215, 76)
    CHR_NAME_RGB_PK = (180, 100, 0)
    CHR_NAME_RGB_PVP = (238, 54, 223)
    CHR_NAME_RGB_PARTY = (128, 192, 255)
    CHR_NAME_RGB_WARP = (136, 218, 241)
    CHR_NAME_RGB_WAYPOINT = (255, 255, 255)
    
     

    Because in uiMiniMap.py exist:

    self.tooltipInfo.SetTextColor(dwTextColor)
    
     

    With colors and functions are loaded here:

    pnMWr20.png

     

    And check your function in introLoading.py:

     

    j5Zfntb.png

    • Love 1
×
×
  • 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.