EMI INDO's Recent Forum Activity

  • Update AdMob Plus PRO

    construct.net/en/game-assets/addons/admob-plus-pro-768

    1. New action: Consent Show privacy options form
    2. Fix bug: Adaptive banner ad
    3. New example AdMobPro-full-2025.c3p
    4. ACE display text tidied up
    5. New plugin property Is Debug log: boolean
    6. New plugin icons https://iconduck.com/icons/26996/admob
    7. New video:

      youtube.com/watch

  • I will not create a new problem, it will be considered a duplicate problem.

    I have been using Monaco Editor for a long time in the tool I created earlier, and I also have a C3 Monaco Editor plugin.

    So, I know the necessary improvements or new suggestions that should be added.

    Monaco Editor is indeed more powerful than CodeMirror.

    CodeMirror is lightweight but lacks complete features.

    Meanwhile, Monaco Editor is quite heavy, but its features justify the performance cost.

    Here are some additional feature suggestions:

    reference code snippet from my plugin or from my tool.

    suggest-widget reference code

    function setSuggestionItemAlignment(sizeCompletion) {
     const style = document.createElement('style');
     style.innerHTML = `
     .monaco-editor .suggest-widget .monaco-list-row {
     width: ${rowWidth}px !important;
     min-width: ${rowWidth}px !important;
     max-width: ${rowWidth}px !important;
     border-radius: 4px !important;
     transition: background-color 0.2s ease-in-out;
     }
     .monaco-editor .suggest-widget .monaco-list-row:hover {
     background-color: #171515 !important;
     }
     .monaco-editor .suggest-widget .monaco-list-row.selected {
     background-color: #171515 !important;
     }
     .monaco-editor .suggest-widget .monaco-list-row .monaco-icon-label-container {
     text-align: left !important;
     font-size: ${sizeCompletion}px !important;
     margin: 0 !important;
     left: ${paddingLeft}px !important; 
     }
     
     .monaco-editor .suggest-widget .monaco-icon-label {
     flex: 1 !important;
     display: block !important;
     text-align: left !important;
     align-items: flex-start !important;
     }
     `;
     
     document.head.appendChild(style);
     }
    
    

    suggest-widget reference css

    /* Main container for the suggest widget */
    .monaco-editor .suggest-widget {
     background-color: #1e1e1e !important; /* Main background color */
     border: 1px solid #3c3c3c !important; /* Widget border */
     color: #ffffff !important; /* Default text color */
     font-size: 14px !important; /* Overall font size */
     font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif !important;
    }
    
    /* List of items within the suggest widget */
    .monaco-editor .suggest-widget .monaco-list {
     background-color: #252526 !important; /* List background color */
     font-size: 14px !important; /* Font size for items */
    }
    
    /* Each row/item in the list */
    .monaco-editor .suggest-widget .monaco-list .monaco-list-row {
     padding: 6px 12px !important; /* Padding around each item */
     border-bottom: 1px solid #3c3c3c !important; /* Separator line between items */
    }
    
    /* Appearance on item hover */
    .monaco-editor .suggest-widget .monaco-list .monaco-list-row:hover {
     background-color: #007acc !important; /* Background color on hover */
    }
    
    /* Style for highlighted text within an item */
    .monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-highlighted-label {
     color: #ffcc00 !important; /* Highlighted text color */
     font-size: 14px !important; /* Font size for highlighted label */
    }
    
    /* If there is a scrollbar within the widget (optional) */
    .monaco-editor .suggest-widget .scrollable-element {
     scrollbar-color: #007acc #252526 !important; /* Color for scrollbar thumb and track */
    }
    
    /* Style for the currently selected item */
    .monaco-editor .suggest-widget .monaco-list .monaco-list-row.selected {
     background-color: #005f9e !important; /* Background color for the selected item */
    }
    
    

    Add new existing api scripting including new api in future releases

    construct.net/en/make-games/scripting-updates-8

    function registerCustomSuggestions() {
    
     if (langSet) {
     // Adding custom suggestions
     monaco.languages.registerCompletionItemProvider(langSet, {
     provideCompletionItems: function (model, position) {
     var suggestions = [
     {
     label: 'this._info.SetDOMSideScripts',
     kind: monaco.languages.CompletionItemKind.Function,
     insertText: 'this._info.SetDOMSideScripts(["c3runtime/domSide.js"]);',
     detail: 'Using a DOM script'
     },
     {
     label: 'this._info.AddC3RuntimeScript',
     kind: monaco.languages.CompletionItemKind.Function,
     insertText: 'this._info.AddC3RuntimeScript("c3runtime/bundle.js");',
     detail: 'Adding a module script'
     },
     {
     label: 'this._info.AddRemoteScriptDependency',
     kind: monaco.languages.CompletionItemKind.Function,
     insertText: 'this._info.AddRemoteScriptDependency("https://example.com/api-module.js", "module");',
     detail: 'Load remote module script || Load remote "classic" script'
     },
     {
     label: 'this._info.AddCordovaResourceFile',
     kind: monaco.languages.CompletionItemKind.Function,
     insertText: 'this._info.AddCordovaResourceFile({ src: "myfile.txt" });',
     detail: 'Cordova resource file dependencies'
     },
     {
     label: 'this._info.AddCordovaPluginReference',
     kind: monaco.languages.CompletionItemKind.Function,
     insertText: 'this._info.AddCordovaPluginReference({id: "cordova-plugin-inappbrowser"});',
     detail: 'Cordova plugin dependencies'
     },
     {
     label: 'this._info.AddFileDependency',
     kind: monaco.languages.CompletionItemKind.Function,
     insertText: 'this._info.AddFileDependency({ filename: "mydependency.js", type: "external-dom-script" });',
     detail: 'File dependencies'
     },
     {
     label: 'this._info.SetRuntimeModuleMainScript',
     kind: monaco.languages.CompletionItemKind.Function,
     insertText: 'this._info.SetRuntimeModuleMainScript("c3runtime/main.js");',
     detail: 'Configuring use of modules'
     },
     {
     label: 'this._info.SetTypeScriptDefinitionFiles',
     kind: monaco.languages.CompletionItemKind.Function,
     insertText: 'this._info.SetTypeScriptDefinitionFiles(["c3runtime/ISpriteInstance.d.ts"]);',
     detail: 'SetTypeScriptDefinitionFiles(arr)'
     },
    
    
    
    
    ...........
    .........
    ........ other
    
    
     ];
     return { suggestions: suggestions };
     }
     });
    
     }
    }
    
    
    
    
    
  • Try Construct 3

    Develop games in your browser. Powerful, performant & highly capable.

    Try Now Construct 3 users don't see these ads
  • Manual Porting Plugin

    1. editorTextPlugin
    2. drawingPlugin

    Update editorTextPlugin to addon SDK v2

    📁 filePath: 'a/plugin-sdk/v2/editorTextPlugin/addon.json'
    ❌ SDK v1: "sdk-version": 1, ➝ ✅ SDK v2: "sdk-version": 2,
    
    📁 filePath: 'a/plugin-sdk/v2/editorTextPlugin/c3runtime/actions.js'
    ❌ SDK v1: const C3 = self.C3; ➝ ✅ SDK v2: const C3 = globalThis.C3;
    
    📁 filePath: 'a/plugin-sdk/v2/editorTextPlugin/c3runtime/conditions.js'
    ❌ SDK v1: const C3 = self.C3; ➝ ✅ SDK v2: const C3 = globalThis.C3;
    
    📁 filePath: 'a/plugin-sdk/v2/editorTextPlugin/c3runtime/expressions.js'
    ❌ SDK v1: const C3 = self.C3; ➝ ✅ SDK v2: const C3 = globalThis.C3;
    
    📁 filePath: 'a/plugin-sdk/v2/editorTextPlugin/c3runtime/instance.js'
    ❌ SDK v1: const C3 = self.C3; ➝ ✅ SDK v2: const C3 = globalThis.C3;
    ❌ SDK v1: C3.Plugins.MyCompany_TextPlugin.Instance = class MyTextInstance extends C3.SDKWorldInstanceBase ➝ ✅ SDK v2: C3.Plugins.MyCompany_TextPlugin.Instance = class MyTextInstance extends globalThis.ISDKWorldInstanceBase
    ❌ SDK v1: constructor(inst, properties) ➝ ✅ SDK v2: constructor()
    ❌ SDK v1: super(inst); ➝ ✅ SDK v2: super();
    ✅ New SDK v2: const properties = this._getInitProperties();
    ❌ SDK v1: Release() ➝ ✅ SDK v2: _release()
    ❌ SDK v1: super.Release(); ➝ ✅ SDK v2: super._release();
    ❌ SDK v1: _MaybeCreateRendererText(renderer) ➝ ✅ SDK v2: _maybeCreateRendererText(renderer)
    ❌ SDK v1: this._rendererText.SetIsAsync(false); ➝ ✅ SDK v2: this._rendererText = renderer.createRendererText();
    ✅ New SDK v2: this._rendererText.sizePt = 12;
    ❌ SDK v1: Draw(renderer) ➝ ✅ SDK v2: _draw(renderer)
    ✅ New SDK v2: this._maybeCreateRendererText(renderer);
    ✅ New SDK v2: 
    ✅ New SDK v2: const layer = this.layer;
    ✅ New SDK v2: const textZoom = layer.renderScale;
    ✅ New SDK v2: this._rendererText.setSize(this.width, this.height, textZoom);
    ✅ New SDK v2: 
    ✅ New SDK v2: this._rendererText.fontFace = this._font;
    ✅ New SDK v2: this._rendererText.text = this._text;
    ✅ New SDK v2: 
    ✅ New SDK v2: let quad = this.getBoundingQuad();
    ✅ New SDK v2: const texture = this._rendererText.getTexture();
    ✅ New SDK v2: 
    ✅ New SDK v2: 
    ❌ SDK v1: if (wi.GetAngle() === 0 && wi.GetLayer().GetAngle() === 0) ➝ ✅ SDK v2: if (this.angle === 0 && layer.angle === 0)
    ❌ SDK v1: tempQuad.setFromRect(tempRect); ➝ ✅ SDK v2: const [dl, dt] = layer.layerToDrawSurface(quad.p1.x, quad.p1.y);
    ✅ New SDK v2: const [dr, db] = layer.layerToDrawSurface(quad.p3.x, quad.p3.y);
    ✅ New SDK v2: const ox = Math.round(dl) - dl;
    ✅ New SDK v2: const oy = Math.round(dt) - dt;
    ✅ New SDK v2: quad = new DOMQuad(new DOMPoint(dl + ox, dt + oy),
    ✅ New SDK v2: new DOMPoint(dr + ox, dt + oy),
    ✅ New SDK v2: new DOMPoint(dr + ox, db + oy),
    ✅ New SDK v2: new DOMPoint(dl + ox, db + oy));
    ❌ SDK v1: this._runtime.GetCanvasManager().SetDeviceTransform(renderer); ➝ ✅ SDK v2: renderer.setDeviceTransform();
    ❌ SDK v1: renderer.Quad3(tempQuad, this._rendererText.GetTexRect()); ➝ ✅ SDK v2: renderer.setTexture(texture);
    ✅ New SDK v2: renderer.quad3(quad, this._rendererText.getTexRect());
    ❌ SDK v1: layer._SetTransform(renderer); ➝ ✅ SDK v2: renderer.setLayerTransform(layer);
    ❌ SDK v1: let offY = 0; ➝ ✅ SDK v2: let ox = 0;
    ✅ New SDK v2: let oy = 0;
    ❌ SDK v1: if (this._runtime.IsPixelRoundingEnabled()) ➝ ✅ SDK v2: if (this.runtime.isPixelRoundingEnabled)
    ❌ SDK v1: quad = tempQuad; ➝ ✅ SDK v2: ox = Math.round(quad.p1.x) - quad.p1.x;
    ✅ New SDK v2: oy = Math.round(quad.p1.y) - quad.p1.y;
    ✅ New SDK v2: 
    ✅ New SDK v2: if (ox !== 0 || oy !== 0)
    ✅ New SDK v2: {
    ✅ New SDK v2: quad = new DOMQuad(new DOMPoint(quad.p1.x + ox, quad.p1.y + oy),
    ✅ New SDK v2: new DOMPoint(quad.p2.x + ox, quad.p2.y + oy),
    ✅ New SDK v2: new DOMPoint(quad.p3.x + ox, quad.p3.y + oy),
    ✅ New SDK v2: new DOMPoint(quad.p4.x + ox, quad.p4.y + oy));
    ✅ New SDK v2: }
    ❌ SDK v1: renderer.Quad3(quad, this._rendererText.GetTexRect()); ➝ ✅ SDK v2: renderer.setTexture(texture);
    ✅ New SDK v2: renderer.quad3(quad, this._rendererText.getTexRect());
    ❌ SDK v1: SaveToJson() ➝ ✅ SDK v2: _saveToJson()
    ❌ SDK v1: LoadFromJson(o) ➝ ✅ SDK v2: _loadFromJson(o)
    ❌ SDK v1: _SetText(text) ➝ ✅ SDK v2: _setText(text)
    ❌ SDK v1: _GetText() ➝ ✅ SDK v2: _getText()
    
    📁 filePath: 'a/plugin-sdk/v2/editorTextPlugin/c3runtime/plugin.js'
    ❌ SDK v1: const C3 = self.C3; ➝ ✅ SDK v2: const C3 = globalThis.C3;
    ❌ SDK v1: C3.Plugins.MyCompany_TextPlugin = class MyTextPlugin extends C3.SDKPluginBase ➝ ✅ SDK v2: C3.Plugins.MyCompany_TextPlugin = class MyTextPlugin extends globalThis.ISDKPluginBase
    ❌ SDK v1: constructor(opts) ➝ ✅ SDK v2: constructor()
    ❌ SDK v1: super.Release(); ➝ ✅ SDK v2: super();
    
    📁 filePath: 'a/plugin-sdk/v2/editorTextPlugin/c3runtime/type.js'
    ❌ SDK v1: const C3 = self.C3; ➝ ✅ SDK v2: const C3 = globalThis.C3;
    ❌ SDK v1: C3.Plugins.MyCompany_TextPlugin.Type = class MyTextType extends C3.SDKTypeBase ➝ ✅ SDK v2: C3.Plugins.MyCompany_TextPlugin.Type = class MyTextType extends globalThis.ISDKObjectTypeBase
    ❌ SDK v1: constructor(objectClass) ➝ ✅ SDK v2: constructor()
    ❌ SDK v1: super(objectClass); ➝ ✅ SDK v2: super();
    ❌ SDK v1: OnCreate() ➝ ✅ SDK v2: _onCreate()
    
    📁 filePath: 'a/plugin-sdk/v2/editorTextPlugin/instance.js'
    ❌ SDK v1: const SDK = self.SDK; ➝ ✅ SDK v2: const SDK = globalThis.SDK;
    
    📁 filePath: 'a/plugin-sdk/v2/editorTextPlugin/plugin.js'
    ❌ SDK v1: const SDK = self.SDK; ➝ ✅ SDK v2: const SDK = globalThis.SDK;
    ❌ SDK v1: this._info.SetVersion(PLUGIN_VERSION); ➝ ✅ SDK v2: this._info.SetName(globalThis.lang(".name"));
    ✅ New SDK v2: this._info.SetDescription(globalThis.lang(".description"));
    ❌ SDK v1: this._info.SetHelpUrl(self.lang(".help-url")); ➝ ✅ SDK v2: this._info.SetHelpUrl(globalThis.lang(".help-url"));
    
    📁 filePath: 'a/plugin-sdk/v2/editorTextPlugin/type.js'
    ❌ SDK v1: const SDK = self.SDK; ➝ ✅ SDK v2: const SDK = globalThis.SDK;
    
    📁 filePath: 'a/plugin-sdk/v2/drawingPlugin/addon.json'
    ❌ SDK v1: "sdk-version": 1, ➝ ✅ SDK v2: "sdk-version": 2,
    
    📁 filePath: 'a/plugin-sdk/v2/drawingPlugin/c3runtime/actions.js'
    ❌ SDK v1: const C3 = self.C3; ➝ ✅ SDK v2: const C3 = globalThis.C3;
    ❌ SDK v1: alert("Test property = " + this._GetTestProperty()); ➝ ✅ SDK v2: alert("Test property = " + this._getTestProperty());
    
    📁 filePath: 'a/plugin-sdk/v2/drawingPlugin/c3runtime/conditions.js'
    ❌ SDK v1: const C3 = self.C3; ➝ ✅ SDK v2: const C3 = globalThis.C3;
    
    📁 filePath: 'a/plugin-sdk/v2/drawingPlugin/c3runtime/expressions.js'
    ❌ SDK v1: const C3 = self.C3; ➝ ✅ SDK v2: const C3 = globalThis.C3;
    
    📁 filePath: 'a/plugin-sdk/v2/drawingPlugin/c3runtime/instance.js'
    ❌ SDK v1: const C3 = self.C3; ➝ ✅ SDK v2: const C3 = globalThis.C3;
    ❌ SDK v1: C3.Plugins.MyCompany_DrawingPlugin.Instance = class DrawingInstance extends C3.SDKWorldInstanceBase ➝ ✅ SDK v2: C3.Plugins.MyCompany_DrawingPlugin.Instance = class DrawingInstance extends globalThis.ISDKWorldInstanceBase
    ❌ SDK v1: constructor(inst, properties) ➝ ✅ SDK v2: constructor()
    ❌ SDK v1: super(inst); ➝ ✅ SDK v2: super();
    ✅ New SDK v2: const properties = this._getInitProperties();
    ❌ SDK v1: Release() ➝ ✅ SDK v2: _release()
    ❌ SDK v1: super.Release(); ➝ ✅ SDK v2: super._release();
    ❌ SDK v1: Draw(renderer) ➝ ✅ SDK v2: _draw(renderer)
    ❌ SDK v1: const texture = imageInfo.GetTexture(); ➝ ✅ SDK v2: const imageInfo = this.objectType.getImageInfo();
    ✅ New SDK v2: const texture = imageInfo.getTexture(renderer);
    ❌ SDK v1: renderer.SetTexture(texture); ➝ ✅ SDK v2: let quad = this.getBoundingQuad();
    ✅ New SDK v2: const rcTex = imageInfo.getTexRect();
    ❌ SDK v1: else ➝ ✅ SDK v2: renderer.setTexture(texture);
    ✅ New SDK v2: 
    ✅ New SDK v2: if (this.runtime.isPixelRoundingEnabled)
    ❌ SDK v1: renderer.Quad3(quad, rcTex); ➝ ✅ SDK v2: const ox = Math.round(this.x) - this.x;
    ✅ New SDK v2: const oy = Math.round(this.y) - this.y;
    ✅ New SDK v2: 
    ✅ New SDK v2: if (ox !== 0 && oy !== 0)
    ✅ New SDK v2: {
    ✅ New SDK v2: quad = new DOMQuad(new DOMPoint(quad.p1.x + ox, quad.p1.y + oy),
    ✅ New SDK v2: new DOMPoint(quad.p2.x + ox, quad.p2.y + oy),
    ✅ New SDK v2: new DOMPoint(quad.p3.x + ox, quad.p3.y + oy),
    ✅ New SDK v2: new DOMPoint(quad.p4.x + ox, quad.p4.y + oy));
    ✅ New SDK v2: }
    ✅ New SDK v2: 
    ✅ New SDK v2: renderer.quad3(quad, rcTex);
    ❌ SDK v1: SaveToJson() ➝ ✅ SDK v2: _saveToJson()
    ❌ SDK v1: LoadFromJson(o) ➝ ✅ SDK v2: _loadFromJson(o)
    ❌ SDK v1: _SetTestProperty(n) ➝ ✅ SDK v2: _setTestProperty(n)
    ❌ SDK v1: _GetTestProperty() ➝ ✅ SDK v2: _getTestProperty()
    
    📁 filePath: 'a/plugin-sdk/v2/drawingPlugin/c3runtime/plugin.js'
    ❌ SDK v1: const C3 = self.C3; ➝ ✅ SDK v2: const C3 = globalThis.C3;
    ❌ SDK v1: C3.Plugins.MyCompany_DrawingPlugin = class DrawingPlugin extends C3.SDKPluginBase ➝ ✅ SDK v2: C3.Plugins.MyCompany_DrawingPlugin = class DrawingPlugin extends globalThis.ISDKPluginBase
    ❌ SDK v1: constructor(opts) ➝ ✅ SDK v2: constructor()
    ❌ SDK v1: super.Release(); ➝ ✅ SDK v2: super();
    
    📁 filePath: 'a/plugin-sdk/v2/drawingPlugin/c3runtime/type.js'
    ❌ SDK v1: const C3 = self.C3; ➝ ✅ SDK v2: const C3 = globalThis.C3;
    ❌ SDK v1: C3.Plugins.MyCompany_DrawingPlugin.Type = class DrawingType extends C3.SDKTypeBase ➝ ✅ SDK v2: C3.Plugins.MyCompany_DrawingPlugin.Type = class DrawingType extends globalThis.ISDKObjectTypeBase
    ❌ SDK v1: constructor(objectClass) ➝ ✅ SDK v2: constructor()
    ❌ SDK v1: super(objectClass); ➝ ✅ SDK v2: super();
    ❌ SDK v1: Release() ➝ ✅ SDK v2: _onCreate()
    ❌ SDK v1: this.GetImageInfo().LoadAsset(this._runtime); ➝ ✅ SDK v2: this.runtime.assets.loadImageAsset(this.getImageInfo());
    ❌ SDK v1: LoadTextures(renderer) ➝ ✅ SDK v2: _loadTextures(renderer)
    ❌ SDK v1: sampling: this._runtime.GetSampling() ➝ ✅ SDK v2: return renderer.loadTextureForImageInfo(this.getImageInfo(), {
    ✅ New SDK v2: sampling: this.runtime.sampling
    ❌ SDK v1: ReleaseTextures() ➝ ✅ SDK v2: _releaseTextures(renderer)
    ❌ SDK v1: this.GetImageInfo().ReleaseTexture(); ➝ ✅ SDK v2: renderer.releaseTextureForImageInfo(this.getImageInfo());
    
    📁 filePath: 'a/plugin-sdk/v2/drawingPlugin/instance.js'
    ❌ SDK v1: const SDK = self.SDK; ➝ ✅ SDK v2: const SDK = globalThis.SDK;
    
    📁 filePath: 'a/plugin-sdk/v2/drawingPlugin/plugin.js'
    ❌ SDK v1: const SDK = self.SDK; ➝ ✅ SDK v2: const SDK = globalThis.SDK;
    ❌ SDK v1: this._info.SetVersion(PLUGIN_VERSION); ➝ ✅ SDK v2: this._info.SetName(globalThis.lang(".name"));
    ✅ New SDK v2: this._info.SetDescription(globalThis.lang(".description"));
    ❌ SDK v1: this._info.SetHelpUrl(self.lang(".help-url")); ➝ ✅ SDK v2: this._info.SetHelpUrl(globalThis.lang(".help-url"));
    
    📁 filePath: 'a/plugin-sdk/v2/drawingPlugin/type.js'
    ❌ SDK v1: const SDK = self.SDK; ➝ ✅ SDK v2: const SDK = globalThis.SDK;
    
    
    
    
  • I mean screenshot of doqqs initial post

    Not untrue, but not quite right.

    On Start of layout: create banner > show false

    in the same aciton block: banner show

    It's better if show false

    Condition on banner load: banner show

    or On Start of layout: create banner > show true

    On Start of layout:

    |_triger once: create banner > show true

  • Are you using my plugin AdmobPro, if there is a problem contact me, and as you can see from the screenshot the logic is not correct.

    cordova.c3addonwmz@gmail.com

  • construct.net/en/game-assets/addons/firebase-web-gt-mobile-gt-1881

    ALL-Firebase-v1.0.0.3

    Fix bug: Auth action > SignIn User With Email And Password.

    New fiture: Firestore leaderboard

    New leaderboard_c3p

    Update: firebase modules v11.3.1

  • Add browser plugins.

    I suggest you add a lot of logs in each action and candition, you will see where the logs are disconnected.

    If you can't find it add as much as possible,

    Example logs 1 to 50, you will see

    1

    2

    3

    4

    23

    24

    25

    disconnected from log 4 you have to check.

EMI INDO's avatar

EMI INDO

Member since 22 Sep, 2019

Twitter
EMI INDO has 30 followers

Trophy Case

  • 5-Year Club
  • Regular Visitor Visited Construct.net 7 days in a row
  • RTFM Read the fabulous manual
  • Email Verified

Progress

8/44
How to earn trophies