You are not logged in.
Это нормально, что опкод 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
Исходников все равно нет, чтобы исправить
Offline
Я щас начал переписывать... Сделал так, чтобы память под код удалялась во время перезагрузки или завершения игры (иногда надо, чтоб код сохранялся после завершения скрипта - если делать хук в ексе).
#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 потом согласие на релиз 
Вот кстати как сделал хандлинг опкодов.
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
Я думаю он не будет против, тем более, если он уже не занимается cleo. А лучше еще будет, если ты подправишь cleo для Vice City. Там есть досадный баг, который "мешает жить". Вообщем, если запустить новую игру, а потом еще раз новую то вылет... 
I know everything and nothing...
Offline
Возможно займусь и Вайсом, но только после того, как это завершу.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Тогда сразу могу сказать, что я еще заметил на текущих версиях, пока что вот это: если в мейне используешь call_scm функцию то вылет, она работает только в cleo скриптах (это относится как для Вайс так и для III). Неплохо бы добавить опкоды по работе с битами, а то писать в каждом скрипте asm вставки..., а и еще опкод, который получает офсет метки и офсет переменной (и тут тоже чтоб и в мейне желательно работало, в Вайсе не робит).
I know everything and nothing...
Offline
Наверное потому что информация о функции находится в дополнительном буфере в структуре CLEO-скрипта.
Кстати, вопрос к Seemanу - как избавиться от ошибки "File contains no information"? Как SB получает эту информацию из asi?
По CLEO - уже вроде как написал основу, осталось все опкоды перенести. Скрипты уже работают 
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
Сделал опкоды из 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
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Кстати, вопрос к Seemanу - как избавиться от ошибки "File contains no information"? Как SB получает эту информацию из asi?
С утра в понедельник голова плохо работает, поэтому уточню: что это за ошибка? Когда и при каких условиях она возникает?
Offline
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
Не знаю, пока что такой цели нет.
Осталось сделать опкоды поиска педов/транспорта/обьектов.
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
Наверное. Я код написал уже, но проверяю только на скриптах.
Опкоды уже все написал, осталось проверить их.
Также добавил возможность использовать строки в опкодах с переменным кол-вом параметров (т.е. можно будет передавать строки в scm-функциях).
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
DK22Pac
если я правильно понял, о чем речь, тебе нужно добавить информацию о версии файла к твоей asi (.dll) Это сообщение, видимо, стандартное виндовское, потому что я его не вывожу специально.
Санник проверяет версию CLEO.asi, чтобы предложить обновление в случае чего. Надо будет переделать эту функцию, чтобы ошибка не выводилась.
Offline
Увы, с моей поломанной 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
Попробуй удалить файл 'tools\CLEO4\SA\CLEO.asi'
Offline
DK22Pac
можешь скинуть мне проблемный cleo.asi, чтобы я смог воспроизвести ту ошибку и исправить ее?
Offline
DK22Pac
А планируется ли добавление работы с ini? Этого чертовски не хватает в трешке и вайсе 
P.S.
cleo для Vice City. Там есть досадный баг, который "мешает жить". Вообщем, если запустить новую игру, а потом еще раз новую то вылет
Охох спасибо за инфу! Я уже думал смириться и просто убрать пункт "новая игра" в своем моде, т.к. никак не мог понять, какая же проблема в моем мэйне крашит игру при рестарте.
Теперь реально - вся надежда на DK22Pac!
Last edited by Shag (06-09-2014 23:02)
Offline
Работу с 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
ZeroTen, спасибо конечно, но надеюсь DK22Pac сможет превратить это
в один опкод...
Это и не нужно совать в Клео, ибо данный код - отличный пример использования функции с длл'ки.
В WinAPI есть прекрасные нативные функции для работы с ини файлами - это GetPrivateProfileString и WritePrivateProfileString. Добавить их в КЛЕО с помощью с++ очень просто
Offline
После потери своих же исходников для 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