iopietro / Travianz-Legacy

Join our Discord Server: https://discordapp.com/invite/9fbJKP9 | New repo: https://github.com/iopietro/Travianz
GNU General Public License v3.0
160 stars 95 forks source link

2 catapults destroy level 20 building #423

Closed martinambrus closed 6 years ago

martinambrus commented 6 years ago

You only need two catapults to take down a whole level 20 building which is plain wrong. The logic behind these calculations escapes me and Math is not my strongest point, so anyone willing to help out here is more than welcome to give us a hand :)

Here is the relevant code: https://github.com/Shadowss/TravianZ/blob/master/GameEngine/Battle.php#L545-L760

martinambrus commented 6 years ago

@Shadowss, @velhbxtyrj - guys, if you think you can solve this one, I'll be glad for the help :)

Shadowss commented 6 years ago

Hmmm i tested this long time ago and works great. Maybe some screenshots or a movie

martinambrus commented 6 years ago

There is a screenshot on our Gitter - https://files.gitter.im/TravianZ-V8/Lobby/wlXa/Captura11.PNG

I know for a fact that I've seen this bug, and others with catapults even BEFORE I started to do anything to the battle code. What I did actually fixed a bug where a catapult attack could bring a building level UP instead of DOWN, which was even worse :-D

So yeah, to me, catapults were been broken from the moment I entered this project.

Also, you can reproduce this with any tribe, not just Romans. I did this with Gauls' catapults.

Shadowss commented 6 years ago

cata

Hmm yeah , i mean i tested in 2013 and works after ronix fixed all battle system. I can confirm that bug

cata2

I think is a problem with all catapult system!

Shadowss commented 6 years ago

ram

Ram system is ok .... i already try to fix but nothing happened ....

velhbxtyrj commented 6 years ago

For such systems of calculation there is a very interesting resource. It is used by many people to perform a variety of calculations. Do not take this as spam. This is an excellent calculator for calculating everything that can only be played on different versions. Here's what should happen with the use of two catapults:

http://travian.kirilloid.ru/warsim2.php#a:p500u,,10,,,,,2Ub20#d:p300r2m3#r2uU

How many catapults are needed to destroy one level of the building: http://travian.kirilloid.ru/warsim2.php#a:p500u,,10,,,,,6Ub20#d:p300r2m3#r2uU

To destroy a building of level 20: http://travian.kirilloid.ru/warsim2.php#a:p2u,,10,,,,,53Ub20#d:p2r2m3#r2uU

To select a language, at the top click on the corresponding flag.

Shadowss commented 6 years ago

Yeah but i make some screen and you need only 2 catapults to destroy an 20 level building

velhbxtyrj commented 6 years ago

I gave an example of this so that in the correction of the code it would be possible at least that to be guided for calculations.

KoriSeng commented 6 years ago

holy shit~ that code is long omfg, wow i forgot how long it used to be

martinambrus commented 6 years ago

@velhbxtyrj thanks for those links, they would be useful if we ever get to the refactor project :-D For now, the calculations are as they are and for me, the are impenetrable, so I can't fix this one alone.

Shadowss commented 6 years ago

The problem is not from Battle.php. I roll back the server until 2013 original Battle file , that file works great. And the result is the same !

Shadowss commented 6 years ago

Who write this function or where was put initialy ? NOW IS IN AUTOMATION!

private function resolveCatapultsDestruction(&$bdo, &$battlepart, &$info_cat, &$data, $catapultTarget, $twoRowsCatapultSetup, $isSecondRow, $catp_pic, $can_destroy, $isoasis, &$village_destroyed) {
    global $database;

    // currently targeted building/field level
    $tblevel = (int) $bdo['f'.$catapultTarget];
    // currently targetet building/field GID (ID of the building/field type - woodcutter, cropland, embassy...)
    $tbgid = (int) $bdo['f'.$catapultTarget.'t'];
    // currently targeted building/field ID in the database (fdata, the fID field, e.g. f1, f2, f3...)
    $tbid = (int) $catapultTarget;

    // building/field destroyed
    if ($battlepart[4]>$battlepart[3])
    {
        // prepare data to be updated
        $fieldsToSet = ["f".$tbid];
        $fieldValuesToSet = [0];

        // update $bdo, so we don't have to reselect later
        $bdo['f'.$catapultTarget] = 0;

        if ($tbid >= 19 && $tbid != 99) {
            $fieldsToSet[] = "f".$tbid."t";
            $fieldValuesToSet[] = 0;
            $bdo['f'.$catapultTarget."t"] = 0;
        }

        // update all that needs updating
        $database->setVillageLevel($data['to'], $fieldsToSet, $fieldValuesToSet);

        $buildarray = $GLOBALS["bid".$tbgid];

        // (great) warehouse level was changed
        if ($tbgid==10 || $tbgid==38) {
            $database->setMaxStoreForVillage($data['to'], $buildarray[$tblevel]['attri']);
        }

        // (great) granary level was changed
        if ($tbgid==11 || $tbgid==39) {
            $database->setMaxCropForVillage($data['to'], $buildarray[$tblevel]['attri']);
        }

        // oasis cannot be destroyed
        $pop=$this->recountPop($data['to'], false);
        if ($isoasis == 0) {
            if($pop==0 && $can_destroy==1){
                $village_destroyed = 1;
                // this will ensure the right $info_cat text
                $tbgid = 0;
            }
        }

        if ($isSecondRow) {
            if ($tbid > 0 || ($tbid == 0 && strpos($info_cat, 'The village has') === false)) {
                $info_cat .= "<br><tbody class=\"goods\"><tr><th>Information</th><td colspan=\"11\">
                <img class=\"unit u" . $catp_pic . "\" src=\"img/x.gif\" alt=\"Catapult\" title=\"Catapult\" /> " . $this->procResType( $tbgid, $can_destroy, $isoasis ) . " destroyed.";
            }

            // embassy level was changed
            if ($tbgid==18){
                $info_cat .= $database->checkEmbassiesAfterBattle($data['to'], $bdo['f'.$catapultTarget], false);
            }

            $info_cat .= "</td></tr></tbody>";
        } else {
            $info_cat = "" . $catp_pic . ", " . $this->procResType( $tbgid, $can_destroy, $isoasis ) . " destroyed.";

            // embassy level was changed
            if ($tbgid==18){
                $info_cat .= $database->checkEmbassiesAfterBattle($data['to'], $bdo['f'.$catapultTarget], false);
            }
        }
    }
    // building/field not damaged
    elseif ($battlepart[4]==0)
    {
        if ($isSecondRow) {
            if ($tbid > 0 || ($tbid == 0 && strpos($info_cat, 'The village has') === false)) {
                $info_cat .= "<br><tbody class=\"goods\"><tr><th>Information</th><td colspan=\"11\">
                <img class=\"unit u" . $catp_pic . "\" src=\"img/x.gif\" alt=\"Catapult\" title=\"Catapult\" /> " . $this->procResType( $tbgid, $can_destroy, $isoasis ) . " was not damaged.</td></tr></tbody>";
            }
        } else {
            $info_cat = "" . $catp_pic . "," . $this->procResType( $tbgid, $can_destroy, $isoasis ) . " was not damaged.";
        }
    }
    else
    // building/field was damaged, let's calculate the actual damage
    {
        //TODO: MUST TO BE FIX This part goes also below 0 if u have a lot of catapults
        // TODO: this whole math seems incorrect, it needs a revision, and potentially a rewrite
        $totallvl = round( sqrt( pow( ( $tblevel + 0.5 ), 2 ) - ( ( !$twoRowsCatapultSetup ? (int) $battlepart[4] : (int) $battlepart[4] / 2 ) * 8 ) ) );

        // sometimes this goes above the actual level, so in that case we just reverse everything
        // and take the buiding down so many levels
        if ($totallvl > $tblevel) {
            $totallvl = $tblevel - ($totallvl - $tblevel);
        }

        // don't allow this to go below 0
        if ($totallvl < 0) {
            $totallvl = 0;
        }

        // no damage to the building/field
        if ( $tblevel == $totallvl ) {
            $info_cata = " was not damaged.";
        } else // building/field damaged, damage calculations to follow
        {
            // update $bdo, so we don't have to reselect later
            $bdo[ 'f' . $catapultTarget ] = $totallvl;

            if ($tblevel == 1 && $totallvl == 0) {
                // building was actually destroyed - recalculate population and remove village itself, if needed
                $info_cata = " destroyed.";
            } else {
                // building was damaged to a lower level
                $info_cata = " damaged from level <b>" . $tblevel . "</b> to level <b>" . $totallvl . "</b>.";
            }

            $buildarray = $GLOBALS[ "bid" . $tbgid ];

            // (great) warehouse level was changed
            if ( $tbgid == 10 || $tbgid == 38 ) {
                $database->setMaxStoreForVillage( $data['to'], $buildarray[ $tblevel ]['attri'] );
            }

            // (great) granary level was changed
            if ( $tbgid == 11 || $tbgid == 39 ) {
                $database->setMaxCropForVillage( $data['to'], $buildarray[ $tblevel ]['attri'] );
            }
        }

        $fieldsToSet = ["f" . $tbid];
        $fieldValuesToSet = [$totallvl];

        if ($totallvl == 0) {
            $fieldsToSet[] = "f" . $tbid . "t";
            $fieldValuesToSet[] = 0;
            $bdo['f'.$catapultTarget."t"] = 0;
        }

        $database->setVillageLevel( $data['to'], $fieldsToSet, $fieldValuesToSet );

        // recalculate population and check if the village shouldn't be destroyed at this point
        $pop = $this->recountPop( $data['to'], false );
        if ($isoasis == 0) {
            if($pop==0 && $can_destroy==1){
                $village_destroyed = 1;
                // this will ensure the right $info_cat text
                $tbgid = 0;
            }
        }

        if ($isSecondRow) {
            $info_cat .= "<br><tbody class=\"goods\"><tr><th>Information</th><td colspan=\"11\">
                <img class=\"unit u".$catp_pic."\" src=\"img/x.gif\" alt=\"Catapult\" title=\"Catapult\" /> ".$this->procResType($tbgid,$can_destroy,$isoasis).$info_cata;

            // embassy level was changed
            if ( $tbgid == 18 ) {
                $info_cat .= $database->checkEmbassiesAfterBattle( $data['to'], $bdo['f'.$catapultTarget], false );
            }

            $info_cat .= "</td></tr></tbody>";
        } else {
            $info_cat = "" . $catp_pic . "," . $this->procResType( $tbgid, $can_destroy, $isoasis ) . $info_cata;

            // embassy level was changed
            if ( $tbgid == 18 ) {
                $info_cat .= $database->checkEmbassiesAfterBattle( $data['to'], $bdo['f'.$catapultTarget], false );
            }
        }
    }
}
Shadowss commented 6 years ago

Problems comes from Automation

martinambrus commented 6 years ago

resolveCatapultsDestruction() was part of sendunitsComplete(), I just moved it to its own function... however, given that this functionality only determines targets for catapults, there is no math to be checked for here

agony09 commented 6 years ago

maybe this helps: " With a level 20 rally point two buildings can be targeted at the same time. You just need to attack with at least 20 catapults to be able to choose two targets." this is from this site: http://t4.answers.travian.com/?view=answers&action=answer&aid=169#go2answer

martinambrus commented 6 years ago

thanks @agony09 but this is more of a mathematical + logical mess-up, the functionality you mentioned already works :)

agony09 commented 6 years ago

ok I understand. then the question arises: How much can 2 catapults destroy a building at a level 20 buildings? How many levels should be deducted for the level of 20 buildings? or the other way round: how many catapults are needed to destroy a level 20 building?

martinambrus commented 6 years ago

I think @velhbxtyrj already answered all the mathematical formula questions in his comment above - what we need here is actually someone who can understand the PHP code and how these calculations are applied, then fix them

Shadowss commented 6 years ago

Will check again tomorow morning. But let me know is the only place where the formula is applied

martinambrus commented 6 years ago

Thanks @Shadowss, although I believe I have provided all the information that I know and there is nothing further that's not in any of the comments above or the issue description that I can disclose. I would just repeat myself.

Shadowss commented 6 years ago

Im not on the pc iam on mobile now i think 1.0205 is wrong

Dayran commented 6 years ago

hmm it's weird since the natures if you have the catalputas well look at this picture cata

Dayran commented 6 years ago

cata2

Shadowss commented 6 years ago

Natars have his own system for targeting with catapults. I try to fix in this morning but no result ... if i modify something not targeting at all....

Ex : if i change

// Formula for the calculation of catapults needed if($catp > 0 && $tblevel != 0) {

with

// Formula for the calculation of catapults needed if($catp > 1 && $tblevel != 1) {

Catapult wont target at all

Shadowss commented 6 years ago

I try to discover this problems 4 hours , i restored old travian server from 2014 , same bug !

Dayran commented 6 years ago

review a server of 2012

   // Formule voor de berekening van katapulten nodig
             if($catp > 0 && $tblevel != 0) {
        $wctp = pow(($rap/$rdp),1.5);
        $wctp = ($wctp >= 1)? 1-0.5/$wctp : 0.5*$wctp;
        $wctp *= $catp;
        $artowner = $database->getVillageField($DefenderWref,"owner");
        $bartefact = count($database->getOwnUniqueArtefactInfo2($artowner,1,3,0));
        $bartefact1 = count($database->getOwnUniqueArtefactInfo2($DefenderWref,1,1,1));
        $bartefact2 = count($database->getOwnUniqueArtefactInfo2($artowner,1,2,0));
        if($bartefact > 0){
        $strongerbuildings = 5;
        }else if($bartefact1 > 0){
        $strongerbuildings = 4;
        }else if($bartefact2 > 0){
        $strongerbuildings = 3;
        }else{
        $strongerbuildings = 1;
        }
        if($stonemason==0){
        $need = round((($moralbonus * (pow($tblevel,2) + $tblevel + 1)) / (8 * (round(200 * pow(1.0205,$att_ab['a8']))/200) / $strongerbuildings)) + 0.5);
        }else{
        $need = round((($moralbonus * (pow($tblevel,2) + $tblevel + 1)) / (8 * (round(200 * pow(1.0205,$att_ab['a8']))/200) / ($bid34[$stonemason]['attri']/100) / $strongerbuildings)) + 0.5);
        }
        // Aantal katapulten om het gebouw neer te halen
        $result[3] = $need;
        // Aantal Katapulten die handeling
        $result[4] = $wctp;
        $result[5] = $moralbonus;
        $result[6] = $att_ab['a8'];
    }
Shadowss commented 6 years ago

Not working , already tested ! With this code :

cata

I think the problem is $tblevel. Why i say that ? Because the formula not show what is the actual level of building , see $walllevel

I have over 6 hours changing the script and testing

Dayran commented 6 years ago

let me try a 2012 server that I am looking at the catalputa system and I will tell you

Shadowss commented 6 years ago

I already put your code in my site and give you a screen. I remember that function works great some times ago.... but i do not remember where that problems come. So i repeat i think the formula do not know the actual level of a building and $tblevel is the problem

Dayran commented 6 years ago

you're right then I'm going to review Shadowss

velhbxtyrj commented 6 years ago

This is if the village has defensive troops

1

martinambrus commented 6 years ago

@Shadowss sounds like we're getting closer... does it matter how many troops? will it work this way with 10 troops, or 100? if so, then the problem would be in calculations for defense-less villages only... and that would hopefully be a pretty narrow match to backtrace then :)

velhbxtyrj commented 6 years ago

The fact is that if I sent 1, 2, 3-20 catapults constantly blows one level, with the presence of defensive troops in the village.

martinambrus commented 6 years ago

No, I mean if this works with 10 or 100 defensive troops...

velhbxtyrj commented 6 years ago

Are you talking about this?

1 2

Or about this?

3 4

Or about this?

5 6 7

Shadowss commented 6 years ago

No the formula is not correct something in math is messed up. I ask ronix to take a look he code that formula

martinambrus commented 6 years ago

@velhbxtyrj the first one is what I was after. So if you have a certain number of defending units, then your building is not destroyed but only damaged by 1 level. Up to that level, your building is always destroyed even when both of those catapults are destroyed alongside. That's the culprit, that's what's definitely wrong.

Shadowss commented 6 years ago

Ok im closer : $moralbonus is described before in that function and is the moral (population , level of palace or residence , etc) $att_ab8 is the blacksmith and the armoury

But $tblevel have no description , i search in Automation or Database and no description just $totallvl = $tblevel so i think the description is wrong!

In old travian script the level of building is clearly described : $BuildingLevelMax[$i] = 20;

        if($catapults > 0 && !$IsOasis) {
            $BuildLevelStrength=array(1=>1,2,2,3,4,6,8,10,12,14,17,20,23,27,31,35,39,43,48,53);
            $RequiredCatapults = $RequiredCatapultsMax = $BuildingLevelMax = array();
            if(!empty($RequiredCatapults)) { reset($RequiredCatapults); }
            for($i=1;$i<=2;$i++) {
                if($data['ctar'.$i] == 0 || $ctarf[$i] == 0) {
                    $data['ctar'.$i] = $DefenderFieldsArray[rand(0,count($DefenderFieldsArray)-1)];
                    if($data['ctar2'] == 0 && $i == 1) { $data['ctar2'] = $data['ctar1']; }
                }
                $RequiredCatapults[$i] = round((($DefenderData['pop'] < $AttackerData['pop'] ? min(3,pow($AttackerData['pop'] / $DefenderData['pop'],0.3)) : 1) * (pow($DefenderField['f'.$ctarf[$i]],2) + $DefenderField['f'.$ctarf[$i]] + 1) / (8 * (round(200 * pow(1.0205,$Blacksmith['b'.$UnitCatapult])) / 200) / max(1,($data['ctar'.$i]>=18?max(1,$BonusStoneMason + $BonusArtefactDurability):1)))) + 0.5);
                $BuildingLevelMax[$i] = 20;
                if($DefenderData['capital'] != 1 && $data['ctar'.$i] <= 18 || in_array($data['ctar'.$i],$TrapperArray)) { $BuildingLevelMax[$i] = 10; }
                if(in_array($data['ctar'.$i],$ResourceImprovementArray)) { $BuildingLevelMax[$i] = 5; }
                $RequiredCatapultsMax[$i] = round((($DefenderData['pop'] < $AttackerData['pop'] ? min(3,pow($AttackerData['pop'] / $DefenderData['pop'],0.3)) : 1) * (pow($BuildingLevelMax[$i],2) + $BuildingLevelMax[$i] + 1) / (8 * (round(200 * pow(1.0205,$Blacksmith['b'.$UnitCatapult])) / 200) / max(1,($data['ctar'.$i]>=18?max(1,$BonusStoneMason + $BonusArtefactDurability):1)))) + 0.5);
            }
            $CatapultsFiring = pow($attack_total / $defense_total,1.5);
            if($CatapultsFiring > 1) {
                $CatapultsFiring = 1 - 0.5 / $CatapultsFiring;
            } else {
                $CatapultsFiring = 0.5 * $CatapultsFiring;
            }
            $CatapultsFiring *= $data['t'.$UnitCatapult];
            for($i=1;$i=($data['ctar1']==$data['ctar2']?1:2);$i++) {
                $BuildingLevelOld[$i] = $DefenderField['f'.$data['ctar'.$i]];
                if($data['ctar1']!=$data['ctar2'] && $i==1) { $CatapultsFiring /= 2; }
                if($CatapultsFiring >= $RequiredCatapults[$i]) {
                    if($DefenderField['f'.$data['ctar'.$i]] == $FieldPalRes) { $DestroyedPalRes = True; }
                    if($data['ctar'.$i] >= 19) { $database->setVillageLevel($data['to'],'f'.$data['ctar'.$i].'t',0); }
                    $database->setVillageLevel($data['to'],'f'.$data['ctar'.$i],0);
                    $BuildingLevelNow[$i] = 0;
                    $RecountReqd = True;
                } else {
                    $BuildLevelCount = 0;
                    for($j=$DefenderField['f'.$data['ctar'.$i]];$j=1;$j--) {
                        $BuildLevelCount += ($BuildLevelStrength[$j] - $BuildLevelStrength[$j-1]) * $RequiredCatapultsMax[$i] / $BuildLevelStrength[$BuildingLevelMax[$i]];
                        if($CatapultsFiring < $BuildLevelCount) {
                            $BuildingLevelNow[$i] = $j;
                            break;
                        }
                        $database->setVillageLevel($data['to'],'f'.$data['ctar'.$i],$BuildingLevelNow[$i]);
                        $RecountReqd = True;
                    }
                }
            }
        }
martinambrus commented 6 years ago

@Shadowss - were you able to fix it at the end? Or that wasn't the right clue in that last comment?

RevertIT commented 6 years ago

@Shadowss any progress mate? Kinda sad to see this place inactive again

Shadowss commented 6 years ago

It is christmas and new year i am in vacation

AL-Kateb commented 6 years ago

The problem is here: https://github.com/Shadowss/TravianZ/blob/c32bdc53a218626acc2f0002fb4ca07c65a737b4/GameEngine/Automation.php#L1476 It makes no sense for $tblevel, which is the target building level, to be assigned here! When calculateBattle is called, it is called with $tblevel = 1, which is inaccurate, I did not give it enough time but I think we need to get $tblevel from here: https://github.com/Shadowss/TravianZ/blob/c32bdc53a218626acc2f0002fb4ca07c65a737b4/GameEngine/Automation.php#L1050

I will check it more deeply when I have the chance, but all we need to do is, get the right target level when this line is called:

https://github.com/Shadowss/TravianZ/blob/c32bdc53a218626acc2f0002fb4ca07c65a737b4/GameEngine/Automation.php#L1666

AL-Kateb commented 6 years ago

Same goes for Stonemason BTW, it is passed to calculateBattle as 1 which it should not

RevertIT commented 6 years ago

@martinambrus should see comments above 👍

martinambrus commented 6 years ago

@phaze1G @martinambrus does see every comment that comes in :+1:

AL-Kateb commented 6 years ago

OK, I think I figured out where the problem exactly is, and I created a workaround while not exactly the best solution, but it works for now.

The thing is, resolveCatapultsDestruction relies on $battlepart, which is created in calculateBattle, but when calculateBattle is called, catapult targets are not yet assigned the whole bit where target 1 and target 2 are determined is being executed AFTER calculateBattle is called, so as far as calculate battle is concerned the building level is 1 and therefore needed catapults to fully destroy the building are always going to be 2 or so.

So the way I worked around this is by recalculating the needed catapults inside resolveCatapultsDestruction by adding the lines right above: https://github.com/Shadowss/TravianZ/blob/c32bdc53a218626acc2f0002fb4ca07c65a737b4/GameEngine/Automation.php#L1057

        global $bid34;
        $stonemason = 0;
        foreach($bdo as $key=>$b){
            if($b == 34 AND strpos($key, "t") !== false){
                $stonemason = str_replace("t", "", $key);
                $stonemason = $bdo[$stonemason];
            }
        }
        if($stonemason > 0){
            $stonemasonEffect = $bid34[$stonemason]['attri'] / 100;
        }else{
            $stonemasonEffect = 1;
        }
                $battlepart[3] = round((($battlepart[5] * (pow($tblevel,2) + $tblevel + 1)) / (8 * (round(200 * pow(1.0205,$battlepart[9]))/200) / $stonemasonEffect / $battlepart[10])) + 0.5);

What this code is doing, grabbing the stonemason's lodge info to get the bonus "$bid34", looking for the stonemason's level inside the $bdo array "Perhaps there is a better method? Like $building->getLevelByGid(34), I just could not figure out which method can get the building level by GID"

If there is a stonemason's lodge it will grab its bonus, if not then the bonus is set to 1 After I recalculate the needed catapults since now I have all the information needed $battlepart[3] is the number of needed catapults to take down the building to level 0.

Where $battlepart[5] is the moral bonus $tblevel is the target building level $battlepart[9] is the catapult upgrade level $stonemasonEffect is the bonus the stonemason's lodge has at its level $battlepart[10] is the combined good and bad effects brought by the artifacts Please notice that $battlepart is returned by calculateBattle

I hope this works for you, and maybe someone is going to rewrite this whole thing so it makes more sense : )

martinambrus commented 6 years ago

@AL-Kateb excellent, thanks a lot for that :) I will not have time to look into it until the end of this year but I'll check it out in the first week of 2018... if this solves the problem, you just saved this project's butt :P

martinambrus commented 6 years ago

okay, at the end I've had some free time to test this out today and it seems that the fix works... thanks again for this, @AL-Kateb :)

@velhbxtyrj, @Shadowss guys, would you be able to test this when you have time, so we can close it and continue with all the good things?

Shadowss commented 6 years ago

Cannot be tested

Pagina nu funcționează Momentan, travian.shadowss.ro nu poate procesa această solicitare. HTTP ERROR 500

ERROR 500 on http://travian.shadowss.ro/install/process.php

When trying

Create Database Structure Warning: This can take some time. Please wait until the next page has been loaded. Click Create to proceed...

martinambrus commented 6 years ago

@Shadowss error log would help