rigidchips-lib / rigidchips

23 stars 7 forks source link

爆炎エコーバグ #133

Open siruhu opened 6 years ago

siruhu commented 6 years ago

オンラインで他人を高RPMで撃った場合(1発/fを超える場合?)に爆炎の受信が遅れてしばらく出続けるようにみえるやつ これ実は撃たれた人が送信した爆炎を撃った人が受け取って更に再送してた

原因としては B27ソース640行目から

    //シナリオが同じなら
    if(PlayerData[i].scenarioCode==scenarioCode) {
        int s=(size-sizeof(short))/sizeof(GEXPDATA2);
        GEXPDATA2 *expo=(GEXPDATA2*)data;
        for(int j=0;j<s;j++) {
            GParticleVertex *part=NULL;
            if(expo[j].Type==1) {
                part=JetParticle->Add(1,expo[j].Pos,GVector(0,0,0),GVector(0,0,0),(0.3f+(rand()%50/200.0f))*expo[j].Power*0.08f,expo[j].Power,0.04f,GVector(1,1,1),0);
                if(expo->dpnid==DPlay->GetLocalPlayerDPNID()) AttackDataDisp("O >> Crush ",playerInfo->dpnidPlayer,0);
            }
            else {
                part=JetParticle->Add(2,expo[j].Pos,GVector(0,0,0),GVector(0,0,0),(0.2f+(rand()%50/200.0f))*expo[j].Power*0.08f,expo[j].Power,0.04f,GVector(1,1,1),0);
                if(expo->dpnid==DPlay->GetLocalPlayerDPNID()) AttackDataDisp("O >> Hit ",playerInfo->dpnidPlayer,0);
            }
            part->Net=0;
        }
    }

前提:ここの受信処理はRCのメインループとは非同期に走ってる 1.爆炎を登録 2.受け取った爆炎の攻撃者が自身だった場合にAttackDataDispへ爆炎の生成者を送信 3.爆炎の未送信フラグを倒す

になってて、AttackDataDispで表示だの何だのしてる間(どっかで干渉してメインループ待ってる?)にメインループの送信処理が回ってきて未送信フラグ倒す前の爆炎を拾って送り返してた ついでに爆炎の処理が詰まって座標データとかも更新されなくなってた

対処としてはGParticle.hpp内のGParticleVertex *Add()の最後の引数にbool netでも追加して未送信フラグを登録時点で設定できるようにすれば再送は収まる 爆炎の登録が詰まるのはAttackDataDispは被弾リスト登録だけにして、文字列生成とSendMessageで登録してるのを切り出して、メインループの何処かで1F1回だけ更新させるなりすればいい