Jump to content

Tchernobill

Member
  • Posts

    166
  • Joined

  • Last visited

Posts posted by Tchernobill

  1. Hi,

    It's been more than a year now.

    I'm still hyped with the NPC Narratives you described here and had planned for B43.

    I hope it is still part of your long term plans.

    :)

  2. Agreed !

    After testing with that mod, I suggest to get access from 300% (very usefull with vehicles) to 12% or 15% (will be used a lot by fashion victims).

    Could go over 300%, maybe 400% or 500% once the performances are increased with B42.

     

    it is only one line change from MultiTextureFBO2.java B41.78.16 vanilla:

       private final float[] zoomLevelsDefault = new float[]{5.0F, 4.5F, 4.0F, 3.5F, 3.0F, 2.5F, 2.25F, 2.0F, 1.75F, 1.5F, 1.25F, 1.0F, 0.75F, 0.5F, 0.4F, 0.3F, 0.2F, 0.15F, 0.12F, 0.10F};

    And then there are the tests.

  3. Mods:

    ModOptions + Autoloot + Isotermal Can of Coffee

     

    The error described below occurs when a tooltip of a range weapon or modded item is rendered while no game save is running. (the game is still in the main menu or a submenu)

     

    Range weapon Error

    Caused by: java.lang.NullPointerException: Cannot invoke "zombie.characters.IsoGameCharacter.getPerkLevel(zombie.characters.skills.PerkFactory$Perk)" because "<parameter1>" is null
        at zombie.inventory.types.HandWeapon.getMaxRange(HandWeapon.java:807)
        at zombie.inventory.types.HandWeapon.DoTooltip(HandWeapon.java:286)
        at zombie.inventory.InventoryItem.DoTooltip(InventoryItem.java:619)

     

    Modded item Error

    Caused by: java.lang.NullPointerException: Cannot invoke "zombie.world.DictionaryData.getItemInfoFromID(short)" because "zombie.world.WorldDictionary.data" is null
        at zombie.world.WorldDictionary.getItemInfoFromID(WorldDictionary.java:268)
        at zombie.inventory.InventoryItem.DoTooltip(InventoryItem.java:727)

     

    Notes:

    Autoloot mod is creating items from menu / options / mods Autoloot / Change Configuration context.

    when the cursor is on the isothermal can of coffee, error spawns

    when the cursor is on the D-E Pistol, error spawns

     

    I know this cannot be a priority ;)

  4. You can get the Field instances and use their methods in debug mode.

    You can get the Field instances but not use their methods in non-debug mode.

     

    In order to make it work out of debug mode, you can use (at your own risks) the string casts of those Field instances.

    If you go this road, I strongly suggest to do this parsing only once per fieldName, on first request or during init.

     

    local Verbose = true
    function getField(class, fieldName)
        local i = 0
        while true do --TODO for loop with getNumClassFields(Object var0)
            local field = getClassField(class,i)
            if not field then
                if Verbose then print ("param "..i.." "..tostring("no field")); end
                return nil
            end
            
            --private field is not accessible out of debug mod and any access to it (even modifiers reading wil crash)
            --that's why I use the dirty string analysis below.
            local stringField = tostring(field)
            local isPrivate = string.sub(stringField,1,string.len("private"))=="private"
            local isProtected = string.sub(stringField,1,string.len("protected"))=="protected"
            local isRightName = fieldName == "" or stringField:sub(-#fieldName) == fieldName
            
            if not isPrivate and not isProtected then
                if ShoesSpeed.Verbose then print ("param "..i.." is public."); end
                if isRightName then
                    return field
                end
                --if we reach here, it was not the right field (but public)
            else
                --if we reach here, it was not the right field (and private or protected)
                if Verbose then print ("param "..i.." is private or protected."); end
            end
            
            i = i + 1
        end
        return nil
    end

     

  5. 	• 41.78.7
    	• SinglePlayer (solo).
    	• No mod.
    	• Still occurs on new save
    	• Reproduction steps:
             1. Start game in debug mode.
             2. Add weapons and weapon parts from debug Item list.
             3. right click on weapons and weapons part => there is no upgrade option

    There is no button to upgrade a M9 Pistol with Iron sight. See attached pictures.

    It occures with all range weapons and all weapon parts.

    Did I miss an update on this topic ?

    Bug_UpgradeWeapon_1.png

    Bug_UpgradeWeapon_2.png

  6. Using Tiled from Project Zomboid Modding Tool, I am not able to create a pack from pictures (not tiles)

    I choose a directory with my png's and untick as those are not tiles but it creates no pack.

     

    Using, Project Zomboid Pack Manager, I do not know how to edit the pictures in a pack (I only changed the picture names with an hexa editor, but I want to change sizes and picture numbers)

    using Soulficher Farming Time pack as an exemple.

    So how should I edit the meta data ?

     

    Regards,

     

     

  7. It works better with isoToScreenX and y functions

    function MyLuaUIElementClass:renderIsoCircle(playerNum, posX, posY, posZ, ray, r, g, b, a)
        local angularStep = 0.3490658503988659D;
    
        for var11 = 0, 6.283185307179586D, angularStep do--from 0 to 2 PI
            local xStart = posX + ray * Math.cos(var11);
            local yStart = posY + ray * Math.sin(var11);
            local xEnd   = posX + ray * Math.cos(var11 + angularStep);
            local yEnd   = posY + ray * Math.sin(var11 + angularStep);
            local xScreen1  = isoToScreenX(playerNum, xStart, yStart, posZ);
            local yScreen1  = isoToScreenY(playerNum, xStart, yStart, posZ);
            local xScreen2  = isoToScreenX(playerNum, xEnd  , yEnd  , posZ);
            local yScreen2  = isoToScreenY(playerNum, xEnd  , yEnd  , posZ);
            --LineDrawer.drawLine(xScreen1, yScreen1, xScreen2, yScreen2, r, g, b, a, var8);
            self:drawLine2( xScreen1, yScreen1, xScreen2, yScreen2, a, r, g, b)
        end
    end

     

  8.  

    Multiplayer dedicated server.

    A mod writes a new table and inner values to the moddata of the BaseVehicle (client side).

    Then it calls transmitModData() on that same BaseVehicle.

    The ModData values set remain on the client side.

    The client disconnect then join again.

     

    Current:

    The ModData values set previously are not available on the client side of the BaseVehicle.

     

    Expected:

    The ModData values set previously remain available on the client side of the BaseVehicle.

     

    Notes:

    The equivalent code is working as expected for the furniture objets.

    (*) I expect transmitModData() to send a non-destructive update of the vehicle moddata tables.

  9. There is no problem without mod as all vanilla moodles descriptions have one line of title and one of description. (yet, as far as I know).

    The problem occures with the Clear description for Moodles mod.

     

    The fact the shape always takes only one line of title and one line of description is done by vanilla MoodlesUI.java in render() method

                   if (this.MouseOver && var2 == this.MouseOverSlot) {
                      String var15 = this.UseCharacter.getMoodles().getMoodleDisplayString(var3);
                      String var16 = this.UseCharacter.getMoodles().getMoodleDescriptionString(var3);
                      var9 = TextManager.instance.font.getWidth(var15);
                      var10 = TextManager.instance.font.getWidth(var16);
                      int var11 = Math.max(var9, var10);
                      int var12 = TextManager.instance.font.getLineHeight();
                      int var13 = (int)this.MoodleSlotsPos[var3] + 1;
                      int var14 = (2 + var12) * 2;
                      this.DrawTextureScaledColor((Texture)null, -10.0D - (double)var11 - 6.0D, (double)var13 - 2.0D, (double)var11 + 12.0D, (double)var14, 0.0D, 0.0D, 0.0D, 0.6D);
                      this.DrawTextRight(var15, -10.0D, (double)var13, 1.0D, 1.0D, 1.0D, 1.0D);
                      this.DrawTextRight(var16, -10.0D, (double)(var13 + var12), 0.800000011920929D, 0.800000011920929D, 0.800000011920929D, 1.0D);
                   }
    

     

    Modders could compensate by adding the missing part from lua code but I prefer to ask TIS to make it more generic.

    instead of

    int var12 = TextManager.instance.font.getLineHeight();


    it could use something like

    int var12 = TextManager.instance.font.getHeight(var15);

     

    instead of

    int var14 = (2 + var12) * 2;


    it could use something like

    int var14 = var12+TextManager.instance.font.getHeight(var16)+4;

     

  10. You probably already can do that:

    hook ISReadABook:perform()

    use self.character:getAlreadyReadBook() array and self.item:getFullType()

    At worse, make a static table of all Maps item to link maps items and the fact a zone is known.

    But we can probably identify them from category / display category or some Java types or whatever.

  11. --xpUpdate.everyTenMinutes = function() extract from XpUpdate.lua B41.73
    modData.strengthUpTimer = modData.strengthUpTimer + 10;
    -- if we've been lazy for too long, we start losing xp, every 1200 tick we lose 1 xp
    if modData.strengthUpTimer > 20000 and modData.strengthMod ~= math.floor(modData.strengthUpTimer / 1200) then
    	--[..] decrease strength xp
    end
    if modData.strengthUpTimer > 31000 then -- it's caped to a 30000 timer, so if you've been lazy for a lot of days, it's not so long to get in shape again
        modData.strengthUpTimer = 0;
    end

    The comment does not match the code.

    Current: xp decays after ~14 days without xp earned until ~22 days then it will not decrease for ~14 days.

     

     

    I guess the code is incorrect and it should be a timer saturation instead of a timer reset.
    Proposed modification:

    --xpUpdate.everyTenMinutes = function() proposed modification in XpUpdate.lua
    modData.strengthUpTimer = modData.strengthUpTimer + 10;
    -- if we've been lazy for too long, we start losing xp, every 1200 tick we lose 1 xp
    if modData.strengthUpTimer > 20000 and modData.strengthMod ~= math.floor(modData.strengthUpTimer / 1200) then
    	--[..] decrease strength xp
    end
    if modData.strengthUpTimer > 31000 then -- it's caped to a 31000 timer, so if you've been lazy for a lot of days, it's not so long to get in shape again
        modData.strengthUpTimer = 31000;
    end

    Proposition: xp decays after ~14 days without xp earned.

     

     

    Notes:

    I set aside the fact that with every xp earned the timer increases by 2 days as it seems not relevant to the reset / saturation choice.

    I set aside the strengthMod escape every 20 hours as it seems not relevant to the reset / saturation choice.

  12. On Dr Client side: (lua/client)

    sendClientCommand("DrHide", "vaccinePlayer", _data);
    -- _data should include the onlineID of the target player. This allows you to identify him on server side

     

     

    On Server side: (lua/server)

    DrHideServer = {}
    
    DrHideServer.OnClientCommand = function(_module, _command, _player, _packet)--not that _player is the source player. i.e. the Dr.
        if _module ~= "DrHide" then return; end;--the message is not for you. it's ok
        if (_command ~= "vaccinePlayer") or (not _packet) then return end; --bug maybe log this too
        
        --TODO interpret _packet
        -- it should include the onlineID of the target player. This allows you to identify him on server side
        --in your case there are two possibilities:
        -- 1/ modify the target player mod data (getModData().DrHideMD) and update them (with ModData.transmit("DrHideMD"))
        -- 2/ sendServerCommand to the target player
    end
    
    Events.OnClientCommand.Add(DrHideServer.OnClientCommand);

     

    On Vaccine target Client side: (lua/client)

    --if you used moddata update from server:
    local function OnReceiveGlobalModData(_module, _packet)
    	if _module ~= "DrHideMD" then return; end;
    		ModData.add(_module, _packet);
            --now you can use the updated moddata
    	end;
    end
    
    Events.OnReceiveGlobalModData.Add(OnReceiveGlobalModData)

     

    This is how Donkaike made it in Prisonner mod.

     

    I guess you could use OnServerCommand in case 2 (using sendServerCommand on server side).

     

  13. I see how the java code is computing the player CombatSpeed variable.

    I see that this variable is an input of animations as described in some xml files (e.g. 1HDefault.xml)

     

    Can someone (TIS?) explain me how to predict the resulting time between the start of the animation and the next moment the player can attack again (supposedly the time of the animation) ?

    Can I use blindly the hit animation time as displayed in the ingame debug / dev / animation viewer ?

    Should I use those times and add some transition delays ?

     

    Please, help.

     

×
×
  • Create New...