func createItemIcon(item *ItemStack, scene *scene.Type, x, y float64) *ui.Container { mdl := getModel(item.Type.Name()) container := ui.NewContainer(x, y, 32, 32) if mdl == nil || mdl.builtIn == builtInGenerated { var tex render.TextureInfo if mdl == nil { tex = render.GetTexture("missing_texture") img := ui.NewImage(tex, 0, 0, 32, 32, 0, 0, 1, 1, 255, 255, 255) img.AttachTo(container) scene.AddDrawable(img.Attach(ui.Top, ui.Left)) } else { for i := 0; i < 9; i++ { v := fmt.Sprintf("layer%d", i) if _, ok := mdl.textureVars[v]; !ok { break } tex = mdl.lookupTexture("#" + v) img := ui.NewImage(tex, 0, 0, 32, 32, 0, 0, 1, 1, 255, 255, 255) img.AttachTo(container) scene.AddDrawable(img.Attach(ui.Top, ui.Left)) } } } else if mdl.builtIn == builtInFalse { var blk Block if bt, ok := item.Type.(*blockItem); ok { blk = bt.block } u := modelToUI(mdl, blk) u.AttachTo(container) scene.AddDrawable(u.Attach(ui.Top, ui.Left)) } if dam, ok := item.Type.(ItemDamagable); ok && dam.Damage() > 0 { val := 1.0 - (float64(dam.Damage()) / float64(dam.MaxDamage())) barShadow := ui.NewImage(render.GetTexture("solid"), 0, 2, 28, 4, 0, 0, 1, 1, 0, 0, 0, ) barShadow.SetLayer(2) barShadow.AttachTo(container) scene.AddDrawable(barShadow.Attach(ui.Bottom, ui.Center)) bar := ui.NewImage(render.GetTexture("solid"), 0, 0, 28*val, 2, 0, 0, 1, 1, int(255*(1.0-val)), int(255*val), 0, ) bar.SetLayer(2) bar.AttachTo(barShadow) scene.AddDrawable(bar.Attach(ui.Top, ui.Left)) } if item.Count > 1 { txt := ui.NewText(fmt.Sprint(item.Count), -2, -2, 255, 255, 255). Attach(ui.Bottom, ui.Right) txt.AttachTo(container) txt.SetLayer(2) scene.AddDrawable(txt) } return container }
func (c *ChatUI) init() { c.container = ui.NewContainer(0, 44, maxLineWidth, chatHistoryLines*18+2) c.container.Attach(ui.Bottom, ui.Left) c.input = ui.NewText("", 5, 1, 255, 255, 255).Attach(ui.Bottom, ui.Left) c.input.SetDraw(false) c.input.AttachTo(c.container) c.inputBackground = ui.NewImage(render.GetTexture("solid"), 0, 0, maxLineWidth, 20, 0, 0, 1, 1, 0, 0, 0).Attach(ui.Bottom, ui.Left) c.inputBackground.SetA(77) c.inputBackground.AttachTo(c.container) c.inputBackground.SetDraw(false) Client.scene.AddDrawable(c.inputBackground) Client.scene.AddDrawable(c.input) }
func (cs *consoleScreen) init() { cs.scene = scene.New(true) cs.container = ui.NewContainer(0, -220, 854, 220) cs.container.SetLayer(-200) cs.background = ui.NewImage(render.GetTexture("solid"), 0, 0, 854, 220, 0, 0, 1, 1, 0, 0, 0) cs.background.SetA(180) cs.background.AttachTo(cs.container) cs.scene.AddDrawable(cs.background.Attach(ui.Top, ui.Left)) cs.inputText = ui.NewText("", 5, 200, 255, 255, 255) cs.inputText.AttachTo(cs.container) cs.scene.AddDrawable(cs.inputText.Attach(ui.Top, ui.Left)) cs.pos = -220 cs.visible = false }
func (u *uiLogo) init(scene *scene.Type) { if logoText == "" { nextLogoText() } if logoTexture == "" { nextLogoTexture() logoTexture = logoTargetTexture } readStevenLogo() u.scene = scene row := 0 tex, tex2 := render.GetTexture(logoTexture), render.GetTexture(logoTargetTexture) titleBox := ui.NewContainer(0, 8, 0, 0).Attach(ui.Top, ui.Center) logoTimer = r.Float64() * 60 * 30 logoTransTimer = 120 for _, line := range strings.Split(stevenLogo, "\n") { if line == "" { continue } for i, r := range line { if r == ' ' { continue } x, y := i*4, row*8 rr, gg, bb := 255, 255, 255 if r != ':' { rr, gg, bb = 170, 170, 170 } shadow := ui.NewImage( render.GetTexture("solid"), float64(x+2), float64(y+4), 4, 8, float64(x%16)/16.0, float64(y%16)/16.0, 4/16.0, 8/16.0, 0, 0, 0, ) shadow.SetA(100) shadow.AttachTo(titleBox) u.scene.AddDrawable(shadow) img := ui.NewImage( tex, float64(x), float64(y), 4, 8, float64(x%16)/16.0, float64(y%16)/16.0, 4/16.0, 8/16.0, rr, gg, bb, ) img.AttachTo(titleBox) u.scene.AddDrawable(img) logoLayers[0] = append(logoLayers[0], img) img = ui.NewImage( tex2, float64(x), float64(y), 4, 8, float64(x%16)/16.0, float64(y%16)/16.0, 4/16.0, 8/16.0, rr, gg, bb, ) img.AttachTo(titleBox) img.SetA(0) u.scene.AddDrawable(img) logoLayers[1] = append(logoLayers[1], img) if titleBox.Width() < float64(x+4) { titleBox.SetWidth(float64(x + 4)) } } row++ } titleBox.SetHeight(float64(row) * 8.0) txt := ui.NewText(logoText, 0, -8, 255, 255, 0).Attach(ui.Bottom, ui.Right) txt.AttachTo(titleBox) txt.SetRotation(-math.Pi / 8) u.scene.AddDrawable(txt) u.text = txt width, _ := txt.Size() u.textBaseScale = 300 / width if u.textBaseScale > 1 { u.textBaseScale = 1 } txt.SetX((-txt.Width / 2) * u.textBaseScale) u.origX = txt.X() }
func (playerInventory) Draw(s *scene.Type, inv *Inventory) { full := Client.activeInventory == Client.playerInventory if !full { // Slots 36-44 are the hotbar Client.hotbarScene.Hide() Client.hotbarScene = scene.New(true) hs := Client.hotbarScene for i := invPlayerHotbarOffset; i < invPlayerHotbarOffset+9; i++ { if inv.Items[i] == nil { continue } item := inv.Items[i] container := createItemIcon(item, hs, 6+40*float64(i-36), 6). Attach(ui.Top, ui.Left) container.AttachTo(Client.hotbar) } return } background := ui.NewImage( render.GetTexture("gui/container/inventory"), 0, 0, 176*2, 166*2, 0, 0, 176/256.0, 166/256.0, 255, 255, 255, ) s.AddDrawable(background.Attach(ui.Middle, ui.Center)) check := ui.NewContainer(0, 0, 176*2, 166*2) s.AddDrawable(check.Attach(ui.Middle, ui.Center)) check.HoverFunc = func(over bool) { invScreen.inWindow = over } var slotPositions = [45][2]float64{ 0: {144, 36}, // Craft-out // Craft-In 1: {88, 26}, 2: {106, 26}, 3: {88, 44}, 4: {106, 44}, // Armor 5: {8, 8}, 6: {8, 26}, 7: {8, 44}, 8: {8, 62}, } for i := 9; i <= 35; i++ { x := i % 9 y := (i / 9) - 1 slotPositions[i] = [2]float64{ 8 + 18*float64(x), 84 + 18*float64(y), } } for i := 0; i < 9; i++ { slotPositions[i+36] = [2]float64{ 8 + 18*float64(i), 142, } } solid := render.GetTexture("solid") for i, pos := range slotPositions { i := i ctn := ui.NewContainer(pos[0]*2, pos[1]*2, 32, 32) ctn.AttachTo(background) s.AddDrawable(ctn) item := inv.Items[i] if item != nil { container := createItemIcon(item, s, pos[0]*2, pos[1]*2) container.AttachTo(background) } else if i >= 5 && i <= 8 { tex := render.GetTexture([]string{ "items/empty_armor_slot_helmet", "items/empty_armor_slot_chestplate", "items/empty_armor_slot_leggings", "items/empty_armor_slot_boots", }[i-5]) img := ui.NewImage(tex, pos[0]*2, pos[1]*2, 32, 32, 0, 0, 1, 1, 255, 255, 255) img.AttachTo(background) s.AddDrawable(img) } highlight := ui.NewImage(solid, pos[0]*2, pos[1]*2, 32, 32, 0, 0, 1, 1, 255, 255, 255) highlight.SetA(0) highlight.AttachTo(background) highlight.SetLayer(25) s.AddDrawable(highlight) ctn.HoverFunc = func(over bool) { if over { highlight.SetA(100) invScreen.activeSlot = i } else { highlight.SetA(0) if i == invScreen.activeSlot { invScreen.activeSlot = -1 } } } } }
func (rl *resourceList) redraw() { for _, s := range rl.packs { s.Hide() render.FreeIcon(s.id) } rl.packs = rl.packs[:0] os.MkdirAll("./resource-packs", 0777) files, _ := ioutil.ReadDir("./resource-packs") for i, f := range files { f := f if !strings.HasSuffix(f.Name(), ".zip") { continue } fullName := filepath.Join("./resource-packs", f.Name()) desc, iimg, ok := getPackInfo(fullName) if !ok { continue } sc := scene.New(true) container := ui.NewContainer(0, float64(i)*100, 700, 100). Attach(ui.Center, ui.Middle) r := make([]byte, 20) rand.Read(r) si := &resourceListItem{ Type: sc, container: container, offset: float64(i), id: "servericon:" + string(r), } si.updatePosition() rl.packs = append(rl.packs, si) var rr, gg, bb int if resource.IsActive(fullName) { rr = 200 gg = 200 } bck := ui.NewImage(render.GetTexture("solid"), 0, 0, 700, 100, 0, 0, 1, 1, rr, gg, bb).Attach(ui.Top, ui.Left) bck.SetA(100) bck.AttachTo(container) sc.AddDrawable(bck) txt := ui.NewText(f.Name(), 90+10, 5, 255, 255, 255).Attach(ui.Top, ui.Left) txt.AttachTo(container) sc.AddDrawable(txt) var tex render.TextureInfo if iimg == nil { tex = render.GetTexture("misc/unknown_pack") } else { render.AddIcon(si.id, iimg) tex = render.Icon(si.id) } icon := ui.NewImage(tex, 5, 5, 90, 90, 0, 0, 1, 1, 255, 255, 255). Attach(ui.Top, ui.Left) icon.AttachTo(container) sc.AddDrawable(icon) msg := format.Wrap(&format.TextComponent{Text: desc}) format.ConvertLegacy(msg) motd := ui.NewFormattedWidth(msg, 90+10, 5+18, 700-(90+10+5)).Attach(ui.Top, ui.Left) motd.AttachTo(container) sc.AddDrawable(motd) container.ClickFunc = func() { if resource.IsActive(fullName) { RemovePack(fullName) } else { AddPack(fullName) } setScreen(newResourceList(rl.ret)) } container.HoverFunc = func(over bool) { if over { bck.SetA(200) } else { bck.SetA(100) } } sc.AddDrawable(container) } }
func (sl *serverList) redraw() { for _, s := range sl.servers { s.Hide() render.FreeIcon(s.id) } sl.servers = sl.servers[:0] for i, s := range Config.Servers { sc := scene.New(true) container := ui.NewContainer(0, float64(i)*100, 700, 100). Attach(ui.Center, ui.Middle) r := make([]byte, 20) rand.Read(r) si := &serverListItem{ Type: sc, container: container, offset: float64(i), id: "servericon:" + string(r), } si.updatePosition() sl.servers = append(sl.servers, si) bck := ui.NewImage(render.GetTexture("solid"), 0, 0, 700, 100, 0, 0, 1, 1, 0, 0, 0).Attach(ui.Top, ui.Left) bck.SetA(100) bck.AttachTo(container) sc.AddDrawable(bck) txt := ui.NewText(s.Name, 90+10, 5, 255, 255, 255).Attach(ui.Top, ui.Left) txt.AttachTo(container) sc.AddDrawable(txt) icon := ui.NewImage(render.GetTexture("misc/unknown_server"), 5, 5, 90, 90, 0, 0, 1, 1, 255, 255, 255). Attach(ui.Top, ui.Left) icon.AttachTo(container) sc.AddDrawable(icon) ping := ui.NewImage(render.GetTexture("gui/icons"), 5, 5, 20, 16, 0, 56/256.0, 10/256.0, 8/256.0, 255, 255, 255). Attach(ui.Top, ui.Right) ping.AttachTo(container) sc.AddDrawable(ping) players := ui.NewText("???", 30, 5, 255, 255, 255). Attach(ui.Top, ui.Right) players.AttachTo(container) sc.AddDrawable(players) msg := &format.TextComponent{Text: "Connecting..."} motd := ui.NewFormattedWidth(format.Wrap(msg), 90+10, 5+18, 700-(90+10+5)).Attach(ui.Top, ui.Left) motd.AttachTo(container) sc.AddDrawable(motd) msg = &format.TextComponent{Text: ""} version := ui.NewFormattedWidth(format.Wrap(msg), 90+10, 5, 700-(90+10+5)).Attach(ui.Bottom, ui.Left) version.AttachTo(container) sc.AddDrawable(version) s := s go sl.pingServer(s.Address, motd, version, icon, si.id, ping, players) container.ClickFunc = func() { PlaySound("random.click") sl.connect(s.Address) } container.HoverFunc = func(over bool) { if over { bck.SetA(200) } else { bck.SetA(100) } } sc.AddDrawable(container) index := i del, txt := newButtonText("X", 0, 0, 25, 25) del.AttachTo(container) sc.AddDrawable(del.Attach(ui.Bottom, ui.Right)) sc.AddDrawable(txt) del.AddClick(func() { Config.Servers = append(Config.Servers[:index], Config.Servers[index+1:]...) saveServers() sl.redraw() }) edit, txt := newButtonText("E", 25, 0, 25, 25) edit.AttachTo(container) sc.AddDrawable(edit.Attach(ui.Bottom, ui.Right)) sc.AddDrawable(txt) edit.AddClick(func() { setScreen(newEditServer(index)) }) } }