mono::string CScriptbind_LevelSystem::GetDefaultGameType(ILevelInfo *pLevelInfo) { if(auto pGameType = pLevelInfo->GetDefaultGameType()) return ToMonoString(pGameType->name); return ToMonoString(""); }
mono::string CScriptbind_Console::GetCVarString(mono::string name) { if(ICVar *pCVar = gEnv->pConsole->GetCVar(ToCryString(name))) return (mono::string )ToMonoString(pCVar->GetString()); return (mono::string )ToMonoString(""); }
mono::string CScriptbind_Entity::GetStaticObjectFilePath(IEntity *pEntity, int slot) { if(IStatObj *pStatObj = pEntity->GetStatObj(slot)) return ToMonoString(pStatObj->GetFilePath()); else if(ICharacterInstance *pCharacter = pEntity->GetCharacter(0)) return ToMonoString(pCharacter->GetFilePath()); return ToMonoString(""); }
mono::string CScriptbind_Entity::GetAttachmentObject(IAttachment *pAttachment) { if(IAttachmentObject *pObject = pAttachment->GetIAttachmentObject()) { if(ICharacterInstance *pCharacterInstance = pObject->GetICharacterInstance()) return ToMonoString(pCharacterInstance->GetFilePath()); else if(IStatObj *pStatObj = pObject->GetIStatObj()) return ToMonoString(pStatObj->GetFilePath()); } return nullptr; }
mono::object ToMonoObject(ScriptAnyValue anyValue) { switch(anyValue.type) { case ANY_TSTRING: return (mono::object)ToMonoString(anyValue.str); case ANY_TNUMBER: return (mono::object)mono_value_box(mono_domain_get(), mono_get_single_class(), &anyValue.number); case ANY_TBOOLEAN: return (mono::object)mono_value_box(mono_domain_get(), mono_get_boolean_class(), &anyValue.b); case ANY_TVECTOR: { IMonoClass *pVec3Class = g_pScriptSystem->GetCryBraryAssembly()->GetClass("Vec3"); Vec3 vec(anyValue.vec3.x, anyValue.vec3.y, anyValue.vec3.z); return pVec3Class->BoxObject(&vec)->GetManagedObject(); } case ANY_TTABLE: return (mono::object)anyValue.table; default: break; } return nullptr; }
void CScriptbind_CrySerialize::ValueString(ISerialize *ser, mono::string name, mono::string &str, int policy) { TSerialize serialize = TSerialize(ser); if(!ser->IsReading()) serialize.Value(ToCryString(name), ToCryString(str), policy); else { string cryStr; serialize.Value(ToCryString(name), cryStr, policy); str = ToMonoString(cryStr.c_str()); } }
IMPLEMENT_RMI(CMonoActor, ClScriptRMI) { IMonoClass *pActorClass = g_pScriptSystem->GetCryBraryAssembly()->GetClass("Entity"); IMonoArray *pNetworkArgs = CreateMonoArray(3); pNetworkArgs->Insert(ToMonoString(params.methodName.c_str())); pNetworkArgs->Insert(params.pArgs); pNetworkArgs->Insert(params.targetId); pActorClass->InvokeArray(nullptr, "OnRemoteInvocation", pNetworkArgs); return true; }
IMPLEMENT_RMI(CMonoEntityExtension, SvScriptRMI) { IMonoClass *pEntityClass = g_pScriptSystem->GetCryBraryAssembly()->GetClass("Entity"); IMonoArray *pNetworkArgs = CreateMonoArray(3); pNetworkArgs->Insert(ToMonoString(params.methodName.c_str())); pNetworkArgs->InsertMonoObject(params.args); pNetworkArgs->Insert(params.targetId); pEntityClass->InvokeArray(nullptr, "OnRemoteInvocation", pNetworkArgs); pNetworkArgs->Release(); return true; }
mono::string CScriptbind_Entity::GetAttachmentName(IAttachment *pAttachment) { return ToMonoString(pAttachment->GetName()); }
mono::string CScriptbind_Entity::GetEntityLinkName(IEntityLink *pLink) { return ToMonoString(pLink->name); }
mono::string CScriptbind_Entity::GetName(IEntity *pEntity) { return ToMonoString(pEntity->GetName()); }
bool CScriptSystem::Reload() { if((!m_bFirstReload && g_pMonoCVars->mono_realtimeScripting == 0) || m_bReloading) return false; m_bReloading = true; if(!m_bFirstReload) { for each(auto listener in m_listeners) listener->OnReloadStart(); m_pScriptManager->CallMethod("Serialize"); } IMonoDomain *pScriptDomain = CreateDomain("ScriptDomain", nullptr, true); IMonoAssembly *pCryBraryAssembly = pScriptDomain->LoadAssembly(PathUtils::GetBinaryPath() + "CryBrary.dll"); IMonoArray *pCtorParams = CreateMonoArray(2); pCtorParams->InsertAny(m_bFirstReload); pCtorParams->InsertMonoString(ToMonoString(PathUtils::GetConfigPath())); IMonoObject *pScriptManager = *pCryBraryAssembly->GetClass("ScriptManager", "CryEngine.Initialization")->CreateInstance(pCtorParams); SAFE_RELEASE(pCtorParams); auto result = pScriptManager->CallMethod("Initialize", m_bFirstReload); if(result == nullptr) return false; IMonoObject *pResult = *result; auto reloadResult = pResult->Unbox<EScriptReloadResult>(); SAFE_RELEASE(pResult); switch(reloadResult) { case EScriptReloadResult_Success: { // revert previous domain if(!m_bFirstReload) m_pScriptDomain->Release(); m_pScriptDomain = pScriptDomain; m_pScriptManager = pScriptManager; m_pCryBraryAssembly = pCryBraryAssembly; CacheManagedResources(); if(!m_bFirstReload) m_pScriptManager->CallMethod("Deserialize"); // Set Network.Editor etc. IMonoClass *pClass = m_pCryBraryAssembly->GetClass("Game"); IMonoArray *pArgs = CreateMonoArray(2); pArgs->Insert(gEnv->IsEditor()); pArgs->Insert(gEnv->IsDedicated()); pClass->GetMethod("InitializeGameStatics", 2)->InvokeArray(nullptr, pArgs); SAFE_RELEASE(pArgs); m_pScriptManager->CallMethod("ProcessWaitingScripts", m_bFirstReload); for each(auto listener in m_listeners) listener->OnReloadComplete(); if(!m_bFirstReload && gEnv->IsEditor()) gEnv->pFlowSystem->ReloadAllNodeTypes(); m_bReloading = false; m_bDetectedChanges = false; return true; } break; case EScriptReloadResult_Retry: { m_bReloading = false; return Reload(); } case EScriptReloadResult_Revert: { pScriptDomain->Release(); m_pScriptDomain->SetActive(); m_bReloading = false; m_bDetectedChanges = false; return false; } break; case EScriptReloadResult_Abort: { gEnv->pSystem->Quit(); m_bReloading = false; } break; } return false; }
mono::string CFlowManager::GetPortValueString(CFlowNode *pFlowNode, int index) { return (mono::string)ToMonoString(pFlowNode->GetPortString(index)); }
mono::string CScriptbind_LevelSystem::GetDisplayName(ILevelInfo *pLevelInfo) { return ToMonoString(pLevelInfo->GetDisplayName()); }
mono::string CScriptbind_LevelSystem::GetPaks(ILevelInfo *pLevelInfo) { return ToMonoString(pLevelInfo->GetPaks()); }