免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(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ò)來(lái)的關(guān)鍵——它可以讓一個(gè)方塊擁有自己的數(shù)據(jù)、自己的狀態(tài)、自己的運(yùn)行邏輯。我用“反應(yīng)器”這個(gè)名字來(lái)作為載體是因?yàn)檫@類“機(jī)器型方塊”幾乎包含了一個(gè)TileEntity能遇到的所有問(wèn)題內(nèi)部要存物品輸入槽、輸出槽、燃料槽要有處理進(jìn)度要和服務(wù)端邏輯配合還要把進(jìn)度同步到客戶端讓玩家在界面上看到進(jìn)度條在動(dòng)。能把反應(yīng)器做出來(lái)就等于掌握了模組開發(fā)里最常用的一類方塊實(shí)體。這篇文章會(huì)從需求拆解開始把注冊(cè)、NBT存儲(chǔ)、服務(wù)端tick邏輯、數(shù)據(jù)同步、渲染方案全部過(guò)一遍最后一節(jié)是我實(shí)際踩過(guò)的一些坑照著做就能繞開。1. 先用需求倒推反應(yīng)器的核心難點(diǎn)其實(shí)只有三點(diǎn)1.1 為什么必須引入TileEntityBlockState搞不定的三件事先回答一個(gè)很多人剛接觸時(shí)都會(huì)問(wèn)的問(wèn)題做個(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ī)刻用來(lái)跑“每200tick燒一次燃料”這種流程別說(shuō)手感不對(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)臟來(lá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ā)懵問(wèn)題不大接下來(lái)每一個(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í)體出來(lái)再綁定到那個(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不要用中文也不要太長(zhǎng)。它會(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)寫過(guò)這里就不重復(fù)貼代碼了只強(qiáng)調(diào)幾個(gè)和TileEntity相關(guān)的連帶改動(dòng)。第一如果你用了物品欄里的方塊物品要確保在客戶端注冊(cè)對(duì)應(yīng)的Item模型否則放置后模型可能變紫黑色。這屬于老生常談但在加了TileEntity之后容易忘。第二方塊被破壞時(shí)TileEntity里的物品不會(huì)自動(dòng)掉出來(lái)。你必須在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來(lái)表示空槽位判斷方法就是isEmpty()。還有一個(gè)偏門但很重要的方法叫eventReceived它和Block與TileEntity之間的客戶端事件通信有關(guān)。比如你想在客戶端播放音效、粒子效果時(shí)可以通過(guò)world.addBlockEvent觸發(fā)最終會(huì)調(diào)用到這個(gè)方法并轉(zhuǎn)發(fā)給TileEntity的receiveClientEvent。1.12.2里很多機(jī)器型方塊會(huì)重寫它來(lái)實(shí)現(xiàn)“敲一下發(fā)個(gè)信號(hào)”的交互反應(yīng)器這版先不涉及但你要知道有這個(gè)東西存在。3. 核心實(shí)現(xiàn)讓TileEntity自己動(dòng)起來(lái)的完整代碼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接口要求按槽位索引訪問(wèn)一個(gè)數(shù)組能讓你寫循環(huán)遍歷、判斷空槽位、實(shí)現(xiàn)自動(dòng)注入邏輯時(shí)都方便很多后續(xù)做漏斗交互、管道連接時(shí)優(yōu)勢(shì)更明顯。數(shù)組長(zhǎng)度為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可以避免很多空指針問(wèn)題這個(gè)習(xí)慣從第一天寫TileEntity就要養(yǎng)成。3.2 核心update與配方判斷服務(wù)端主循環(huán)的寫法update方法是整個(gè)TileEntity的心臟也是最容易寫出性能問(wèn)題的地方。第一行永遠(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)來(lái) 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(); }這里簡(jiǎn)化了“什么能當(dāng)燃料、什么能當(dāng)原料”的判定。實(shí)際項(xiàng)目里我會(huì)建議單獨(dú)寫一個(gè)方法比如isFuel(ItemStack)來(lái)判斷物品是否屬于燃料列表而原料則對(duì)應(yīng)一套配方表。配方表可以用MapItemStack, ItemStack或者更工程化的Recipe對(duì)象來(lái)實(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; }看起來(lái)啰嗦但它能保證任何情況下槽位都不會(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)化管道都通過(guò)IInventory來(lái)讀取和寫入物品。你只要實(shí)現(xiàn)這個(gè)接口反應(yīng)器天然就能被原版漏斗自動(dòng)供料這個(gè)效果會(huì)讓人非常有成就感。IInventory在1.12.2里有一堆方法除了必須返回?cái)?shù)組長(zhǎng)度、判斷空、獲取槽位物品之外還有decrStackSize、setInventorySlotContents、markDirty、isUsableByPlayer等。寫的時(shí)候我沒必要全貼但有兩個(gè)方法值得單獨(dú)說(shuō)。第一個(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通過(guò)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ù)然后通過(guò)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)起來(lái)的標(biāo)準(zhǔn)做法三次強(qiáng)調(diào)nottifyBlockUpdate進(jìn)度條動(dòng)不起來(lái)或者整個(gè)工作方的模型不隨狀態(tài)切換改變通常都是同一個(gè)原因服務(wù)端改了數(shù)據(jù)但沒通知客戶端。我處理這類問(wèn)題有個(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讀取回來(lái)。三件事配合才是一條完整的數(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)來(lái)定義比如燃料槽和原料槽都不為空或者progress 0。我建議用progress 0這個(gè)判定因?yàn)樗鎸?shí)地反映了“正在處理進(jìn)度中”的語(yǔ)義。然后你需要給這個(gè)方塊準(zhǔn)備兩個(gè)JSON模型文件分別對(duì)應(yīng)workingtrue和workingfalse。通過(guò)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)度條長(zhǎng)度平滑增長(zhǎng)就無(wú)能為力。如果你的反應(yīng)器外觀想展示一個(gè)“進(jìn)度條逐步填滿”的視覺效果那就得上方案二。5.2 方案二TileEntitySpecialRenderer做自定義渲染TESR的思路是完全繞過(guò)普通方塊模型由自己寫OpenGL調(diào)用邏輯來(lái)渲染TileEntity的形狀和動(dòng)態(tài)效果。1.12.2里有TileEntitySpecialRenderer 這個(gè)抽象類你重寫render方法綁定自己加載的模型然后根據(jù)TileEntity的progress字段來(lái)計(jì)算旋轉(zhuǎn)角度、位移、亮度、粒子效果等。TESR能做真正的平滑動(dòng)畫這是它比getActualState強(qiáng)的地方。但代價(jià)也很明顯每幀每個(gè)TileEntity都要調(diào)用你的render方法如果你不做優(yōu)化成千上萬(wàn)個(gè)機(jī)器同時(shí)在工作會(huì)直接把幀率拉垮。如果你決定用TESR我的建議是優(yōu)先嘗試FastTESR。FastTESR會(huì)跳過(guò)一些常規(guī)的渲染狀態(tài)準(zhǔn)備性能更好代價(jià)是你不能使用大部分原版渲染輔助方法而且要自己管理OpenGL狀態(tài)。新手不推薦一上來(lá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. 排查記錄我在這套代碼上踩過(guò)的坑6.1 六個(gè)常見問(wèn)題速查表這幾個(gè)問(wèn)題基本上每個(gè)做TileEntity的新手都會(huì)遇上我把它們整理出來(lái)遇到相同現(xiàn)象直接對(duì)著查。問(wèn)題現(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)看不出來(lái)getActualState的working屬性沒監(jiān)聽TileEntity狀態(tài)在getActualState里查詢shape并確保update里調(diào)用了notifyBlockUpdate漏斗能輸出但不能輸入isItemValidForSlot判斷過(guò)嚴(yán)檢查槽位索引和物品判斷邏輯是否合理6.2 幾個(gè)讓代碼更穩(wěn)的長(zhǎng)期習(xí)慣做TileEntity開發(fā)時(shí)間久了我總結(jié)出幾條保命經(jīng)驗(yàn)。第一所有持久化字段集中管理不要散落在類的各個(gè)角落。我見過(guò)很多項(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里用了客戶端同步過(guò)來(lái)的progress做判定那服務(wù)端也會(huì)跟著出問(wèn)題。唯一的原則就是業(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增長(zhǎng)不需要實(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ì)變的問(wèn)題了。最自然的幾個(gè)方向我在文章里也提過(guò)第一加入GUI和Container讓玩家能手動(dòng)放置和取出物品第二加入真正的配方系統(tǒng)用Map或者JSON配置文件來(lái)定義“什么燃料燒什么材料”再和合成表對(duì)應(yīng)起來(lái)第三加入紅石控制比如用IBlockState里的powered屬性讓反應(yīng)器在收到紅石信號(hào)時(shí)才工作第四加入多方塊結(jié)構(gòu)讓反應(yīng)器需要一個(gè)外殼或配套方塊才能運(yùn)行這就接近一些大型模組的機(jī)器體系了。我個(gè)人的建議是先把無(wú)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小视频网站| 六月丁香婷婷色综合| 六月丁香啪| 亚洲另类在线观看| 97婷婷丁香| 色婷婷色五月丁香| 少妇激情五月婷婷| www.99热日韩.com| 久久ww| Av中文在线| 五月丁香免费看| 色噜噜婷婷| 色婷婷久久综合久色| 色开心五月丁香| 国产精品18久久久| 91超级碰| 男妓跪趴把舌头伸进我的嘴巴| 婷婷丁香六月| 天天草天天爽| 七七九色| 91色噜噜狠狠狠狠色综合| 丁香婷婷五月天色播| 久久久久99精品成人网站| 免费视频在线观看的网站| 色五月超碰| 夜夜骑天天玩天天日| 无码一区二区日韩| 97色色色色色色色色色色色色色| 狠狠干五月丁香| 色色五月天激情| 五月婷婷久久久久| 日本丁香久在线| 玖玖婷婷免费| 久久色午夜在线导航| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 免费在线观看AV网站| 欧美色五月| 99re在线精品视频| 久久曰曰| 五月丁香A片| 无码免费人妻A片AAA毛片西瓜| 五月丁香综合激情| 五月激情综合网| 九九精品免费| 免费看成人AA片无码视频吃奶| 色五月婷婷五月| www.激情| 97丨九色丨国产丨PORNY| 91超级碰| 婷婷亚州综合| 夜夜大香蕉婷婷丁香| 午夜丁香 婷婷| 伊综合蕉| 91丨九色丨高潮丰满日本| www91在线| 操九色| 九色91美女| 99在线热| 伊人午夜综合色啪| 九九婷婷综合| 久久AAAA片一区二区| 91精品激情9| 免费无码毛片一区二区A片| 无码激情AAAAA片-区区| 色五月偷偷| 成人五月丁香社区| 操操操操操电影网| 五月婷婷六月丁香综合| 伊人久久大香线蕉精品| 91精品人妻少妇无码影院| 97人人做| 狠狠色婷婷六月激情网| 狠狠xx| 日日操夜夜操无码免费| 久99久视频精品| 色和综合网| 第四色色六月色综合| 久久丁香婷婷色情综合| www,8050,午夜三级| 婷婷五月天伊人在线| 成人片久久网站| 噜噜噜精品欧美成人在线观看| 噜噜狠狠色综无码久久合欧美| 中文字幕综合网| 午夜丁香婷婷| 五月婷婷黄色毛片| 六月丁香婷婷天堂| 色婷婷小说| 人妻熟人中文字幕一区二区| 伊人色综合影院视频| 天天开心天天色| 深爱丁香激情| 激情五月天婷婷五月天| 免费国产视频| 五月婷亚洲精品| 久99久视频| 国产午夜成人免费看片无遮挡| 婷婷伊人视婷婷婷| 色婷婷激情视频| 思思99久久| 国产亚洲精品久久久久苍井松| 婷婷综合九月| 五月天久久网站| 99久热在线精品| 香蕉婷婷五月| 婷婷六月丁香1| 婷婷丁香五月激情| 96色婷婷| 99热免费看| 色香蕉影院| 婷婷五月18永久免费网站| www.激情.com.| 日日爽夜夜爽| 91岛国片| 9久热在线视频精品| 激情5月婷婷| 五月婷婷影| 色 五月俺去也| 婷婷久久99| 成人五月天。COM| 婷婷六月丁香在线| 丁香五月激情啪啪| 激情六月下句是什么| 婷婷色六月| 超碰成人公开| 丁香五月婷婷激情视频播放| 四季8848精品成人免费网站| 熟女五月天久久综合| 婷婷综合久久| 久月丁香爱婷婷综合| 99人碰碰碰| 玖玖综合玖玖| 九九热在线视频| 日本一区二区三区精品视频| 五月丁香六月婷婷亚洲综合| 色综合久久88色综合天天| 在线五月色播| 婷婷色五月91啪啪| 色99欧洲色19| 欧美色偷拍| 深夜A片| 国产成人综合亚洲| 久久婷婷六月综合| 色婷婷综合综合网| 99久久久久| 免费九九热| 五月婷婷色情| ji'qing'luan'ren'lun| 日韩三级高清无码| 色婷久| 97丁香五月| 色五月婷婷小说亚洲中文字幕组| 婷婷五月色综合| 亚洲综合在线播放| 丁香女人五月天| 操99| 深爱激情网五月天| 色综合大香蕉| 嫩草AV久久伊人妇女超级A| 日日骑夜夜撸| ai97re99一本| 九九这里是免费的视频5| 操久久精| 欧美99| 亚洲色欲欧美一区二区三区| 超碰A V在线| 五月丁香六月婷婷姐| 色色色婷| 亚洲精品又粗又大又爽A片 | 日本丁香五月| WWW色五月天| 强壮公让我夜夜高潮A片视频| 天天射天天射一道本日本社区 | 碰碰碰91| 午夜天堂啪啪| 久久538| 天堂中文国产| 色婷婷激情Av久久久| 丁香六月亭亭久久综合| www.色五月| 99国产精品白浆在线观看免费 | 五月丁香啪| 婷婷丁香亚洲五月天| 91jiuseshunv| 99热在线观看| 婷婷综合五月天| 婷婷丁香五月天哟啪| 99精品视频在线观看| 人人爽欧美婷婷久久久五月丁香 | 色香欲综合| 亚洲丁香五月深爱五月| 九九色大香蕉| 级人人91| www.色五月| 丁香五月婷婷激情中文| 日韩人妻无码一区二区| 九九干视频| 777精品久无码人妻蜜桃| 桔色成人在线| 天天天天天操| 丁香色五月 97干| 国自产拍偷拍精品啪啪一区二区| 影音先锋色婷婷| xxx综合在线| 激情综合国产| 日日噜噜久久婷婷五月天| 日本高清久久| 久久婷婷色综合| 狠狠操天天日| 色色色色色色色综合| 五月激情综合性爱| 婷婷成人av| 99热这里只有精品9| 人人干人人操人人摸| 噜综合| 伊人五月天久久| 中字幕视频在线永久在线观看免费| 狠狠干夜夜干| 丁香五月Av| 天天免费成年人视频| 51XX嘿嘿午夜无码| 中文字幕欧美精品久久| 日本成人内射| 欧美日本国产| 91人人爱| 中文字幕人妻一区二区| 色婷婷伊人激情在线观看| 丁香色五月 97干| 噜噜色噜噜网| 色99在线观看| 丁香在线视频| 激情久久丁香| 久久Xx| 欧美日韩一区二区三区四区| 婷婷色五月天在线观看| 日本色视| 久9热视频| 天天日日夜夜爽。| 五月丁香婷婷AV| 综合五月激情网| 丁香六月亚洲| 色婷婷五月天成人网| 26uuu欧美日韩| 久久精品99久久| 99小视频在线观看| 激情图片婷婷| 五月天激情国产综合婷婷婷就去爱| 日韩人妻无码精品| 大功率国产在线| 亚洲婷婷视频| 婷婷的五月天另类视频| 丁香五月婷婷成人网| 婷婷五月天影视| 婷婷久久五月天亚洲欧美国产日韩在线观看 | 99久久九九| 日韩成人综合网| 丁香桃色网| 嫩草AV久久伊人妇女超级A| 中文字幕综合网| 伊人婷婷大香蕉| 非洲一级AV| 大香蕉五月天婷婷丁香91| 九九热99在线视频| 99re视频在线播放| 成人婷婷深爱综合网| 先锋男人99资源| 伊人日日干| 天天添天天摸天天天天做| 丁香五月婷婷亚洲综合精品在线| 色五月丁香网| 久久激情五月婷婷| 亞洲自怕| 九九综合九九| 思思久久96热在精品国产,| 四色 爱 婷婷 精品 亚洲 五月天| 色日本丁香婷婷| 逼逼AV| 久久开心五月婷婷| 玖玖色综合网| 丁香六月婷婷操逼网| 色吊操色妞| 亚洲秘 无码一区二区三区妃光/1| 久久 无毛。| 亚洲啪啪啪啪| 99热这里只有精品 搜| 天天做天天爱天天综合网| www.99热这里精品| 国产乱人偷精品人妻A片| 六月婷综合| 久热re在线视频| 婷婷五月天小说网| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | www久| 丁香六月综合激情| 日本操片| 超碰人人99| 久久五月丁香婷婷| 色无码| 97久久久| 91精品人妻少妇无码影院| 色五月激情问网站| 国产精品视频| 4399精品一区二区| 狠狠操之狠狠操| 亚艹艹| 51国精产品自偷自偷综合 | 精品99这里有| 七七色色综合| 91综合网| 丁香婷婷五月综合影院| 免费观看的av| 五月亭亭开心网| 偷拍九九热| 丁香婷婷久久| 99在线精品视频| 中文字幕日产A片在线看| 亚洲无码激情| 深爱激情网五月天| 中文成人在线| 青青草搞屄视频网站| 色婷婷色99国产综合精品| 五月婷视频| www.jiujiujiu| 五月天色婷婷网| 五月激情综合网| 欧美人人操| 五月激情六月宗合| 丁香五月婷婷av影院| 婷婷色五月激情| 婷婷香五月天| 97sese婷婷| 天天干天天 亚洲| 先锋男人99资源| 九九热av| 久久精典| 久久婷色| 九九99精品| 热99精品视频五月| 91婷婷搞| a在线观看| 超碰人人操| 五月婷婷综合久久| 99在线爽| 操逼巨乳91| 丁香五月婷综合| 狠狠色狠狠色综合日日91| 五月丁香婷婷成人网| 丁香五月先锋| 激情综合网五月丁香| 激情久久 婷婷| VfJxEwPH| 高清国产AV| 色色网站免费| 婷婷五月综合色拍| 亚洲中文字幕av| 丁香婷婷黄网站| 97精品欧美91久久久久久久| 大香蕉婷婷色| 大香蕉九九| 综合婷婷六月| 久久99久久99久久99| 五月丁香六月婷婷手机无线| 综合激情四射一theav| 色婷婷五月天视频在线| 丁香五月婷婷Av| 久久伦乱| 久久这里在精品视频| 婷婷五月天AV| 69色色视频| 色很久综合| 涩婷婷五月天在线精品视频| 成人精品在线观看| 婷婷.com| 丁香色综合| 人妻中文在线| 久久婷婷五月综合色欧美| 色综合综合网| 九色PORNY自拍成人精彩视频| 色吧五月婷婷| 深爱五月天 开心网| 操操综合网婷婷| 婷婷五月色天| 开心久久xxx色| 九九九激情综合| 婷婷色爱| 久久婷婷五月天懂色| 五月婷婷丁香六月| www.婷婷五月| 中文人妻主播久久| 九月婷婷综合网| 中文字幕永久在线| 5月婷婷激情网| 久Se视频在线观看| 91操人人操| 五月天色丁香| 日韩激情婷婷五月天| 五月天另类小说久久小说网| 在线不卡视频| 色丁香影院| 五月婷在线| 日韩综合成人| 99热亚洲精品| 亚洲色网址| 丁香无五月网| 涩九九九九| 色婷婷丁香五月| 精品久久久人妻| 五月丁香美女视频| 99人人干人人| 丁香亚洲色综合| 99热精品中文字幕| 精品99在线| 草婷婷在线| 五月婷婷人人人操| 日本少妇AA一级特黄大片| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 婷婷D区| 99在线资源| 婷婷玉月丁香五月在线视频| 色色色色色热| 色吧五月婷婷| 色色五月激情| 婷婷黄色网| 一起草AV| 人人播| 亚洲人成色A777777在线观看| 五月伊人视频在线看| 伊人婷婷大香蕉| 99久久終合| 天天色情站| 婷香五月| 天天射美女| 成人五月天视频| 婷婷五月永远18免费久久久| 亚洲AV永久无码影院黑人| 色色色色色色色色五月先| 呦呦v线| 激情文学久久| 色噜噜狠狠色综合网| 九月丁香网婷婷| 超碰成人免费| 欧美精品999| 9久久久久| 一起草性爱不卡视频| 欧美天天干五月丁香| 丁香婷婷啪啪| 色综合激情| 久久久久久99精品无码| 香蕉大综综综合久久| 久热精彩视频98| 国产亚洲精品久久久久久久久动漫 | 色级停停| 99久久超级| 国产精品久久久久久久久久久久 | 狠狠色综合777| 婷婷四月 成人 狠狠干| 久久黄色网扯| 五月综合777| 五月天婷婷在看| 婷婷久久欧美| 天天婷婷天天| 亚洲色色色色| 九九热99热| 综合激情站| 五月天婷婷激情综合| 国产色色色色| 婷婷六月综合基地| 午夜免费试看| 99热精品免费| 看久久性爱视频| 五月丁六月香| 久综合| 丁香婷婷六月天| 三级黄网站| 激情伊人五月天| 亚洲九区| www.99riav99| 五月天婷婷綜合院| 天天日夜夜高潮| 五月天婷婷久色| 久久这里只有精品16| 天堂AV在线看| 久久久久亚洲AV无码网影音先锋| 五月丁香啪啪综合| 九九操屄| 五月 成人 婷婷| 丁香久久| 婷婷丁香五月综合激情小说| 激情丁香社区| 五月Huangsewang| 99久久終合| 欧美丁香五月97色| 婷婷五月天激情亚洲小说| 日本五月天一页| 91人人网| 婷婷五月丁香综合网| 四射综合网| 婷婷99| 噜噜噜色噜噜| 在线中文字幕视频| 色欲AVV| 久久9精品视频| 六月婷婷狠狠| 日本色爽| 9精品久久999| 97碰碰人人| 色情五月天首页| 五月花免费视频| 性爱网五月天| 亚洲一区二区色图-亚洲精品国产精品乱码-成人AV | AⅤ在线播放网| 五月丁香操婷逼| 五月天成人网婷婷| 99ri国产在线| 亚洲图片 丁香婷婷| 五月丁香色色网| 综合色综合| AAA久久久| 专区无日本视频高清8| 婷婷五月天网址| 97久久香草精品视频| 天天人人人人人人人人人人人| 亚洲天堂久久| 亚洲区视频| 色六月视频| 色欲天天综合网| 五月天成人网在线观看| 亚洲精品久久久久AV无码| 午夜丁香 婷婷| 涩涩涩婷婷| 色色丁香婷婷| 免费AV在线| 99色热综合| 五月天激情国产综合婷婷| 六月婷婷日| 久久久er热| 日良久久| 色综合视频| 激情开心五月亚洲| 香蕉久久国产AV一区二区| 欧美性久| 丁香五月色| 9视频在线成人网站| 综合五月丁香久久| 亚洲热视频在线| 亚洲色综久久五月| 天天操婷婷| 99欧美热| 五月精品免费XXX| 九九热精品在线| 丁香花五月天激情| 五月天成人综合| 涩玖玖免费视频| 中国激情网| 变态 另类 在线 | 男人天堂AV在线一区二区| 99色播| 啪啪啪综合网| 狠狠va| 五月婷婷六月色| 婷婷五月丁香av网站| 黄网在线播放| 激情五月天婷婷直播| 久久98热re| 操97免费超级视频| 色婷网| 五月丁香婷婷综合| 天天操夜夜操| 五月激情开心婷婷| 婷婷五月丁香青青草在线| 五月色欧美| 成人在线观看精品| 色J香五月天| 亚洲另类AV| 九九无码| 9.1综合网| 99在线精品视频| 色婷婷伦理| 欧美日韩成人综合9| 丁香五月天在线| www.色情五月天.com| 婷婷成人视频| 操操啪| 六月色婷婷| www激情网| 久久久久九九九九视屏小说88| 日韩视频99| www.久久爱.com| 99精品视频网站| 亚洲俩性性爱图片久久第六页| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 色色 亚洲| 一区二区乱码视频| 香蕉AV福利精品导航| 日本九九热| 9999三级片| 亚洲另类婷婷五月丁香在线播放| 天堂在线观看视频| 丁香九月婷婷综合| 久久精品小视频| 大香蕉娱乐| 久久九九热视频| 99热这里精| 亚洲有码在线视频| 天天日天天插| 六月丁香五月婷婷| 五月色婷婷影视在线电影| 激情国产五月| 亚洲国产成人在线| 婷婷激情欧美| 在线成人网站| WWW色色色COM| 色色国产| 五月激情天| 天天摸天天爽| 色色五月婷婷久久| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 人人舔人人色人人高潮| 五月天久久网站| 天天日夜夜爽| 丁香狠狠色婷婷| 6080av| www.精品99| 大香蕉在线99热| 狠狠色婷婷777| 久久综合激情婷婷激情| 色七色九九| 精品人妻在线| 色情网综合| 99碰碰| 久久婷网| 日韩视频99| 国产欧美日韩一区二区三区| 狼人久草| 色五月色图| 久久综合站| 婷婷五月天激情小说| 五月天丁香成人| 我要看激情五月天| 婷婷五月天伦理| AV九九| 五月丁香激情综合六月涩涩爱| 色五月婷婷7777| 99久久网站| 五月激情综合网| 久久99热在线观看| 日日夜夜爽| 深爱五月中文字幕| WWW丁香五月| 五月丁香综合啪啪| 五月婷婷六月色| 玖玖综合色| 丁香五月婷婷大香蕉| 婷婷色情五月| 五月天伊人手机在线播放AV| 五月婷婷色丁香| 色很很96| 丁香五月自拍| 久久这里只有精彩| 激情五月婷黄版| 五月天婷婷影院| 99九无网码| 2016日日夜夜操| 9999综合99综合人| 五月天大香蕉AV| 亚洲AV永久无码影院黑人| av首页在线| 丁香啪啪中文字幕| 日韩操啪| 六月婷婷九月丁香| 激情六月婷婷| 丁香五月天导航| 亚洲成人在线播放| 国庆精品久久| 啪啪五月天啪啪| 99在线视频在线观看| 我爱va亚洲va52| 天天天天天天天操| 日韩99色99| 色婷婷狠狠| 五月丁香激情综合啪啪| 五月婷婷色情| 狠狠综合| 色情网综合| 激情久久婷婷| 色色色国产| 91狠狠综合久久久久久| 五月激情另类| 99热精品在线免费观看| 天天射影院| 97久久久| 色五月激情五月| 亚洲AV成人精品网站在线播放| 久久激情婷婷| 五月丁香六月婷| 五月亭亭六月色| 激情综合网亚洲色图| 五月丁香在线看| 日本色99| 性av| 亚洲AV无码一区二| 秋霞黄色一级久久| 欧美成人精品老美女噜噜噜| 综合99久久| 五月香婷婷| 色都都狠狠色都都色综合色| 96丁香六月婷婷蜜桃综合久久| 日本丁香五月婷婷| 青草五月天| 久久精品人妻| 任我肏视频精品| 成人网址在线观看| 色操b| 久久99婷婷| 国产av一区二区三区| 五月丁香九九| 丁香五月骚喷水视频| 五月婷婷丁香六月| 三十熟女| 激情四射五月天| 日本人妻久久| 思思99精品视频在线观看| 激情五月天开心总和网| 成人午夜无码视频| 丁香五月综合久久综合| 丁香婷婷人妻综合网| 色综合另类| 欧亚成人A片一区二区| 久色激情| 色永久| 婷婷大香蕉| 九九亚洲无码| 99色最新在线视频网站| 激情五月激情综合网| 国产小网站| 激情五月亚洲综合网| 午夜免费试看| 狠狠爱婷婷色| 亚洲五月情| 色九月婷婷| 日韩高清成人| 五月丁香六月在线| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 丁香五月色情| 国产婷婷综合在线免费视频| 久久丁香婷| 色婷婷丁香五月高清在线| 色婷婷免费视频| 久久99jiu9| 欧美性爱5月天天天看| 日韩成人网址| 亚洲激情网| 色五月大| 五月婷婷九九久久| 色色综合色| 九九九九精品精| 婷婷丁香五月天色播网站| 欧美久久婷婷| 精品成人在线观看| 久久99大全| 久久婷婷东京热大香樵| 开心五月天激情网站| 婷婷色影音天| 伊人婷婷五月| 亚洲蜜桃精久久久久久久久久久久| 操操啪| 色色综合网站| 久热婷婷| 九九热99热| www.激情| 五月婷婷影院| 天天做综合| 免费AV播放| 亚州激情网| 大香蕉五月天婷婷| 丁香五月天色综合| 国产做爰视频免费播放| 停停色综合伊人| 国产精品VIDEOSSEX久久发布| 激情小说五月丁香在线视频观看视频| 狠狠插狠狠插| 热热久久精品视频| 98国产精品综合一区二区三区| 日韩五月天婷婷| 九八Av| 婷婷精品性性性性性性性| 婷婷99狠| 五月丁香六月激情综合| 97干免费视频| 激情六月婷婷| 秋霞簧片| 综合 蜜月 婷婷| 五月激情天| 婷婷五月丁香久久| 99人人干| 婷婷五月天a| 久久婷婷色综合老司机| 五月综合丁香婷婷| 婷婷五月天堂网| 熟女人妻一区二区三区免费看| 热久久国产视频| 天天艹| 五月久久婷婷| 免费精品66| 五月丁香综缴情性爱| 亚洲丁香婷婷丁香五月天激情| 91九色国产在线| 色色色欧美| 天天干天天爽天天操| 大香AV| 婷婷五月天福利| 玖玖福利视频资源| 丁香婷婷色情| 国产精品电影| 777色色色| 丁香六月激情综合| 五月婷A V在线| 丁香综合婷婷五月天| 色婷婷手机在线| 激情久久伊人| 久久 婷婷 五月天| 提提热五月天婷婷| 丁香五月综合激情性爱| 久久99热这里只频精品6学生| www.成人婷婷综合| 婷婷五月深情丁香深爱日韩| 丁香五月天91| AV电影在线播放| 丁香五月亚洲综合| 丁香婷婷六月天| 色综合综合综合| 99在线视频精品| 久久这里只有精品无码| 色婷婷六月天| 欧美A片在线视频免费观看| 亚韩在线视频| 人人草人人爱手机视频看看| 婷婷五月激情综合| 色五月婷婷91在线| 九九碰九九爱97| 五月丁香综合激情| 天天操九九插| www.yw尤物| 欧美日韩精品一区二区三区钱| www.婷婷五月天| 天天插天天爽| 久久人人人人妻| 婷婷色色网| 天天艹| 超碰日韩成人| 激情五月天视频| 99热色精品| 五月天婷a| 色之综合网| 亚欧州精品视频| 夜色爱爱亚洲| 99年操人人爽| 99久久99九九99九九九| 五月婷啪啪| 免费不卡狠操美女视频网| 婷婷色系婷色| 99这里有精品久久97| 婷婷五月丁香花综合| AV变态另类一区二区| 婷婷成人基地| 日本天天操| 成人在线视频网| 丁香激情五月| 婷婷丁香人妻天天爽| 一本伊人色婷| 久久有码| 五月丁香婷婷久久| 亚洲中文无码成人| 丁香六月婷婷激情综合| 99色干| 伊人五月婷婷| 影音先锋91| 色婷婷激情五月天| 丁香六月婷婷社区| 五月婷婷丁香五月| 亚洲天堂青草| 日本在线观看aaa 99| 婷婷伊人综合| 99热人人艹| 99久久超级| 99爱在线| 亚洲成人综合网在线免费观看| 人妻有码乱操| 九九九AAA热视频| 丁香五月婷婷操逼| 白度黄视频| 色五月开心久久网| 91oumei| 六月婷婷九月丁香| 日韩色五月| AAA久久久| 婷婷99| 婷婷五月丁香六月伊人网| 五月丁香爱婷婷深深| 激情色中文| 五月丁香久久久日婷婷久久婷婷日| 99视频地址| 五月丁香啪啪激情| A A色色| 婷婷五月天在线综合| 色五月天成人| 婷婷五月天激情电影| 九九AV在线| 日本色婷婷| 亚洲欧美在线观看| 超碰无码老师| 久草a片| 丁香五月婷婷狠狠色| 色婷婷成人丁香| 思思热性操| se影音资源在线观看| 第四色五月婷婷| 可以看的AV| 性生生活大片又黄又| 99碰碰碰| 26UUU欧美激情一区二区| 丁香五月婷婷亚洲人| 婷婷深爱色五月| 日韩爱操视频| 五月激情综合网| 五月丁香影视| 狼人伊人干| 99久久久免费| 天天干天天操天天上| 色久丁香五| 丁香六月婷婷| 丁香五月婷婷av影院| 91精产品自偷自偷综合| 色五月丁香五月五月婷婷| 婷婷十月丁香| 亚洲操逼网| 男人大jjc女人免费视频| 久九九热| 激情五月天综合图片小说网站| 一本久道综合色婷婷五月| 337p大胆噜噜噜噜噜91Av| 中文字幕丰满孑伦无码专区| 婷五月天六| 婷婷激情五月天网站| 狠狠激情五月天| 夜夜骑夜夜撸| 草久私拍| XXXX岛国| 天天日夜夜| 无码人妻丰满熟妇奶水区码| 操人久久| 狠色狠色综合久久| 国产午夜一区二区三区| 丁香五月婷婷激情蜜桃| 99久久免费性爱视频`| 天天日,天天射,天天舔| 婷婷91| 超碰人人99| 激情二色月| 五月丁香婷婷综合| 日韩婷久| 亚洲AAAA网| 亚洲av骚货| 亚洲4区国产欧美| 五月色婷婷综合丁香精品无遮挡| www.婷婷六月天| 超碰97在线观看免费| 五月色婷婷亚洲 | 99性爱| 色婷另类| 天天插天天插天天插| 九九在线精品| 9色视频在线| 激情综合激情综合| 日韩99无码| 99热精在线九九久久保| 草一草avb| 欧美啪啪五月天| 五月天堂在线| 国产毛多水多女人A片| 成人片在线播放| 开心激情婷婷| 91国产精品视频播放| ji'qing'luan'ren'lun| 婷婷激情图片| 色色色色色色色色五月先| 色综合另类| 婷婷综合久久综合| 一级A片天天操夜夜操| 亚洲成人网站在线观看| 婷婷丁香五月天哟啪| 日本精品99网站| 天天插天天射天天干| 天天爽,夜夜爽| 婷婷丁香精品视频在线观看| 五月婷婷伊人久久| 久久久天堂国产精品女人| 第四色五月激情网| 婷婷久久精品| 国产九九一区二区三区| 激情网综合| 综合福利网| 天天干天天 亚洲| 国产成人精品一区二三区熟女在线| 99视频超级精品| 99热这里只有精品2| 久久久久9| 啪啪啪大香蕉| 欧美天天草人人草| 538在线精品| 99久久精彩视频。| 久久婷婷视频| 狠狠色激情在线| 丰满人妻妇伦又伦精品国产| 狠狠色丁香婷婷综合久久97AV| 色伦专区97中文字幕| 伊人五月人妻精品| 久久久全国免费视频| 五月丁香做爱视频| 丁香婷婷午夜| 26UUU欧美激情一区二区| 亚洲综合视频网| 五月婷婷丁香在线| peg 2区三区四区的| 国产精品久久久爽爽爽麻豆色哟哟 | 婷婷丁香日韩五月| 久久A区B区| 五月丁香久久丝袜啪啪| 五月天丁香成人| 亚洲激情综合| 青草视频在线播放| 中文字幕色色| 97黑人精品区| 丁香五月人妻| 99性爱无码| 大香蕉娱乐| 亲子乱AV一区二区三区下载| 久久这里只有精彩| 成人美女网| 五月天最新网| 丁香婷婷网| 91人人人人人| 五月激情站| 99啪啪| 伊人五月婷| 99精品国产在热久久婷婷| 色婷婷黄色网络| 九九婷婷激情综合网| 类似婷婷激情综合网站| 色一区高清| 激情婷婷五月社区| 婷婷色在线观看| 婷婷六月插屄激情| 激情五月份婷婷| 日韩婷婷| 午夜丁香婷婷| 97色色色色| 拍色综合| 91蜜桃婷婷狠狠久久综合9色| 色色丁香五月婷婷| 大香蕉久久婷婷精品综合| 天天日天天色| 五月婷婷啪啪啪啪| 天天开心天天色| 久久成人亚洲欧美电影| 综合色图区| 丁香五月中文字幕久色| 99热国产精品| 亚洲av电影在线| 大香蕉九九| 婷婷丁香五月综合激情视频| 丁香五月婷婷啪啪| wuyuedingxiang| 色五月激情五月开心五月| 丁香五月激情啪啪| 五月激情丁香久久综合网| 日韩五月婷婷| 亚洲乱码日产精品BD| 色综合九九色综合88| 婷婷五月天亚洲精品| 在线播放中文字幕| 婷婷日本色| 人妻丰满精品一区二区A片| 日本在线视频播放91| 欧美婷婷五月| 日日日,com| 国产日韩av片| 99re久热| 国产精品激情AV久久久青桔| 九九综合精品| 狠狠色噜噜狠狠狠888| 开心五月婷婷激情网| 五月丁香综合啪啪| 在线观看996精品| 午夜]香婷婷深深爱| 激情AV| 色综合婷婷| 色五月色五天免费视频| 人人综合五月人人婷婷| 亚洲精品色色| 日韩综合久久| 99内射视频| 色婷婷亚洲综合天堂| 国产精产国品一二三在观看| 色激情五月| 日韩久热| 人人摸人人澡人人| 婷婷五月天综合小说网| 久热最新视频| xx综合网| 色A网| 激情综合女人网五月播播| 日本91在线| 99热在线精品观看| 91精品又长又大又粗又爽又猛| 日本在线观看aaa 99| 久久丁香综合香蕉| 日韩av一区二区在线/日产精品久久久 | 久久加勒比| 精品亚洲日韩99欧美片| 婷婷日本色| 中文字幕av网站| 97伦色婷婷| 91啦丨九色丨刺激中文| 国产在线网址1| 国产干逼片| 婷婷五月天av小说| 色噜噜狠狠狠狠色综合久欧美| 香蕉久操| www.婷婷com| 亚洲一区二区色图-亚洲精品国产精品乱码-成人AV | www.久9| 99热色婷婷| 97热在线精品| 色婷婷19| 亚洲综合字幕色色| 色婷婷五月六月丁香综合视频| 九九热99re8热免费观看| 美女va| 天天更新天天亚洲| 日本成人噜噜噜噜噜| 丁香六月婷婷色XXXX| 特级片神马电影| 亚洲视频图片婷婷五月| 亚洲va欧美va天堂v国产综合| 五月婷婷丁香五月| 大香蕉网站,大香蕉综合| 五月综合久久| 九九香蕉网| 国产XXXX搡XXXXX搡麻豆| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 欧美日韩成人在线免费| 超碰色婷婷| 99re99在线看| 激情的五月| 婷婷六月五月天综合| 久狠狠| 色色五月婷| 裸体做A爰片毛片A片免费| 五月天婷a在线| www婷婷亚洲| 亚洲成人高清在线| 日韩九九视频| 中国AV性爱观看| 这里只有精品网站| 亚洲综合无码| 婷婷五月天激情网| 亚洲xx在线| 亚洲色色五月天| 亚洲日韩国产黑丝黑丝AVAV一区二区三区| 91精品熟女| 91人人爽久久涩噜噜噜| 丁香婷婷五月色成人网站| 啪啪综合网| 婷婷香蕉香| www.91操| 开心五月丁香啪| 狠狠狠狠狠狠| 丁香五月天堂网| 亚洲99一级无嗎特制在线| 影视av久久久噜噜噜噜噜三级| 美女丁香五月天| 深情五月天| 99热免费在线| 欧美三级视频| 色综合婷婷| 牛牛碰免费| 狠狠操综合| 久久婷婷五月综合色区| 五月综合丁香婷婷| 99er在线观看| AV在线免费播放| 亚洲综合网在线| 99久在线观看| 婷婷激情丁五月| 97精品综合久久| 亚洲天堂色| 亚洲成人在线播放| 99热久久这里只有精品2010| 精品人妻一区二区三区四区不卡在| 久久免费高| 99热99网| 99国产精品久久久久久久久久久 | 五月天色丁香| 国产人妻人伦精品一区二区| 久婷久婷激情肉| 99色一| 色色色无码| 射琪琪| 天天综合网亚洲综合网| 激情综合五月婷婷| 97黑人精品区| 婷婷五月天美女视频| 久99热| 九九AV在线| www.99热这里精品| 综合色图婷婷| 五月天婷婷一起草| 成人一级片| 热婷婷在线视频| 五月天成人在线| av九九| 五月丁香婷婷中文| 这里只有精品久久| 日韩人妻在线播放| 婷婷操逼网| 午夜大香蕉| 人妻AV在线| 久久精品9| 久xxxx| 天天干天天干天天干天天干天| 大地资源色婷婷视频在线 | 精品亚洲国产成AV人片传媒| 五月丁香六月激情综合网| 日本一级| 亚洲啪啪网| 五月天激情视频| 狠狠色婷婷丁香五月| www.lingjunshare.com| 国产69久久久欧美黑人A片| 色婷婷婷av| 色五月天电影| 色色激情五月天| 国产67194| 日韩在线9| 婷婷综合色图| 97热在线精品| 色婷另类| 久久综合无| 五月婷婷色影院| 五月婷婷色综图片| 人人妻人人澡| 午夜成人天堂久久无码日韩久久| 色女人久久| 久久99久久99精品免观看粉嫩| 亚洲精品色| 热99免费在线| 色婷婷五月在线| 五月婷婷中文字幕| 67194成I人在线观看线路1| 婷婷久热| 色狠狠综合| 五月婷婷伊人网|