日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

TileEntity核心機(jī)制詳解:從反應(yīng)器到模塊開發(fā)實(shí)戰(zhàn)

TileEntity核心機(jī)制詳解:從反應(yīng)器到模塊開發(fā)實(shí)戰(zhàn) 寫模組到現(xiàn)在第三十九篇終于該碰真正的核心機(jī)制了。前面幾篇基本都在和Block、Item、模型這些靜態(tài)的東西打交道而這一篇要講的TileEntity本質(zhì)上就是讓方塊“活”過來的關(guān)鍵——它可以讓一個(gè)方塊擁有自己的數(shù)據(jù)、自己的狀態(tài)、自己的運(yùn)行邏輯。我用“反應(yīng)器”這個(gè)名字來作為載體是因?yàn)檫@類“機(jī)器型方塊”幾乎包含了一個(gè)TileEntity能遇到的所有問題內(nèi)部要存物品輸入槽、輸出槽、燃料槽要有處理進(jìn)度要和服務(wù)端邏輯配合還要把進(jìn)度同步到客戶端讓玩家在界面上看到進(jìn)度條在動(dòng)。能把反應(yīng)器做出來就等于掌握了模組開發(fā)里最常用的一類方塊實(shí)體。這篇文章會(huì)從需求拆解開始把注冊(cè)、NBT存儲(chǔ)、服務(wù)端tick邏輯、數(shù)據(jù)同步、渲染方案全部過一遍最后一節(jié)是我實(shí)際踩過的一些坑照著做就能繞開。1. 先用需求倒推反應(yīng)器的核心難點(diǎn)其實(shí)只有三點(diǎn)1.1 為什么必須引入TileEntityBlockState搞不定的三件事先回答一個(gè)很多人剛接觸時(shí)都會(huì)問的問題做個(gè)反應(yīng)器直接用一個(gè)Block類不行嗎答案是不行至少做不出真正意義上的“反應(yīng)器”。原因有三條。第一是狀態(tài)存儲(chǔ)。BlockState在1.12.2里的本質(zhì)是方塊自身屬性的組合它存在世界里的時(shí)候只是一組Property和對(duì)應(yīng)的值沒法塞進(jìn)去一個(gè)ItemStack數(shù)組??煞磻?yīng)器內(nèi)部要存燃料、原料、產(chǎn)物這是典型的多檔位物品存儲(chǔ)只有TileEntity能在世界數(shù)據(jù)里單獨(dú)掛一塊NBT給它存這些內(nèi)容。第二是運(yùn)行邏輯。BlockState沒有tick方法當(dāng)然1.12.2里可以給方塊設(shè)置setTickRandomly但那只能做非常稀疏的隨機(jī)刻用來跑“每200tick燒一次燃料”這種流程別說手感不對(duì)實(shí)際表現(xiàn)也會(huì)非常奇怪。真正穩(wěn)定的做法是讓TileEntity實(shí)現(xiàn)ITickable每個(gè)游戲刻都被服務(wù)端調(diào)用一次update。第三是數(shù)據(jù)同步??蛻舳说哪P鸵鶕?jù)工作狀態(tài)變化GUI界面要顯示當(dāng)前進(jìn)度這些都需要一個(gè)能被服務(wù)器主動(dòng)推送數(shù)據(jù)、客戶端能讀取解析的實(shí)體BlockState只靠IBlockState里的Property做不了這么細(xì)致的數(shù)據(jù)流通。打個(gè)比方Block是“外表”TileEntity是“內(nèi)臟”。外表可以換顏色、換朝向但里面的血液、呼吸、心跳這些數(shù)據(jù)信息必須要內(nèi)臟來管理。1.2 反應(yīng)器的功能定義輸入槽、輸出槽、燃料與進(jìn)度在動(dòng)手寫代碼之前先把這臺(tái)“反應(yīng)器”到底做什么定義清楚。我把它設(shè)計(jì)成一個(gè)基礎(chǔ)冶煉機(jī)器有兩個(gè)輸入槽一個(gè)是燃料槽比如煤炭一個(gè)是原料槽比如鐵錠一個(gè)輸出槽。反應(yīng)器會(huì)消耗燃料將原料轉(zhuǎn)化為產(chǎn)物同時(shí)積累一個(gè)進(jìn)度值。考慮到系列文章的內(nèi)容密度我決定這期不寫GUI只把TileEntity的核心邏輯、數(shù)據(jù)存儲(chǔ)、同步和模型狀態(tài)做完整。沒有GUI并不影響學(xué)習(xí)TileEntity因?yàn)門ileEntity本身的數(shù)據(jù)鏈和交互鏈?zhǔn)仟?dú)立于GUI的。GUI在下一期再單獨(dú)展開那一篇會(huì)引入Container和Slot的完整體系。這里要用到的技術(shù)點(diǎn)包括Block的hasTileEntity與createNewTileEntity方法、TileEntity的readFromNBT與writeToNBT、ITickable接口、IInventory接口讓Reactable可以被管道、漏斗等外部系統(tǒng)理解、服務(wù)端到客戶端的同步通道。如果這些詞你現(xiàn)在看著還發(fā)懵問題不大接下來每一個(gè)我都會(huì)給出完整的代碼和解釋。2. 從Block到TileEntity的注冊(cè)鏈路少了哪一步都不行2.1 注冊(cè)TileEntityGameRegistry與createNewTileEntity的配合TileEntity不是一個(gè)獨(dú)立的注冊(cè)對(duì)象它必須依附在Block上。你在游戲里放置一個(gè)方塊游戲才會(huì)根據(jù)這個(gè)方塊對(duì)應(yīng)的TileEntity類在內(nèi)存中new一個(gè)實(shí)體出來再綁定到那個(gè)BlockPos坐標(biāo)上。在1.12.2 Forge里第一步是用GameRegistry.registerTileEntity注冊(cè)類與ID的映射關(guān)系。注意這里的ID是字符串要和TileEntity類綁在一起并且只在服務(wù)端注冊(cè)一次即可。通常會(huì)寫在Mod主類或者一個(gè)專門放注冊(cè)邏輯的類里我習(xí)慣放在一個(gè)RegistryHandler類中。public class RegistryHandler { public static void registerTileEntities() { GameRegistry.registerTileEntity(TileEntityReactor.class, reactor_te); } }一個(gè)很容易被忽略的細(xì)節(jié)注冊(cè)用的key不要用中文也不要太長。它會(huì)被寫進(jìn)存檔如果你以后改了key舊存檔里的區(qū)塊加載時(shí)就會(huì)找不到對(duì)應(yīng)的TileEntity類直接崩檔或者丟數(shù)據(jù)。所以命名一定要穩(wěn)定類似reactor_te這種短字符串最穩(wěn)妥。第二步最關(guān)鍵在Block類里重寫兩個(gè)方法Override public boolean hasTileEntity(IBlockState state) { return true; } Override public TileEntity createNewTileEntity(World world, int metadata) { return new TileEntityReactor(); }這兩個(gè)方法缺一不可。hasTileEntity決定這個(gè)方塊在放置時(shí)要不要附帶創(chuàng)建實(shí)體createNewTileEntity就是創(chuàng)建的具體邏輯。很多新手只寫了hasTileEntity就迫不及待進(jìn)游戲測(cè)試結(jié)果放置的方塊完全沒有數(shù)據(jù)存儲(chǔ)能力查了半天發(fā)現(xiàn)是createNewTileEntity沒實(shí)現(xiàn)。2.2 方塊注冊(cè)、模型綁定與掉落處理的連帶改動(dòng)Block本身還是要正常注冊(cè)的和前面的基礎(chǔ)方塊一樣setRegistryName、setUnlocalizedName、加到創(chuàng)造模式物品欄、注冊(cè)ModelLoader資源。這些內(nèi)容在系列前面已經(jīng)寫過這里就不重復(fù)貼代碼了只強(qiáng)調(diào)幾個(gè)和TileEntity相關(guān)的連帶改動(dòng)。第一如果你用了物品欄里的方塊物品要確保在客戶端注冊(cè)對(duì)應(yīng)的Item模型否則放置后模型可能變紫黑色。這屬于老生常談但在加了TileEntity之后容易忘。第二方塊被破壞時(shí)TileEntity里的物品不會(huì)自動(dòng)掉出來。你必須在breakBlock方法里自己處理掉落邏輯否則玩家用鎬子挖掉反應(yīng)器里面的燃料和產(chǎn)物會(huì)直接蒸發(fā)。Override public void breakBlock(World world, BlockPos pos, IBlockState state) { TileEntity tileEntity world.getTileEntity(pos); if (tileEntity instanceof TileEntityReactor) { TileEntityReactor reactor (TileEntityReactor) tileEntity; for (int i 0; i reactor.getSizeInventory(); i) { ItemStack stack reactor.getStackInSlot(i); if (!stack.isEmpty()) { spawnAsEntity(world, pos, stack); } } } super.breakBlock(world, pos, state); }這里用的是Forge提供的spawnAsEntity方法它負(fù)責(zé)在指定位置生成一個(gè)物品實(shí)體。注意循環(huán)里要先判斷stack是否為空1.11以后ItemStack不允許出現(xiàn)Item為null的實(shí)例一律用ItemStack.EMPTY來表示空槽位判斷方法就是isEmpty()。還有一個(gè)偏門但很重要的方法叫eventReceived它和Block與TileEntity之間的客戶端事件通信有關(guān)。比如你想在客戶端播放音效、粒子效果時(shí)可以通過world.addBlockEvent觸發(fā)最終會(huì)調(diào)用到這個(gè)方法并轉(zhuǎn)發(fā)給TileEntity的receiveClientEvent。1.12.2里很多機(jī)器型方塊會(huì)重寫它來實(shí)現(xiàn)“敲一下發(fā)個(gè)信號(hào)”的交互反應(yīng)器這版先不涉及但你要知道有這個(gè)東西存在。3. 核心實(shí)現(xiàn)讓TileEntity自己動(dòng)起來的完整代碼3.1 TileEntityReactor的字段設(shè)計(jì)與生命周期現(xiàn)在進(jìn)入正題。TileEntityReactor需要繼承TileEntity然后實(shí)現(xiàn)ITickable和IInventory。ITickable提供update方法IInventory提供物品操作相關(guān)接口。字段設(shè)計(jì)上我習(xí)慣把所有需要持久化的數(shù)據(jù)放到一起方便寫NBTpublic class TileEntityReactor extends TileEntity implements ITickable, IInventory { private ItemStack[] inventory new ItemStack[2]; private int progress 0; private static final int MAX_PROGRESS 200; private ItemStack fuelStack; private ItemStack materialStack; public TileEntityReactor() { for (int i 0; i inventory.length; i) { inventory[i] ItemStack.EMPTY; } } }我這里故意用了一個(gè)獨(dú)立的ItemStack[]數(shù)組而不是直接用兩個(gè)單獨(dú)的字段。為什么因?yàn)镮Inventory接口要求按槽位索引訪問一個(gè)數(shù)組能讓你寫循環(huán)遍歷、判斷空槽位、實(shí)現(xiàn)自動(dòng)注入邏輯時(shí)都方便很多后續(xù)做漏斗交互、管道連接時(shí)優(yōu)勢(shì)更明顯。數(shù)組長度為20號(hào)槽放燃料1號(hào)槽放原料。實(shí)際上你完全可以擴(kuò)展成3個(gè)、4個(gè)甚至用List管理動(dòng)態(tài)槽位。進(jìn)度值progress是處理進(jìn)度的核心數(shù)值每次update會(huì)增加達(dá)到MAX_PROGRESS時(shí)觸發(fā)一次產(chǎn)出。MAX_PROGRESS200意味著大概10秒完成一次處理1.12.2的tick是每秒20次。這是一個(gè)很“手感化”的參數(shù)需要根據(jù)你的機(jī)器定位調(diào)整。如果希望反應(yīng)器是一個(gè)前期工具200剛好如果希望它是中后期才能效率化使用的設(shè)備可以抬高到400甚至更高。TileEntity的生命周期里有三個(gè)時(shí)刻最值得注意放置時(shí)構(gòu)造、每個(gè)tick被update調(diào)用、被保存或加載時(shí)執(zhí)行readFromNBT/writeToNBT。構(gòu)造時(shí)把數(shù)組所有槽位初始化成ItemStack.EMPTY可以避免很多空指針問題這個(gè)習(xí)慣從第一天寫TileEntity就要養(yǎng)成。3.2 核心update與配方判斷服務(wù)端主循環(huán)的寫法update方法是整個(gè)TileEntity的心臟也是最容易寫出性能問題的地方。第一行永遠(yuǎn)是判斷客戶端因?yàn)門ileEntity的tick邏輯必須在服務(wù)端執(zhí)行客戶端只需要被動(dòng)接收同步數(shù)據(jù)。如果客戶端也跑了這套邏輯就會(huì)出現(xiàn)兩邊數(shù)據(jù)不一致進(jìn)度條抽風(fēng)甚至服務(wù)端把客戶端數(shù)據(jù)覆蓋掉的嚴(yán)重bug。Override public void update() { if (world.isRemote) { return; } boolean needSync false; if (canProcess()) { if (fuelStack.isEmpty() || fuelStack.getCount() 0) { // 沒燃料試著從燃料槽拿一組進(jìn)來 if (!inventory[0].isEmpty()) { fuelStack inventory[0].splitStack(1); needSync true; } } if (!fuelStack.isEmpty() !materialStack.isEmpty()) { progress; if (progress MAX_PROGRESS) { processResult(); progress 0; needSync true; } } else { progress 0; } } else { progress 0; } if (needSync || progress 0) { markDirty(); } if (needSync) { world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); } }canProcess方法負(fù)責(zé)判斷當(dāng)前是否滿足處理?xiàng)l件private boolean canProcess() { return !inventory[0].isEmpty() !inventory[1].isEmpty(); }這里簡化了“什么能當(dāng)燃料、什么能當(dāng)原料”的判定。實(shí)際項(xiàng)目里我會(huì)建議單獨(dú)寫一個(gè)方法比如isFuel(ItemStack)來判斷物品是否屬于燃料列表而原料則對(duì)應(yīng)一套配方表。配方表可以用MapItemStack, ItemStack或者更工程化的Recipe對(duì)象來實(shí)現(xiàn)。本篇為了聚焦TileEntity本身先用“非空即可處理”的邏輯占位后續(xù)加配方系統(tǒng)時(shí)只需替換canProcess和processResult內(nèi)部實(shí)現(xiàn)其他部分完全不用動(dòng)。processResult負(fù)責(zé)一個(gè)周期結(jié)束后真正“產(chǎn)出”什么東西private void processResult() { ItemStack result new ItemStack(Items.DIAMOND); // 示意實(shí)際應(yīng)該按配方產(chǎn)出 inventory[0].shrink(1); inventory[1].shrink(1); inventory[2] result.copy(); fuelStack inventory[0]; materialStack inventory[1]; }這里有一個(gè)編程細(xì)節(jié)inventory[0].shrink(1)會(huì)就地減少堆疊數(shù)量但1.12.2里ItemStack是不可變對(duì)象shrink會(huì)返回一個(gè)新的棧所以更穩(wěn)妥的寫法是把shrink的結(jié)果重新賦值給原槽位。很多老教程里的stackSize--在新版MCP映射下已經(jīng)不可用了。我實(shí)際寫的時(shí)候更喜歡這樣inventory[0] inventory[0].splitStack(inventory[0].getCount() - 1); if (inventory[0].getCount() 0) { inventory[0] ItemStack.EMPTY; }看起來啰嗦但它能保證任何情況下槽位都不會(huì)出現(xiàn)“只剩一個(gè)空ItemStack對(duì)象但還沒變成EMPTY”的隱患。3.3 IInventory接口讓漏斗和其他Mod認(rèn)識(shí)你的機(jī)器為什么一定要實(shí)現(xiàn)IInventory因?yàn)檫@等于給你的TileEntity定了一套標(biāo)準(zhǔn)通信協(xié)議。原版的漏斗、投擲器、其他模組的自動(dòng)化管道都通過IInventory來讀取和寫入物品。你只要實(shí)現(xiàn)這個(gè)接口反應(yīng)器天然就能被原版漏斗自動(dòng)供料這個(gè)效果會(huì)讓人非常有成就感。IInventory在1.12.2里有一堆方法除了必須返回?cái)?shù)組長度、判斷空、獲取槽位物品之外還有decrStackSize、setInventorySlotContents、markDirty、isUsableByPlayer等。寫的時(shí)候我沒必要全貼但有兩個(gè)方法值得單獨(dú)說。第一個(gè)是isItemValidForSlot(int index, ItemStack stack)它決定哪些槽位可以接收哪些物品。我建議在0號(hào)槽只接收燃料1號(hào)槽接收原料。這樣漏斗嘗試自動(dòng)輸入時(shí)不會(huì)把鐵錠塞到燃料管里。Override public boolean isItemValidForSlot(int index, ItemStack stack) { if (index 0) { return isFuel(stack); } else if (index 1) { return isMaterial(stack); } return false; }第二個(gè)是markDirty()。每次物品數(shù)量變化、進(jìn)度變化、狀態(tài)變化時(shí)都要調(diào)用它作用是把TileEntity標(biāo)記為“臟”提示存檔系統(tǒng)在合適的時(shí)間保存數(shù)據(jù)。漏寫markDirty的典型癥狀是服務(wù)端邏輯正常但區(qū)塊保存后重啟游戲物品或進(jìn)度回到舊狀態(tài)。IInventory接口里還有setField和getField這兩個(gè)在配合GUI的Container做進(jìn)度條同步時(shí)特別有用。1.12.2的Container里IPC通過getField讀取數(shù)值、setField寫入數(shù)值從而實(shí)現(xiàn)客戶端和服務(wù)端的整數(shù)同步。我這一期的代碼里沒寫GUI但這兩個(gè)方法還是要實(shí)現(xiàn)留好擴(kuò)展位下一期做GUI時(shí)直接就能用。4. 數(shù)據(jù)同步原理解決進(jìn)度條不動(dòng)、界面上數(shù)值不對(duì)4.1 三條同步通道的職責(zé)劃分加載、更新、渲染TileEntity的數(shù)據(jù)同步是新手最容易翻車的地方因?yàn)檫@里涉及三條完全不同的通道每一條都對(duì)應(yīng)不同的游戲階段。第一條是區(qū)塊加載同步。當(dāng)玩家走進(jìn)一個(gè)已加載的區(qū)塊時(shí)客戶端需要知道這個(gè)區(qū)塊里所有TileEntity的完整狀態(tài)。每條通道都由一個(gè)核心方法負(fù)責(zé)getUpdateTag讀寫出用于同步的完整的NBT數(shù)據(jù)然后通過SPacketUpdateTileEntity發(fā)送。這條通道會(huì)調(diào)用getUpdatePacket和onDataPacket方法。第三條是區(qū)塊渲染同步。當(dāng)客戶端開始渲染一個(gè)區(qū)塊時(shí)它不會(huì)直接拉取服務(wù)端的所有數(shù)據(jù)而是依賴服務(wù)端在方塊狀態(tài)變化、TileEntity狀態(tài)變化時(shí)主動(dòng)推送。實(shí)際開發(fā)中最常用到的就是第二條方塊更新同步。在服務(wù)端改變進(jìn)度、改變工作狀態(tài)后調(diào)用world.notifyBlockUpdate就可以觸發(fā)一次客戶端更新。這個(gè)方法的第三個(gè)參數(shù)是flags推薦用3表示同時(shí)通知鄰居更新和自身更新。4.2 讓進(jìn)度條動(dòng)起來的標(biāo)準(zhǔn)做法三次強(qiáng)調(diào)nottifyBlockUpdate進(jìn)度條動(dòng)不起來或者整個(gè)工作方的模型不隨狀態(tài)切換改變通常都是同一個(gè)原因服務(wù)端改了數(shù)據(jù)但沒通知客戶端。我處理這類問題有個(gè)標(biāo)準(zhǔn)三步走。第一步服務(wù)端邏輯里修改關(guān)鍵字段后立即markDirty保證之后區(qū)塊保存不丟數(shù)據(jù)。第二步調(diào)用world.notifyBlockUpdate(pos, state, state, 3)主動(dòng)通知客戶端這個(gè)坐標(biāo)的方塊狀態(tài)需要刷新。第三步在TileEntity里實(shí)現(xiàn)getUpdatePacket方法返回一個(gè)SPacketUpdateTileEntity同時(shí)在onDataPacket里把收到的NBT讀取回來。三件事配合才是一條完整的數(shù)據(jù)同步鏈路。Override public NBTTagCompound getUpdateTag() { return writeToNBT(new NBTTagCompound()); } Nullable Override public SPacketUpdateTileEntity getUpdatePacket() { return new SPacketUpdateTileEntity(pos, 1, getUpdateTag()); } Override public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) { readFromNBT(pkt.getNbtCompound()); world.markBlockRangeForRenderUpdate(pos, pos); }很多新手只實(shí)現(xiàn)了getUpdateTag忘了getUpdatePacket。結(jié)果就是打開存檔時(shí)能讀到正確數(shù)據(jù)但游戲運(yùn)行中客戶端拿不到變化進(jìn)度條自然不動(dòng)。記住getUpdateTag負(fù)責(zé)“首次加載時(shí)同步全量數(shù)據(jù)”getUpdatePacket負(fù)責(zé)“運(yùn)行中主動(dòng)推送更新”兩者都要有。onDataPacket里的最后一行也不可省略。readFromNBT只是把數(shù)據(jù)寫回TileEntity字段但客戶端渲染層并不知道數(shù)據(jù)變了。markBlockRangeForRenderUpdate會(huì)主動(dòng)標(biāo)臟渲染區(qū)域讓客戶端重新構(gòu)建這一段的渲染狀態(tài)。沒有這行模型切換有時(shí)就會(huì)卡在舊狀態(tài)上玩家的體感就是“反應(yīng)器一直在工作但外觀一直顯示待機(jī)”。5. 渲染方案進(jìn)度條與工作動(dòng)畫怎么做才不卡5.1 方案一用getActualState做多態(tài)模型推薦1.12.2里做機(jī)器工作狀態(tài)的渲染最常用也最推薦的做法是讓TileEntity的狀態(tài)驅(qū)動(dòng)IBlockState的Property。具體思路是在Block類里定義一個(gè)PropertyBool類型的working屬性重寫getActualState方法時(shí)查詢?cè)撟鴺?biāo)的TileEntity運(yùn)行狀態(tài)把working設(shè)置為true或false。public static final PropertyBool WORKING PropertyBool.create(working); Override public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { TileEntity te world.getTileEntity(pos); boolean working false; if (te instanceof TileEntityReactor) { working ((TileEntityReactor) te).isWorking(); } return state.withProperty(WORKING, working); }isWorking方法可以從TileEntity內(nèi)部狀態(tài)來定義比如燃料槽和原料槽都不為空或者progress 0。我建議用progress 0這個(gè)判定因?yàn)樗鎸?shí)地反映了“正在處理進(jìn)度中”的語義。然后你需要給這個(gè)方塊準(zhǔn)備兩個(gè)JSON模型文件分別對(duì)應(yīng)workingtrue和workingfalse。通過blockstate JSON里的multipart規(guī)則把方塊在working不同取值下用不同模型渲染。這是很多“機(jī)器在運(yùn)行”外觀效果的標(biāo)準(zhǔn)做法。這套方案的優(yōu)點(diǎn)是性能極好幾乎沒有任何運(yùn)行時(shí)開銷客戶端拿到的只是兩個(gè)不同靜態(tài)模型。缺點(diǎn)是做不了連續(xù)動(dòng)畫比如進(jìn)度條長度平滑增長就無能為力。如果你的反應(yīng)器外觀想展示一個(gè)“進(jìn)度條逐步填滿”的視覺效果那就得上方案二。5.2 方案二TileEntitySpecialRenderer做自定義渲染TESR的思路是完全繞過普通方塊模型由自己寫OpenGL調(diào)用邏輯來渲染TileEntity的形狀和動(dòng)態(tài)效果。1.12.2里有TileEntitySpecialRenderer 這個(gè)抽象類你重寫render方法綁定自己加載的模型然后根據(jù)TileEntity的progress字段來計(jì)算旋轉(zhuǎn)角度、位移、亮度、粒子效果等。TESR能做真正的平滑動(dòng)畫這是它比getActualState強(qiáng)的地方。但代價(jià)也很明顯每幀每個(gè)TileEntity都要調(diào)用你的render方法如果你不做優(yōu)化成千上萬個(gè)機(jī)器同時(shí)在工作會(huì)直接把幀率拉垮。如果你決定用TESR我的建議是優(yōu)先嘗試FastTESR。FastTESR會(huì)跳過一些常規(guī)的渲染狀態(tài)準(zhǔn)備性能更好代價(jià)是你不能使用大部分原版渲染輔助方法而且要自己管理OpenGL狀態(tài)。新手不推薦一上來就寫FastTESR先學(xué)會(huì)普通TESR理解了渲染流程后再優(yōu)化不遲。還有一個(gè)必坑點(diǎn)TESR必須獨(dú)立注冊(cè)不能依賴方塊注冊(cè)流程。1.12.2里用ClientRegistry.bindTileEntitySpecialRenderer(TileEntityReactor.class, new RenderReactor()); 放在客戶端初始化階段執(zhí)行即可。6. 排查記錄我在這套代碼上踩過的坑6.1 六個(gè)常見問題速查表這幾個(gè)問題基本上每個(gè)做TileEntity的新手都會(huì)遇上我把它們整理出來遇到相同現(xiàn)象直接對(duì)著查。問題現(xiàn)象常見原因解決方案放入燃料和原料后機(jī)器完全不動(dòng)update方法里沒寫world.isRemote判斷在update第一行return掉客戶端分支重啟游戲后進(jìn)度和物品丟失槽位數(shù)組沒寫入NBT或沒調(diào)用markDirty檢查readFromNBT/writeToNBT確保每個(gè)槽位都序列化客戶端進(jìn)度條數(shù)值永遠(yuǎn)是0沒實(shí)現(xiàn)getUpdatePacket補(bǔ)上getUpdatePacket和onDataPacket玩家挖掉方塊內(nèi)部物品消失沒重寫breakBlock處理掉落遍歷IInventory調(diào)用spawnAsEntity模型不切換工作態(tài)看不出來getActualState的working屬性沒監(jiān)聽TileEntity狀態(tài)在getActualState里查詢shape并確保update里調(diào)用了notifyBlockUpdate漏斗能輸出但不能輸入isItemValidForSlot判斷過嚴(yán)檢查槽位索引和物品判斷邏輯是否合理6.2 幾個(gè)讓代碼更穩(wěn)的長期習(xí)慣做TileEntity開發(fā)時(shí)間久了我總結(jié)出幾條保命經(jīng)驗(yàn)。第一所有持久化字段集中管理不要散落在類的各個(gè)角落。我見過很多項(xiàng)目把進(jìn)度值、燃料時(shí)間、配方ID都寫成獨(dú)立字段寫NBT時(shí)漏一個(gè)補(bǔ)一個(gè)最后維護(hù)成本高到爆炸。統(tǒng)一放到一個(gè)區(qū)域每次改字段都順手檢查NBT的讀寫是否同步更新。第二永遠(yuǎn)不要在update里直接new ItemStack。游戲每秒鐘會(huì)調(diào)用20次update如果你的處理邏輯里每tick都構(gòu)造新對(duì)象GC壓力會(huì)很明顯。最好在配方判定階段緩存結(jié)果或者用同一組ItemStack復(fù)用。原版的熔爐實(shí)現(xiàn)里有很多細(xì)節(jié)可以學(xué)習(xí)它用一個(gè)私有數(shù)組緩存當(dāng)前燒煉結(jié)果這是很成熟的設(shè)計(jì)思路。第三明確區(qū)分“服務(wù)端數(shù)據(jù)”和“客戶端數(shù)據(jù)”。progress這個(gè)字段在客戶端的存在意義只是為了顯示和渲染不應(yīng)該參與真正的邏輯判斷。如果你在canProcess里用了客戶端同步過來的progress做判定那服務(wù)端也會(huì)跟著出問題。唯一的原則就是業(yè)務(wù)邏輯要模擬在服務(wù)端的常用經(jīng)驗(yàn)就是給update方法加上一個(gè)“是否客戶端”的判斷以后所有的邏輯判斷都用服務(wù)端獨(dú)立計(jì)算的字段客戶端只讀現(xiàn)成結(jié)果。第四方塊更新通知不能濫用。如果你每個(gè)tick都調(diào)world.notifyBlockUpdate那任何在附近觀察的玩家都會(huì)收到大量網(wǎng)絡(luò)包人多的時(shí)候服務(wù)器會(huì)卡。我建議只在幾個(gè)關(guān)鍵節(jié)點(diǎn)觸發(fā)同步開始處理時(shí)、處理完成時(shí)、燃料或原料耗盡時(shí)。中途的progress增長不需要實(shí)時(shí)同步等到狀態(tài)變化時(shí)一次性同步即可。很多機(jī)器模組之所以卡就是因?yàn)樗鼈儼淹筋l率設(shè)成了每個(gè)tick一次。7. 擴(kuò)展方向從一臺(tái)反應(yīng)器到一個(gè)完整的機(jī)器體系當(dāng)你把反應(yīng)器的TileEntity邏輯跑通以后后續(xù)的擴(kuò)展就只是量變到質(zhì)變的問題了。最自然的幾個(gè)方向我在文章里也提過第一加入GUI和Container讓玩家能手動(dòng)放置和取出物品第二加入真正的配方系統(tǒng)用Map或者JSON配置文件來定義“什么燃料燒什么材料”再和合成表對(duì)應(yīng)起來第三加入紅石控制比如用IBlockState里的powered屬性讓反應(yīng)器在收到紅石信號(hào)時(shí)才工作第四加入多方塊結(jié)構(gòu)讓反應(yīng)器需要一個(gè)外殼或配套方塊才能運(yùn)行這就接近一些大型模組的機(jī)器體系了。我個(gè)人的建議是先把無GUI版的完整同步鏈路徹底吃透再一步步加上這些殼子。TileEntity的核心難點(diǎn)永遠(yuǎn)不在表面花活而在數(shù)據(jù)、邏輯、同步這三者的協(xié)調(diào)。反應(yīng)器這期把這三件事都覆蓋到了下一期加GUI時(shí)你會(huì)發(fā)現(xiàn)前面積累的這些經(jīng)驗(yàn)全部用得上。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日日爱99| 玖玖爱在线视频免费观看| 久久精品国产免费观看99| 综合欧美亚洲| 九九九不卡| 偷拍欧美激情| 99RE在线视频精品,这里只有精品| 女人高潮大叫一级毛片| 精品国产乱码久久久久久口爆网站| 伊人九九九| 日韩电影天堂视频一区二区| 日韩人妻精品中文字幕| 亚洲精品久久久久久| 欧美熟爽综合| 99精品久久| 精品久久久久久中文| 国产内射爽爽大片| 91亚洲欧美激情| WWW美腿丝袜香蕉中文| 日本伦理一区二区| 99精品网站| 国产少妇与亚洲av| 欧美天天插| 伊人网av| 久久久久久亚洲精品不卡人乳| 中国国国产一级特黄毛片| 伊人影院日本| 亚洲国产欧美另类自拍| 人人操人人摸人| 欧 美 自 拍 偷 拍| 色97欧美| 精品人妻一区二区三区四区不卡在| 天天操熟妇| 亚洲人久久久网| 自拍视频大全亚洲专媒视频/一区二区三区 | 91 国产丝袜在线播放-百度| 色综九九九一区| 97jingpin| 成人精品一区二区三区| 色综合91| 大香蕉中文aV在线| 亚洲色入欧美| 国产精品久久久午夜夜伦鲁鲁| 国产熟女精品区| 嗯嗯嗯,草死我| 麻豆60秒| 国产精品经典一卡久久久| 狠狠狠狠狠狠| 色妹子A V| 中文一区二区婷婷视频| 吉川爱美98堂在线| 中文在线久久字幕| 欧美精品三区| 精品人妻视频一区二区在线播放 | 操死我了嗯嗯嗯| 九九久久一区二区三区| 电影69乱码96| 久久鲁夜| 国产视频小说| 久久97视频| 欧美日韩久久精品爱爱| 思思热一热婷婷热一热| 97爱b| 国产精品91一样| 亚洲欧洲小说图片视频 | 日韩欧美资源| av中亚| 久久只有精品| 91在线视频免费播放| 日韩人妻 中文字幕| 人人摸人人摸人人干| 午夜影美女日鸡鸡天天视频国产| 操逼逼无码| 欧美黄片视频在线观看免费| 亚州少妇| 夜夜人妻爽| 亚洲色图日韩丝袜制服一区二区五月在线| 精品国产乱码久久久| 九七超碰| 婷婷色婷婷| 99精品丰满人妻无| 亚洲系列欧美| 超碰人妻久久| 天天干,夜夜爽| 久久熟妇五十路一区| 上床不卡网站| 91美女在线| 久久这里只精品免费福利| 91精品女厕偷拍视频| 久久久精品国产亚洲AV无码| 国产婷婷一区| 亚洲a色| 午夜精品久久久久久久久久蜜桃| 婷婷五月天av| 亚洲精品天天影视综合网| 国产91专区| 91激情| 婷婷五月激情综合| 国外91| 99re9| 大香蕉乱伦视频网| 日韩在线97| 亚洲精品电影| av在线资源| 99久在线精品99re8a| 插入粉嫩少妇视频| 日韩天天综合| 国产亚洲精品久久久久小| 午夜福利免费精品视频| 激情四射五月天| 欧美激情一区二区| 午夜操一操| 去干网最新版| 久久久久国色αv免费观看| 强奸乱伦AV网站| 女人的久久久| juliaann欧美丝袜办公室| 国产精品无码久久久久2028| 闷骚老熟女15P| 久久久偷拍| 日韩黄色一区二区三区| 青娱乐手机日韩在线视频| 亚洲丝袜二区在线| 91c色| 色 亚洲 91| 中文字幕一区二区视频在线观看| 天天爽夜夜操| 蜜臀久久99精品久久久久久婷婷| 国产精品制服丝袜清纯唯美| 日韩字幕一区| 久久久不能久久久久| 少妇高潮九九九九| 欧美日韩高潮喷水91| 天天操天天7| 久久久夜夜嗨免费视频| 97久久国产亚洲精品超碰热| 黄片www.| 婷婷8月天青娱乐| 国产原创剧情在线丝袜| 日韩综合97p| 久久精品国产免费观看99| 欧美日韩青操| 五月天色图| 深喉吞精| 欧美九九99久久精品| 亚洲欧洲av影音| av操操不卡| 国产日韩区| 天天天天天超碰| 色情乱伦AV| 久久久天堂| 日韩国产中文字幕| 91色图| 久jiu久神马影院| 亚洲精品国产拍免费91在线| 欧美顶级黄片AAAAA在线免费看| 99热8| 日韩AV熟女乱伦| 蜜臀Av一区二区三区| 在线观看日韩av不卡| 久夜操| 97玖玖人妻| 2023天天操夜夜操| 91国产丝袜美女| 中文字幕 国产区| 久草免费在线视频| 神马久久啊啊| 天天干天天日天天射黄色| 久久69精品久久久久久久| 日韩一级二级三级免费看完整版国语版| 殴美在线AⅤ| 欧美精品97| 亚洲男人天堂2012| 风流老熟女一区二区三区l| 97天天| 麻豆伊人网| 人人看欧美性爱| 大奶的诱惑| 日韩精品熟妇| 久久精品一区二区三区不卡| 少妇高潮流水av免费| 伊人网在线点播| 97午夜剧场日韩| 乱伦3P视频| 好吊色综合| 97超碰巨乳| 理论久久婷婷网 8| 久久一级无码精品毛片6| 天天网综合| 一级特黄aaa大片在线观看成人一级片在线观看 | 日韩av在线免费网站| 骚妻少妇精品性色无码四色A V| 国产激情av女片自拍| 久一区久久蜜桃| 美女让帅哥通她小鸡鸡| 国产人伦精品一区二区三区 | 蜜臀久久久国产| 日韩人妻少妇 一区二区三区| 亚洲欧洲无码bt精品合集| 亚洲精品 欧美97色色| 久久久111| 五月综合激情网| 都市久久精品激情亚洲| 人妻 欧美亚洲| 亚洲激情欧美色图| 久久久久国产精品喷潮免费观看臀| 国产丝袜欧美在线视频| 日韩成人综合网| 在线观看午夜婷婷久久久久清性观看| AV中文字幕剧情1区2区3| 在线播放成人高清免费视频| 欧美黄色大香蕉一区二区| 日韩欧美aⅴ综合网站发布| 日日碰狠狠添天天爽超| 91网站视频在线观看| 亚洲熟女一区二区| A 在线网址| 久久极品一区二区| 国语少妇精| 热无码中文亚洲H一道本一区二区| 欧美精品999| 一区二区国产视频在线观看| 影音先锋日本一区二区| 激情黄色五月天| 国内外内射高清视频| 九九在线视频| 欧美91变态| 天天影视综合网欧美精品| 亚洲区小说| 91爆操视频| 黄呦呦在线| 一区二区三区亚洲| 九久9精品| 中文字幕国产| 人妻激情另类| 日韩成人性爱电影在线播放| 亚州操操穴网| 夜夜影视四色| 男人网站婷婷| 再深点灬舒服灬太大了添视频| 九九十八精品| www.av在线观看| 国产 日韩 另类 视频一区爱| 久操大香蕉手机视频在线看| 99色色| 中文字幕aⅴ在线视频| 99久久综合| 精品人妻一区二区视频| www.人人摸在线视频| 97天天插| 五月色综合| 一区二区三区免费视频入口| 91热色| 天天日天天射天天干| 99国内精品| 极品粉嫩一区二区| 人人人人人人少妇| 日本精品无码三级网站| 久久久久久久久久久精| 成人国产精品三级A片| 亚洲国产一级黄色视频| 日本女厕偷拍| 日本福利社| 欧美性爱第一页久久| 亚洲人综合19| 老司机香蕉久久久久| 新视频sss国产| 99国内精品| AV中亚| 97人人色| 九九久久国产精品怡红院| 超碰97最新人妻| 欧美精品在线观看| 天天色粽合合合合合合合| 精品v日韩欧美国产| 啊啊啊好想要| a片自拍直播视频| 一级毛片电影免费看| 国产辣妈在线视频福利| 小视频国产| 夜嗨影院| 成人黑料社久久| 麻豆尤物视频网| 亚洲图片小说欧洲| 国产激情视频一区区三区| 欧美综合色,www| 欧美热图99| 亚洲欧美人妻| 色综合一本| AV色五月天| 久久99久久99精品天美传媒棢·纸:.| 青青草导航在线视频| 精品一区二区三区四区外站| 2020中文字幕在线| 99久久无码| 岛国视频一二三区| 嗯嗯嗯好爽| 天天弄欧美| 任我爽在线视频免费观看| 少妇天堂| 全免费a敌肛交毛片免费| 日韩人妻资源在线看| 久艹伊人精品综合在线| 亚洲情色 自拍| 秋霞成人一级在线观看| 黄污污污污| 无码视频一区二区| 久久夜夜| 久久久一区二区三区四曲免费听| 久久超碰国产一区二区三区| 丁香九月婷婷| 后入式福利| 激情文学网伊人| 精品人妻一区二区免费蜜桃| 精…码一二三区| 色官网在线| 加勒比性爱成人在线| 人人么人人操| 久操高青| 成人26uuu| 国产农村妇女精品1区二区| 亚州性色| 97爱欧美| 国产天天骚| 欧美性第1页| 日韩一级片| 九九九偷拍| 欧美国产伊人久久久久| 日韩久草| 日本理论在线| 无码粉嫩白虎一线天b区| 中文字幕av亚洲在线| 亚洲熟妇综合久久久久久| 麻豆精品.欧美精品.日韩精品.| 加勒比大香蕉视频在线| www亚洲欧美| 呻吟 欧美 日本 中出| 东京热大香焦| 99久热| 性色AV蜜色av色欲av| 九九成人精品| 久久久久亚洲一区女同性恋中文字幕| 人人艹亚洲| 久操国产在线| 天堂综合| 青青草日本中文字幕| 国模吧 一区二区三区| 女生看匆91网站| 成人无码专区精品视频| 成人片在线播放| 乱色老一区二区三区的观看方式| 女人天堂AV五区在线| 国内偷自视频区视频综合 | 黄色无码高清黄色无码网站| 韩国毛片一区二区三区| 亚洲男人天堂网久久| 草莓精品视频| 亚洲第一免费视频| 欧美日韩操逼动图| 亚洲精品性爱片| 极品国产内射| 伊人操| 狠久久| 成人精品水蜜桃久久久久久久| 蜜桃精品一区二区三区ww| 黄色片大香蕉| 精品性爱无码在线播放| 久久无码电影| 亚洲国产高清福利视频| 国产精品久久99日日| 91人妻人人澡人人爽人人精品| 97色色色综合网站| 色五月激情网| 91国产精品在线看| 午夜激情床戏激情| 亚洲熟女乱综合一区二区三区| 91天美传媒精品| 久久久性少妇| 色踪合AV| 热的中文 热的有码 热的国产| 久久人妻视频网| www.av在线观看| 精品亚洲国产成人精品| 亚洲国产欧美中文永久| 超碰精品97| 男人综合网| 农村女一级毛卡片| 久草视频在线视频在线视频在线观看| 最近的最新的中文字幕视频| a久久| 有码色中文字幕在线观看| 亚洲熟女乱色一区二区三区久久久 | 97国产色综合| 色五月第四色| 色色操| 97二区四区| 亚洲国产剧情少妇激情| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 人妻熟女一区二区三区在线| 九九热免费国产视频婷婷伊人| 亚欧高清在线| 这里只有精品视频在线| 中文字幕日韩国产传媒欧美精品| 午夜天堂精品久久| 国语精品对白| 99精品久久久久久久婷婷蜜桃| 这里是精品| 我爱搞逼综合网| 九九热av| 不卡免费av在线播放| 爽爽爽免费视频| 亚洲AV成人精品网站在AV| 丁香六月东京热| 久久久无码国精品无码三区三区| 日欧毛片久久| 欲香欲色综合天天伊人| 亚洲一区二区三区欧美日韩| 亚洲情色综合网| 人人么人人操| 91狠婷| 九七毛片九九毛片| 欧美黑人精品在线播放| 天堂亚洲精品久久老牛| 超碰97人人cao| 国产999精品久久久久久| 久草在| 十八禁视频一区二区| 九九久久久九九| 少妇被c 黄 免费观看| 日本色婷婷| 5252色欧美在线男人的天堂| 怡红院一区二区熟女人妻| 亚洲天天精品| 人人色97| 一级aaaaa欧美中文字幕录像片| 美女露胸露屁股| 热99这里有精品综合久久| 日本伦理一区二区| 精品国产无码中文| 日韩78m视频| 午夜福利精品| 97中文字幕一区| 欧美色综合影院| 午夜精品久久久久久久久久久久久| 色婷婷狠狠18禁| 午夜小电影在线插入淫高潮| 免费看污网址| 99色综合| 韩国成人精品久久久免费看| 精品国产久久乱码| 超碰79人人乐| 国产亚洲精品玖玖玖在线观看| 色图四区| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 色眯眯av| 亚洲有码 欧美精品| 在线日韩日本亚洲国产| ...日韩成人一区二区三区字幕| 99这里都是精品| 国产午夜福利专区综合| 亚欧美综合| 激情国产乱伦Av| 亚洲āv网址在线观看| 亚欧美无遮挡| 中文字幕第二页| 麻豆 欧美 日韩| 亚洲国产欧美一区二区潘金莲| yazhououmeizongya| 欧洲精品欧洲精品| 日韩人妻一二三区视频| 78精品| 操操操操操操| 无码精品蜜桃一区二区三区ww| 99999久久精| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 操死我了嗯嗯嗯| 免费精品99| 亚洲人妻在线一区| 亚洲国产天堂| 久久人妻一区二区三区高清| 少妇同性| 欧美在线官网| 欧美日韩岛国大片在线观看| 午夜福利av电影在线| 职场同事知名国产国产精品久久欧美日韩| 中文字幕精品一区二区精品| 欧美婷婷五月天| 欧美人人曰人人操人人射射| 超碰在线91| 亚洲色综网| 精品性爱久久视频| 狠狠色一区二区中文字幕| 口爆综合网| 桃花色涩综合影院| 色五月大香蕉| www.色五月| 殴美综合色88| 国产精品爽爽va在线观看98| 久久久国产av美女私房| 操b在线观看| 亚洲欧美日韩免费观看| 亚洲国产精品无码AV久久| 怡红院成人视频| 蜜臀va69| 精品福利| 天天操夜夜嗨| 亚洲色图20p| 国产乱码久久久| 伊人黄色片| 亚洲欧美日韩夜夜| 啊啊啊啊好疼视频| 一个色导综合| 久都青青视频| 神马麻豆福利院| 26uuu国产免费观看| 国产做?爰片久久毛片?片美国| 精品少妇人妻av久久免费| 强奸乱伦AV一天堂网| 先锋影音av先锋一区| 97人人操人人摸人人爱| 激情丁香婷婷| 国产黄色动态精品| 试看60秒| 粉嫩av平台| 成人无码在线视频网站| 色综合色色| 中文字幕 码 自拍 视频 区| 91女神在线视频| 91久久久老司机| 欧美性爱一区二区三区| 日韩熟女乱伦中出| 六月婷婷综合| 伦理弟一页| 欧美精品庄| 色网在线视频观看免费| 无码免费精品高清| 激情文学网伊人| AV99热18这里只有精品| 超碰午夜| 久久五月份| 日韩BBN| 高清国产无码av| 91狠狠色丁香婷婷综合久久| 91国产在线精品| 欧美色就是色| 国产97色在线| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 国产视频一区二区三区在线免费观看| 9久超碰| 欧美激情专区| 超碰在线观看av不卡| 丰满人妻大屁一区二区| 草b在线 | 91人妻最真实刺激绿帽| 日韩午夜国产| 老熟女搡BBBB搡BBBB视频| 色五月激情综合网| 99999久久精| **一级毛片国产| 久久超碰com| 97 亚洲 日韩 欧美 在线| 9美女超碰在线免费观看| 天天艹天天日| 91黑丝操| 亚洲中文字幕噜噜噜久久久| 激情文学小说一区二区| www.超碰在线| 美女啊啊啊啊pc| 东京热视频网| 久久鲁夜| 九九色精品| 乱伦一二三区| 亚洲图片 欧美电影| 亚洲精品无码成人久久久99| 老色鬼成人精品视频下载大在线观看| 一级性爱aaaa| 久久双插| 亚洲精品国产拍免费91在线| 绑缚麻绳人妻寝取完整版| 国产乱伦性爱区| 国产91美女视频| 亚洲 另类 丝袜 自拍 动漫| 操一区| 青春草莓视频在线观看网址| 久久久熟妇熟女国产| 欧美日韩国产成人高清| 九九九国产精品| 91 丝袜在线| 97精品中文字幕| 99e久久国产精品| 超碰在线免费一区二区三区| 国产后入内射| 嗯嗯啊好大| 日韩AV电影网站| 偷看洗澡一二三区美女| 超碰97人妻免费在线| 日本精品一区二区三| 人妻少妇精品一区二区三区| 国产成人 综合亚洲 天堂| 欧美黑人熟妇精品91| 玖玖大干人妻| 日本一久是| 久久一二三四不卡| 久久久久久夜夜夜夜夜| 国产精品一区av在线| 蜜臀久久99精品久久久久久成人小说| 亚洲第一页欧美| 久久人妻丝袜一区二区三| 97任你吞精| 亚洲Av无码成人精品国产| 男人女人18禁片免费看网站| 国产精品乱码久久| 国产精品直播在线观看直播| 欧美呦呦性爱| www.99色| 熟女色综合久久| 中文字幕免费看大片| 国产偷拍自拍在线视频| 亚洲成人日韩小说| 国产亚洲禁久一区二区 | 亚洲91在线播放影院| 国产精品久久伊人| www.天天干| 大伊香蕉在线视频免费| 色啪网| 99re不伦| 亚洲色欧| 91亚洲情色| 偷偷人人精品女女久久| 国产精品熟女一区二区三区| 五十路六十路七十路熟婆| 天天日天天干天天整| 午夜啪啪片| 丁香六月激情综合| 欧美亚洲国产日本在线,久久精品国产| 97超碰巨乳| 色综合1991| 一本色道无码DVD中文字幕| 国产51色综合久久免费| www.色婷婷色综合| 亚洲一二三精品久久网| 国产精品视频一区二区三区八戒| 日韩操p| 九九热免费国产视频婷婷伊人| 强上我不卡卡| 天天综合网合集91| 不卡av在线中文字幕| 夜夜操91744565| 7月婷婷综合| 伊人久久亚洲色欲综合网站| 国产精品一区二区手机看片| 96久久精品一二三区色欲| 嗯嗯啊操我| 少妇色欲综合网2| 久久av成人无码免费| 东北黄色电影| 97久久久网站| 污啪啪啪视频| 97超碰美女| 黄色高清无码无码破解免费暗网| 亚洲欧洲视频小说在线观看| 熟女精品一区二区在线观看| 中文不卡视频| 五月丁香婷婷色| 久久久久久波多野吉衣高潮| 亚欧无码线免费观看视频| 蜜桃视频精品一区二区| 久久久极品| 330dv亚洲成年视频网| 新婚人妻扶着粗大强行坐下| 久操高青| 久久久久久AⅤ无码免费肉站| 无码丰满熟妇一区二区浪潮AV| 天天综合-91入口| 久热精品在线| 97超碰人操| 蜜臀av网址| 欧美少妇性乱| 伊人成人中文字幕久久网| 亚洲精品无码久久AV| 成人a级高清视频在线观看| 中文字幕乱妇免费视频| 亚州中文字幕超碰97| 骚逼一区二区| 欧美精品第四五页中文字幕在线观看| 久久国产三区| 国产精品熟女AV中文字幕在线播放| 日韩探花精品在线视频| 逼操网站| 日韩精品一区二区日韩| 逼逼逼逼操操操操操操操操操午夜剧场| 欧美激情一区| 91欧洲国产成人久久精品网站| 成人开心网在线视频| 超碰综合97在线| 国产丝袜一区二区三区| 国产欧洲精品亚洲午夜拍精品| 国产风韵犹存熟妇三区| 少妇久久久免费| 国产乱婷婷精品二区三区| 丁香五月天婷婷姐| 男人的天堂激情| 久久av色| 青娱乐手机日韩在线视频| 骚女高跟AV在线| 国产妇女精品视频青青草| 另类专区加勒比| 九九九九九九免费视频| 欧美老妇曰批的视频| 久久毛卡| 国产精品一区av在线| 亚洲国产精品9999在线观看| 人妻9117c| 黑人精品XXX一区一二区| 26UUU欧美激情一区二区| 综合久久久久久久综合网| 日韩人妻 中文字幕| 在线观看综合精品亚洲| 丁香五月婷婷基地| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 男人的天堂 在线一区| 操屄日韩| 五十路六十路七十路熟婆| 免费的很黄很污的全部视频| 国产女人和拘做爰视频| 懂色AV蜜臀无码精品APP| 爱我干综合| 美女露胸露奶头| 亚洲人精品久久久喷水| 熟女一区二区三区| 97综合国产精品高潮久久| 欧美午夜色妇色鬼| 欧洲一区二区三区四区在线观看| 久久久偷拍| 黑人美精品 A片| 岛国成人av在线播放网址| 国产精品久久久亚洲一区| 日韩熟妇二区| 大乔未久88一区| 干B网| 一个国产在线综合网站| A片 AV一级在线播放观看免费| 久久综合九九| 久久久久亚洲精品| 啊啊啊水好多| 91碰超| 欧美熟爽综合| 爱丝福利| 91色图| 丁香五月天堂网| 日韩电影天堂视频一区二区| 青草一区二区| 亚洲一卡2卡3卡4卡乱码网站 | 无码精品久久久久久亚洲| 亚洲一区二区精品福利| 精品无码一二三四区| 久久无码精品| 欧美极度丰满熟妇hd| 国产精品乱码久久久久久久久久久久| #NAME?| TS人妖另类精品视频系列| 五月婷婷六月丁香| 久污| 91精品久久久久五月天精品| 97天天爽| 国产丝袜啪啪| 亚洲色图亚洲无码强奸乱伦| 久久,精品一二三| 欧美综合综合| 自拍偷拍 日韩无码| 丝袜美腿诱惑亚洲欧美视频在线观看| 亚洲综合情色| 人人妻人人爽 97人人看碰人免费公开视频| 国产超碰| 蜜桃色院一区久久| 被窝影院午夜看片无码| 亚洲欧美经典一区二区| 国产97色在线 | 亚洲| 亚洲成人日韩小说| 久久久久久中文版| 亚洲第一男人天堂| 欧美性爱十八禁| 久久国语| 国产精品久久aV| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 中日韩欧美精品无码AⅤ一区二区| 日韩丝袜人妻AV| 人妻少妇精品视频一区二区三区| 国产精品一区av在线| 绯色AV粉色AV蜜臀AV| 蜜臀久久99精品久久久电影| 色婷婷亚洲婷婷| 国产久久天堂资源| 久男人久久| 综合久久久久久久综合网| 天天综合~91入口| 99re这里只有精品9| renqi久久久久久久久久久久| 欧美91精彩| 中日亚韩免费视频| 天天射夜夜| 日日操丁香五月天| 91高清欧美| 五月激情在线| 国产精品一区二区三区四区五区| 九九久久精品| 熟妇女伦乱视频| 天天综合网一91网| av三级电影在线播放| 欧美三级一级| 国产中文字幕在线点播| 久久99草| 国产9 9在线 | 亚洲| 久久国语| 日本网色| 色综合加勒比| 伦在线97| 亚洲AV成人无码一区二区三区在线观看 | 国产亚州日韩欧美看片| 99热一区二区三区四区| 欧美日韩高潮喷水91| 九九AV| 青青草伊人久久| 国产麻豆福利av在线播放| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 久久6热视频免费观看| 天操天操夜操夜月操月年年操操| 浪人综合网| 91综合天天| 亚洲色人妻综合| 精品国产91av一区二区三区| 少妇色欲综合网2| 四虎影库国产精品免费| 欧美性爱91| 暴力av在线| 精品一二三区四视频| 香蕉婷婷| 岛国A V在线免费看| 天天操天天7| 麻豆天美国美国产AV| 91伊人久| 国产综合久| 操b网站亚洲无码| 激情专区综合| 综合亚洲欧美精品日韩?v| 欧亚日韩综合精品国产| 在线国产一区二区av| 欧美日韩亚洲少妇寂寞影院正在播放 | 日本国产二线女色| 四虎影库国产精品免费| 欧美人妻精品一区二区| 天天色欧美| 欧美91久久久久| 高潮内射在线| 999国产精品999| 操日韩第| 97爱爱爱| 亚洲第二页| 九九热九九热| 不卡啪啪视频| 最新岛国大片| 九九九九热| 91制服丝袜| 热热色色综合| 91亚洲影院综合| 日本三级网页| 人人人摸人人| 欧美日韩在线小说| 日韩无码服务区| 久久一二区四| 午夜免费福利视频一区| 人妻精品免费一二三区| 99re视频这里只有精品| 91熟女少妇| 啊啊啊啊啊操我视频| 激情五月综合网| 国产精品熟女丝袜一区二区| 亚洲成a人v欧美综合天堂下载 | juliaann精品熟女一区| 精品人体无圣光凹凸| 秋霞成人做爱| 久久久久久99AV无码免费网站| 99re视频这里只有精品| 久久综合女优| 人人摸人人干| 91天天日| 久久老子无码午夜伦不卡| 国产女人和拘做爰视频| 青娱乐老司机视频| 日本阿v天堂在线观看| 日韩性爱一级片| 亚洲春色欧美| 欧美三四五区| 午夜天堂网| 91精品国产综合久久久蜜臀| 美女刺激久久国产欧美| 国产AV无码AV| 亚欧性爱ab| 另类一区| 女人高潮大叫一级毛片| 久久无码一区二区二三区性色| 欧美性爱第一页久久| 日韩精品字幕| 中字幕人妻一区二区三区| 欧美v亚洲v综合v国产v妖精| 亚洲日韩在线a不卡99精品| 国产粉嫩蜜臀av一区二区三区| 极品出轨视频网站| 日本久久超碰| 欧美精品宗合| 在线毛片片免费观看| 亚洲色婷婷久久91| 无码不卡八戒| 美国人人操人人操| 国产精品毛片?v一区二区三区 | 日韩成人人妻网站| 97精品一区二区视频在线观看| 热G综合热G中文| 日本一区二区中文字幕久久| 国产黄色剧情影片麻豆免费播放| 国产精品久久久久久亚洲色欲| 久久专区| 免费?级毛片无码?∨蜜芽试看| 亚洲精品三区在线观看| 美国aaaaa一级黄片| 婷婷五月天小说| 狠狠色综合网| 91 丝袜在线| 嫖老熟女A片一二三区| 一区二区三区机械有限公司| 国产精品天美传媒| 黄呦呦在线| 一区二区三区一亚洲中文字幕、综合区灬 | 五十路三级片| 婷婷去俺也去六月色| 人人弄人人摸| 久久av成人无码免费| www.色操逼| 日韩美脚一区二区网站| 无码视频一区二区| 国产中文字幕在线观看| 国产精品一区二区三| 无码久久亚洲高清,| 日韩簧片免费看| 国产 日韩 另类 视频一区爱| 亚洲丝袜二区| 丁香婷婷激情五月天无毒不卡| 少妇内射www在线观看视频 | 欧美日韩国产色图在线| 久久久夜夜嗨免费视频| 91黑丝少妇| 狠狠干妹子| 1769成人国产精品视频| 亚洲成人久久美女| 亚洲 图片 欧美 色图| 后入式福利| 操久久久久| 一级久久久久久久久久久| 99热只有这里有精品| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 免费在线黄片视频| 精品女人999| 美女让帅哥通她小鸡鸡| 91亚洲高清| 久久久成人国产精品无码| 天天干2区3区| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 91oumei| 91美女視頻| 日韩一区二区精彩视频| 狠狠狠狠狠干| 亚洲无限观看| 久热最新在线杭州| 日韩熟女操逼| 99热精品在线| 曰本特级特黄特色黄色A级网站高清在线免费看 | 俺去俺来也在线www| 国产超碰在线| 美女91av| 欧美aa一级片| 99.色网| 亚洲 日本 不卡| 日韩不卡在线一区二区| 五月天开心网| 中文字幕精品三级久久久| a一区二区三区乱码在线| 综合色色婷婷| 亚洲综合大片| 大香蕉久久| 激情深爱五月天| 色综九九九一区| 99久久久er直播网址| 人妻内射一区二区在线视频| 97干97色| 五月婷婷综合网| 美女91网址 | 色诱中文字幕| 日本一级特级毛片视频| 精品精品精品| 大色综合| 中文字幕精品资源在线| 碰超人人在线一区二区三区| 无码操逼视频一下| 狠狠五月天| 综合网91| 91狠婷| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 超碰色老头| 99热精品在线观看| 国产精品乱码久久久、久久| 亚洲操逼视频网站| WWW美腿丝袜香蕉中文| 奇米狠999| 日韩超碰精品综合| 欧美一区二区| 91色综| 又大又大又大又粗爽高潮观看| av天天在线观看| 91欧美另类| 唐山老熟妇露脸啪啪叫| 色五月AV在线| 青娱乐日韩无码| 99r九九| 九九热久久99精品re| 婷婷精品国产一区二区三区日韩| 国产又黄又爽又刺激久久久久久| 久久久久久久久久久久黄色| 国产久久av| 天天综合网亚洲综合网| 亚洲天堂热| 香蕉人欧美综合| www.夜夜| 男女激烈网站最新| 四虎在线观看网站| 久久艹逼视频| 婷婷人妻激情| 九九玖玖精品| 国产精品熟女九色九色蜜臀| 99精品久久久久久| av资源在线播放天堂| 欧美丝袜亚洲| 久久色人体| 18禁止看精品中文字幕| 涩涩久久精品| 大香蕉综合| 国产精品久久久啊| 日本欧美m v精品网站加| 人妻99p| 91日韩国产欧美亚洲另类精盘州至城都| 超碰人人超在线观看| 免费视频一二三区| 日本 免费 一区二区三区 久久香蕉 | 操美女人妻| 一区二区三区 日韩欧美| 美女淫穴| 免费看欧美美女黄色大片| 久久啊啊| laoshunv91| 超碰人人在线| 粉嫩AV一区二区夜夜| 人妻插插人妻人| 国产精品爽爽va在线观看98| 99国产在线绯色一区| 精品久久視頻在线| 国产强奸无码乱伦| 另类 综合 日韩 欧美 亚洲| 丁香色色网| 综合久久久久久久久91| 国语精品av| 亚洲综合射| 又大又白奶子| 99久久精品无码一区二区| 天天亚洲| 欧美人妻另类在线| 啊啊啊啊啊啊啊国| 亚洲色图欧美色图制服诱惑| 欧美爱国产综合、| 久久超碰、| 亚洲操人| 亚欧Av| 91免费看一区二区三区| 97超碰超| 欧美,日韩,中文,另类| 精品国产99| 欧美嗯啊……在线观看视频免费| 午夜福利成人免费视频| 日韩免费簧片| 91天天看| 欧洲亚洲人妻无码中字久久三区四区| 中文字幕精品一区二区精品| 日韩av在线播放不卡| 操www| 国产v片在线免费观看| 日韩射精| 国产AV天美传媒一区二区三区 | 欧美人人AAA| 国产成年免费大片黄在线观看| 日本人妻最新在线中| 精品女同一区二区三区| 亚洲影视第一页| 操人妻丝袜高跟| 怡红院视频在线| 欧美淫穴| 91狠狠色丁香婷婷综合久久| 激情五月丁香五月| 日欧操屄视频| 丝袜美腿制服人妻二区中文字幕| 欧美日韩电影成人在线| 在线无码视频| 亚洲AV成人精品网站在AV| 色在线视频导航| 国产91亚洲精品一区二区三区| 久久啊啊啊| 又粗又长又大国产不卡| 国产偷人伦激情在线观看| 亚洲影视综合| 国内外毛片在线观看| 啊啊啊啊啊啊啊在线| 久久久久久免费电影| 97亚洲自在精品在线观看| 夜夜免费视频| 国产97综合| 91挑色欧美| 久日综合网| 久久久久久九九九九九九| 国产精品午夜福利视频| 色婷婷一区二区三区久久午夜成人不| 亚洲色综网| 午夜操一视频一区| 国产精品欧美在线观看 | 91中出在线| 日韩情色一区二区| 91综合色噜噜| 国产一区二区三区高清视频| 性videos欧美熟妇hdx| 日韩无码a片| 中文字幕亚韩| 国产精品麻豆成人AV艾秋| WWW4虎| 精品国产91久久久久久一区黄无| 天天影视射综合网| 久久精品国产97欧美精品亚洲| 超碰这里有精品| 亚洲开心网| 国产亚洲精品无码三区| 久久国产性爱| 国产免费一区二区在线A片视频| 久久这里都是精品| 亚洲瓯美色图| 人人妻人人色一区二区三区| 国产97亚洲| 亚洲精品自拍| 欧美一区二区三区日韩| 久久国产99精品72福利| 玖玖综合色| 蜜臀久久精品久久久久视频| 欧美色图99| 秋霞色色影院| 亚洲欧洲国产综合av| 精品人妻1237|