#126 10-08-2014 09:14

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: CLEO для GTA III

Это нормально, что опкод 05DC: не удаляет память, выделенную под код скрипта?

delete script;

При выгрузке скриптов и в 05DD:

if(script->m_pCodeAry)
    delete script->m_pCodeAry;
delete script;

При этом, скрипт удаляется их всех списков, и доступ к памяти просто теряется.

Last edited by DK22Pac (10-08-2014 09:18)


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#127 10-08-2014 10:23

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: CLEO для GTA III

Исходников все равно нет, чтобы исправить

Offline

#128 10-08-2014 10:31

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: CLEO для GTA III

Я щас начал переписывать... Сделал так, чтобы память под код удалялась во время перезагрузки или завершения игры (иногда надо, чтоб код сохранялся после завершения скрипта - если делать хук в ексе).

#pragma once
#include "Opcodes.h"
#include "CustomScript.h"
#include "Scripts.h"
#include "MemoryManager.h"

class CCustomOpcodes
{
	static eOpcodeResult EndCustomThread(CCustomScript *script)
	{
		script->RemoveFromList(&CScripts::pActiveScripts);
		script->RemoveFromCustomList(&CScripts::pCustomScripts);
		--CScripts::numActiveCustomScripts;
		delete script;
		return RET_CONTINUE;
	}

	static eOpcodeResult EndCustomThreadNamed(CCustomScript *script)
	{
		char *name = &CScripts::space[script->m_pc];
		script->m_pc += 8;
		for(CCustomScript *i = CScripts::pCustomScripts; i; i = i->m_pNextCustom)
		{
			if(!strcmp(i->m_acName, name))
			{
				i->RemoveFromList(&CScripts::pActiveScripts);
				i->RemoveFromCustomList(&CScripts::pCustomScripts);
				--CScripts::numActiveCustomScripts;
				delete i;
				return RET_CONTINUE;
			}
		}
		return RET_CONTINUE;
	}

	static void Register()
	{
		CScripts::RegisterCustomOpcode(0x05DC, EndCustomThread);
		CScripts::RegisterCustomOpcode(0x05DD, EndCustomThreadNamed);
	}
};
	static void UnloadCustomScripts()
	{
		for(CCustomScript *i = pCustomScripts; i; i = i->m_pNextCustom)
		{
			i->RemoveFromList(&CScripts::pActiveScripts);
			i->RemoveFromCustomList(&CScripts::pCustomScripts);
			--CScripts::numActiveCustomScripts;
			delete i;
		}
		CMemory::DeleteScriptsCode();
		CScripts::pCustomScripts = NULL;
	}

Не знаю, даст ли Alien потом согласие на релиз  lol

Вот кстати как сделал хандлинг опкодов.

	eOpcodeResult ProcessOneCommand()
	{
		unsigned short id = *(unsigned short *)&CScripts::space[m_pc] & 0x7FFF;
		if(*(unsigned short *)&CScripts::space[m_pc] & 0x8000)
			m_bNegFlag = true;
		else
			m_bNegFlag = false;
		m_pc += 2;
		// check for user (default replacement) opcodes here
		for(auto i = CScripts::defaultOpcodeReplacement.begin(); i != CScripts::defaultOpcodeReplacement.end(); i++)
		{
			if((*i).opcodeId == id)
				return (*i).opcodeFunc(this);
		}
		//
		switch(id)
		{
		case 0x004C: // GOTO_IF_TRUE
			Collect(1);
			if(m_bCompareFlag)
				JumpTo(CScripts::params.intParam[0]);
			return RET_CONTINUE;
		case 0x004D: // GOTO_IF_FALSE
			Collect(1);
			if(!m_bCompareFlag)
				JumpTo(CScripts::params.intParam[0]);
			return RET_CONTINUE;
		case 0x0002: // GOTO
			Collect(1);
			JumpTo(CScripts::params.intParam[0]);
			return RET_CONTINUE;
		case 0x0050: // GOSUB
			Collect(1);
			m_aRetAddr[m_nCountRet++] = m_pc;
			JumpTo(CScripts::params.intParam[0]);
			return RET_CONTINUE;
		default:
			if(id >= CUSTOM_OPCODES_START_ID)
			{
				if(CScripts::customOpcodes[id - CUSTOM_OPCODES_START_ID])
					return CScripts::customOpcodes[id - CUSTOM_OPCODES_START_ID](this);
				else
				{
					Error("Incorrect opcode ID: %04X", id);
					return RET_UNDEFINED_COMMAND;
				}
			}
			return CScripts::defaultOpcodeHandlers[id / 100](this, id);
		}
	}

Last edited by DK22Pac (10-08-2014 10:53)


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#129 10-08-2014 11:15

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: CLEO для GTA III

Я думаю он не будет против, тем более, если он уже не занимается cleo. А лучше еще будет, если ты подправишь cleo для Vice City. Там есть досадный баг, который "мешает жить". Вообщем, если запустить новую игру, а потом еще раз новую то вылет... sad


I know everything and nothing...

Offline

#130 10-08-2014 11:19

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: CLEO для GTA III

Возможно займусь и Вайсом, но только после того, как это завершу.


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#131 10-08-2014 11:29

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: CLEO для GTA III

Тогда сразу могу сказать, что я еще заметил на текущих версиях, пока что вот это: если в мейне используешь call_scm функцию то вылет, она работает только в cleo скриптах (это относится как для Вайс так и для III). Неплохо бы добавить опкоды по работе с битами, а то писать в каждом скрипте asm вставки..., а и еще опкод, который получает офсет метки и офсет переменной (и тут тоже чтоб и в мейне желательно работало, в Вайсе не робит).


I know everything and nothing...

Offline

#132 10-08-2014 16:36

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: CLEO для GTA III

Наверное потому что информация о функции находится в дополнительном буфере в структуре CLEO-скрипта.
Кстати, вопрос к Seemanу - как избавиться от ошибки "File contains no information"? Как SB получает эту информацию из asi?
По CLEO - уже вроде как написал основу, осталось все опкоды перенести. Скрипты уже работают  wink

Last edited by DK22Pac (10-08-2014 17:08)


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#133 10-08-2014 17:40

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: CLEO для GTA III

Отличная новость! Молодец что взялся делать!


I know everything and nothing...

Offline

#134 11-08-2014 02:28

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: CLEO для GTA III

Сделал опкоды из VC и опкоды для отрисовки текста.

{$CLEO}
05F7: 0@ = label @text offset
05F9: 1@ = 0xAAAAAAAA AND 0xFFFF
while true
    wait 0
    0602: printf 0@ at 200.0 200.0 scale 1.4 2.0 color 255 0 0 255 style 0 shadow 0 params 0xAAAAAAAA 0xFFFF 1@
end

:text
hex
    "0x%X" 20 "AND" 20 "0x%X" 20 "=" 20 "0x%X" 00
end

zU34meDm.jpg


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#135 11-08-2014 07:11

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: CLEO для GTA III

DK22Pac wrote:

Кстати, вопрос к Seemanу - как избавиться от ошибки "File contains no information"? Как SB получает эту информацию из asi?

С утра в понедельник голова плохо работает, поэтому уточню: что это за ошибка? Когда и при каких условиях она возникает?

Offline

#136 11-08-2014 11:30

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: CLEO для GTA III

Отрисовка текста...ммм. Вообще потрясно.


I know everything and nothing...

Offline

#137 11-08-2014 12:07

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: CLEO для GTA III

Seemann wrote:
DK22Pac wrote:

Кстати, вопрос к Seemanу - как избавиться от ошибки "File contains no information"? Как SB получает эту информацию из asi?

С утра в понедельник голова плохо работает, поэтому уточню: что это за ошибка? Когда и при каких условиях она возникает?

После того, как заменил CLEO.asi. Появляется постоянно, даже если просто вкладку переключить. Ещё из-за этого нельзя менять параметры в настройках (вылетает эта ошибка, и невозможно сохранить изменения).


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#138 11-08-2014 12:18

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: CLEO для GTA III

Слушай, а может ты еще лимит поднимешь для draw текста и для своего детища, или там с этим все в порядке, вроде как только два можно?


I know everything and nothing...

Offline

#139 12-08-2014 11:51

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: CLEO для GTA III

Не знаю, пока что такой цели нет.

Осталось сделать опкоды поиска педов/транспорта/обьектов.
LvBocpem.png

Scm-функции теперь должны работать в майне, правда, проверить пока что не могу.

Last edited by DK22Pac (12-08-2014 11:52)


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#140 12-08-2014 12:55

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: CLEO для GTA III

Ясно, ну что ж... Так а насчет офсетов метки: в мейне они корректно вычисляются?


I know everything and nothing...

Offline

#141 12-08-2014 18:58

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: CLEO для GTA III

Наверное. Я код написал уже, но проверяю только на скриптах.
Опкоды уже все написал, осталось проверить их.
Также добавил возможность использовать строки в опкодах с переменным кол-вом параметров (т.е. можно будет передавать строки в scm-функциях).


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#142 13-08-2014 11:20

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: CLEO для GTA III

DK22Pac
если я правильно понял, о чем речь, тебе нужно добавить информацию о версии файла к твоей asi (.dll) Это сообщение, видимо, стандартное виндовское, потому что я его не вывожу специально.
Санник проверяет версию CLEO.asi, чтобы предложить обновление в случае чего. Надо будет переделать эту функцию, чтобы ошибка не выводилась.

Offline

#143 17-08-2014 17:02

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: CLEO для GTA III

Увы, с моей поломанной MSVS не удается подключить ресурс к проекту. Программы, которые работают уже со скомпилированным файлом, тоже не хочется использовать.
Ещё такой косяк - если нажать на значок CLEO внизу, появится окно установки CLEO вместе с этой ошибкой. После этого вообще ничего нельзя будет сделать, даже закрыть сам Санни.


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#144 17-08-2014 21:38

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: CLEO для GTA III

Попробуй удалить файл 'tools\CLEO4\SA\CLEO.asi'

Offline

#145 21-08-2014 16:50

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: CLEO для GTA III

DK22Pac
можешь скинуть мне проблемный cleo.asi, чтобы я смог воспроизвести ту ошибку и исправить ее?

Offline

#146 06-09-2014 22:29

Shag
Registered: 29-03-2010
Posts: 147
Website

Re: CLEO для GTA III

DK22Pac
А планируется ли добавление работы с ini? Этого чертовски не хватает в трешке и вайсе cry

P.S.

mfisto wrote:

cleo для Vice City. Там есть досадный баг, который "мешает жить". Вообщем, если запустить новую игру, а потом еще раз новую то вылет

Охох спасибо за инфу! Я уже думал смириться и просто убрать пункт "новая игра" в своем моде, т.к. никак не мог понять, какая же проблема в моем мэйне крашит игру при рестарте.
Теперь реально - вся надежда на DK22Pac!

Last edited by Shag (06-09-2014 23:02)

Offline

#147 08-09-2014 22:22

ZeroTen
Registered: 28-08-2013
Posts: 5

Re: CLEO для GTA III

Работу с ini частично можно реализовать и на старом CLEO.
(версия для GTA 3)

{$CLEO .cs}

const
    dll = 0@
    LoadLibrary = 4@
    FreeLibrary = 5@
    GetProcAddress = 6@
    GetPrivateProfileInt = 7@
    Hour = 8@
    Minute = 9@
end

05E0: LoadLibrary = read_memory 0x61D458 size 4 virtual_protect 0
05E0: FreeLibrary = read_memory 0x61D460 size 4 virtual_protect 0
05E0: GetProcAddress = read_memory 0x61D45C size 4 virtual_protect 0

05F5: call_scm_func @getLabelOffset 1 label @KERNEL32 store_to 1@      // DllName
05E2: call_function LoadLibrary num_params 1 pop 0 file_mame 1@ ret_to dll
if
    dll <> 0
then
    05F5: call_scm_func @getLabelOffset 1 label @GETPRIVATEPROFILEINTA store_to 1@    // ProcName
    05E2: call_function GetProcAddress num_params 2 pop 0 proc_mame 1@ h_module dll ret_to GetPrivateProfileInt
    if
        GetPrivateProfileInt <> 0 
    then
        05F5: call_scm_func @getLabelOffset 1 label @MAIN store_to 1@       // AppName
        05F5: call_scm_func @getLabelOffset 1 label @HOUR store_to 2@       // KeyName
        05F5: call_scm_func @getLabelOffset 1 label @FILE store_to 3@       // FileName

        05E2: call_function GetPrivateProfileInt num_params 4 pop 0 file_mame 3@ n_default 0 key_mame 2@ app_name 1@ ret_to Hour

        05F5: call_scm_func @getLabelOffset 1 label @MINUTE store_to 2@     // KeyName

        05E2: call_function GetPrivateProfileInt num_params 4 pop 0 file_mame 3@ n_default 0 key_mame 2@ app_name 1@ ret_to Minute

    end
    05E1: call FreeLibrary num_params 1 pop 1 h_module dll
end

while true
    0001: wait 500 ms
    00C0: set_current_time Hour Minute
end

05DC: end_custom_thread

:KERNEL32
hex
    "kernel32.dll" 00
end

:GETPRIVATEPROFILEINTA
hex
    "GetPrivateProfileIntA" 00
end

:MAIN
hex
    "MAIN" 00
end

:HOUR
hex
    "Hour" 00
end

:MINUTE
hex
    "Minute" 00
end

:FILE
hex
    ".\CLEO\ReadIni.ini" 00
end

:getLabelOffset     // Thanks to ThirteenAG
{  Example:
    05F5: call_scm_func @getLabelOffset 1 label @lbl store_to 0@
}
if 
  0@ <> 0 
then
  05EC: 1@ = current_thread_pointer
  1@ += 0x98
  05E0: 1@ = read_memory 1@ size 4 virtual_protect 0 
  000C: 1@ -= 0@ 
else
  1@ = 0 
end
05F6: ret 1 1@

Offline

#148 09-09-2014 04:12

Shag
Registered: 29-03-2010
Posts: 147
Website

Re: CLEO для GTA III

ZeroTen, спасибо конечно, но надеюсь DK22Pac сможет превратить это wow в один опкод...

Last edited by Shag (09-09-2014 04:12)

Offline

#149 09-09-2014 20:20

SHooZ
From: Львів
Registered: 05-06-2013
Posts: 51
Website

Re: CLEO для GTA III

Shag wrote:

ZeroTen, спасибо конечно, но надеюсь DK22Pac сможет превратить это wow в один опкод...

Это и не нужно совать в Клео, ибо данный код - отличный пример использования функции с длл'ки.
В WinAPI есть прекрасные нативные функции для работы с ини файлами - это GetPrivateProfileString и WritePrivateProfileString. Добавить их в КЛЕО  с помощью с++ очень просто

Offline

#150 14-02-2015 04:59

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: CLEO для GTA III

После потери своих же исходников для CLEO III, желания писать "по новой" совсем не было... Но вчера что-то перевернулось.
Сейчас уже написал основу, - без дополнительных опкодов, FXT и текста в меню.
Упростил работу с кастомными опкодами до минимума - есть общее пространство опкодов (и стандартных, и кастомных), - можно регистрировать опкод с любым id, включая стандартные.

eOpcodeResult CScript::ProcessOneCommand()
{
    *game.Scripts.pNumOpcodesExecuted += 1;
    unsigned short id = *(unsigned short *)&game.Scripts.Space[this->m_dwIp] & 0x7FFF;
    if(*(unsigned short *)&game.Scripts.Space[this->m_dwIp] & 0x8000)
        this->m_bNotFlag = true;
    else
        this->m_bNotFlag = false;
    this->m_dwIp += 2;
    // check for custom opcodes here
    if(Opcodes::functions[id])
    {
        // call custom opcode
        LOGL(LOG_PRIORITY_OPCODE_ID, "%s custom opcode %04X", this->m_acName, id);
        return Opcodes::functions[id](this);
    }
    else if(id >= CUSTOM_OPCODE_START_ID)
    {
        LOGL(LOG_PRIORITY_ALWAYS, "Error (incorrect opcode): %s, %04X", this->m_acName, id);
        Error("Incorrect opcode ID: %04X", id);
        return OR_UNDEFINED;
    }
    // call default opcode
    LOGL(LOG_PRIORITY_OPCODE_ID, "%s opcode %04X", this->m_acName, id);
    eOpcodeResult result = game.Scripts.OpcodeHandlers[id / 100](this, id);
    return result;
}
#include "CustomOpcodes.h"
#include "Game.h"
#include "OpcodesSystem.h"

void CustomOpcodes::Register()
{
    Opcodes::RegisterOpcode(0x0002, GOTO);
    Opcodes::RegisterOpcode(0x004C, GOTO_IF_TRUE);
    Opcodes::RegisterOpcode(0x004D, GOTO_IF_FALSE);
    Opcodes::RegisterOpcode(0x0050, GOSUB);
}

eOpcodeResult CustomOpcodes::GOTO(CScript *script)
{
    script->Collect(1);
    script->JumpTo(game.Scripts.Params[0].nVar);
    return OR_CONTINUE;
}

eOpcodeResult CustomOpcodes::GOTO_IF_TRUE(CScript *script)
{
    script->Collect(1);
    if(script->m_bCondResult)
        script->JumpTo(game.Scripts.Params[0].nVar);
    return OR_CONTINUE;
}

eOpcodeResult CustomOpcodes::GOTO_IF_FALSE(CScript *script)
{
    script->Collect(1);
    if(!script->m_bCondResult)
        script->JumpTo(game.Scripts.Params[0].nVar);
    return OR_CONTINUE;
}

eOpcodeResult CustomOpcodes::GOSUB(CScript *script)
{
    script->Collect(1);
    script->m_aGosubAddr[script->m_nCurrentGosub++] = script->m_dwIp;
    script->JumpTo(game.Scripts.Params[0].nVar);
    return OR_CONTINUE;
}

Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

Board footer

Powered by FluxBB