To move ahead, you need to think ahead.
Our customers recognise this. So do we.
Progressive thinking, process expertise and high performance production, perfectly integrated. This is the basis for innovative, high quality products.
At RUPF ATG Casting, these three elements are the key to our success in developing, manufacturing, processing and assembling highly complex, light metal components and modules. They have made us a preferred development and supply partner to many leading businesses in the automotive industry and other sectors.
At our plant we manufacture die-cast products in aluminium and zinc, parts ready for fitting.
More importantly, the permanent transfer of skills between all our team allows us to offer a single source solution for turning new ideas into industrial reality. This synergy brings benefit-oriented, optimised solutions to all our customers.


text:
Boys' Junior School Admissions
Boys' Junior School news
Boys' Junior School Letters for Parents
Home Our Schools Boys' Junior School
The spirit of mutual respect, fair play and friendship which exists throughout the School fosters an atmosphere which allows the boys to thrive.
Set in its own historic building (the former Court and Police Station for Bury), the Boys' Junior School offers a caring, secure and happy environment. Throughout the School, the curriculum provides extensive coverage of mathematical, scientific, creative, aesthetic and practical spheres of study and is supported by an extensive range of extra-curricular activities in Music and Sport. The boys participate in frequent educational visits to museums, theatres and lectures.
Boys are encouraged to develop a love of learning, to identify and explore their talents, and to pursue a wide range of interests. As a result of this ethos, when they transfer to the Senior School they are maturing into articulate, confident and considerate young men, equipped with the necessary academic and social skills for the next stage of their education.
"The Boys' Junior School has been outstanding from start to finish. There is no doubt that BGSB have made my son into the smart, inquisitive young man he is today."
Year 6 Parent
Mr Matt Turner - Head of Boys' Junior School
Academic excellence is at the forefront of every boy's learning experience. We look to identify and enhance each boy's individual strengths and to offer
opportunities to discover new experiences.
We understand that learning is most successful when a child is happy and feels secure. To help us to create and maintain an environment that will foster this development, we aim to establish a true partnership with parents.
Through nurturing and caring for every individual, we instil confidence and self-belief in every boy. My team and I know the boys well: we know how to get the very best out of them as we aim to support boys in realising their potential. Ours is an environment which enables boys to thrive, where lessons are challenging, fun and energetic.
The boys' humour, sense of fair play and determination create an educational environment where everyone loves to learn and celebrate success. There is a real sense of community spirit, of which we are very proud.

redpajama_set_name: RedPajamaCommonCrawl


text:
Cristóvão de Castro Barcelos (* 25. Juni 1883 in Campos dos Goytacazes, Rio de Janeiro; † Februar 1946 in Rio de Janeiro) war ein brasilianischer Offizier, zuletzt zwischen 1944 und seinem Tod 1946 im Range eines Generalmajors Chef des Generalstabes des Heeres.

Leben
Barcelos absolvierte eine Offiziersausbildung im Heer (Exército Brasileiro) der Streitkräfte (Forças Armadas do Brasil) und fand im Anschluss verschiedene Verwendungen als Offizier sowie Stabsoffizier. Nach seiner Beförderung zum Oberstleutnant am 20. März 1930 wurde er 1931 Kommandant der Stabsschule des Heeres und erhielt am 9. April 1931 seine Beförderung zum Oberst sowie am 22. September 1932 zum Brigadegeneral. Er war zwischen dem 14. Januar 1938 und dem 30. Juni 1939 Kommandeur der 7. Militärregion (7.ª Região Militar) und wurde in dieser Verwendung am 24. Juni 1938 zum Generalmajor befördert. Nachdem er zwischen 1939 und 1942 Kommandeur der 4. Militärregion (4.ª Região Militar) war, fungierte er 1942 zunächst als Generalinspekteur der 3. Gruppe der Militärregionen sowie später 1942 als Leiter der brasilianischen Delegation im Gemeinsamen Brasilianisch-US-amerikanischen Verteidigungsausschuss.

Zuletzt war Generalmajor Barcelos von 1943 bis 1945 Mitglied des Beförderungsausschusses des Heeres sowie als Nachfolger von Generalmajor Maurício José Cardoso vom 15. Dezember 1944 bis zu seinem Tode im Februar 1946 Chef des Generalstabes des Heeres.

Weblink
 Eintrag in Generals.dk

Generalmajor (Brasilien)
Person im Zweiten Weltkrieg (Brasilien)
Brasilianer
Geboren 1883
Gestorben 1946
Mann

redpajama_set_name: RedPajamaWikipedia


My thanks for Chad Arnow for setting this sale up - even if he were unaware! I have the first (at least to my knowledge) black horn grip, brass-mounted Scottish dirk that Tod made. It is identical in all respects to the first image in Chad's thread in the Historical Arms talk forum. I acquired this item several years ago and it is in mint condition. The scabbard may differ slightly from the one illustrated but I believe they are virtually identical. I have two of this style dirk in my collection and must, alas, part with one and I know there is a ready market for Tod's fine reproductions.
I will consider trades for high end Scottish items from Vince Evans or Glenn McClain (except for skeins of any sort). I am particularily interested in a lowland dirk/dagger with a crossguard or an even earlier "dirk" with the hexagonal drudgeon style.
Otherwise this dirk was about $600 US and I will sell it for what I paid. If you have been contemplating ordering a great dirk from a master craftsman WITH NO WAIT this is your opportunity.
If anyone has questions, you can call at 800-394-1250 any weekday betwenn 9AM and 6PM CDST.
I going to bump this up a bit with some additional thoughts. I was discussing this dirk with Nathan the other day and he mentioned how it was a little pedestrian for his taste..a bit plain, etc. and this caused me to do some thinking that I want to share for whatever it's worth.
As many of you already know, there was a tradition even back to Medieval days of "mourning swords"; swords, rings and other paraphenalia that were worn for a period of several months to a year when in mourning for a death of a family member, lord, etc.in lieu of the more elaborate and ornate daily ones.
I have developed a theory that that is exactly what this dirk was made for, a period of mourning. It is plain and it is certainly, well black. Just as swords were plain hilted for mourning periods, why not a dirk as well? In lieu of other theories as to why a dirk would be made out of black horn, I'm going to posit that perhaps the one illustrated in Wallace (of which this is a copy) represents a weapon carried to match the somber clothing of a period of mourning. For one thing, the original shows very little signs of wear which would be in keeping with the general line of thinking.
To my mind, this makes this dirk a tad more unusual, and perhaps unique. I can certaily see it carried by a reenactor in a mourning persona and, of course, it goes without saying that it's a really nice piece period.
Hope this generates some interest. And, by the way, the reason for parting with it is duplication. I have two of these and I think that's one too many so I hope and wish a good home for this one.
I have tried to sell this dirk before but - embarrassingly - could not locate it after my wife and daughter "straightened-up" my office! It came to light this weekend, so it is back on the market. I would like $425.00 plus shipping. The dirk is in "like-new" condition and has never been used or carried. It is an excellent dirk but is a duplication in my collection. Please PM if you are interested.


2FACE, SNOOP LION OR DBANJ… WHO ROCKS MTV ALL STARS SOUTH AFRICA THIS WEEKEND?
Social media have been buzzing since the release of the final MTV Africa All Stars performer line up.
Music lovers and ardent fans have started a conversation on who will pull the largest crowd at the MTV Base All Stars Concert which will hold on Saturday, May 18, 2013 at the Moses Mabhida Stadium, People's Park in Durban, South Africa.
With a long list of African heavyweights led by International rap icon, Snoop Lion, formerly known as Snoop Dogg, the artistes mentioned widely include Africa's hiphop heads, 2Face Idibia and Dbanj.
Others acts include Flavour, Fally Ipupa, Camp Mulla, Zakes Bantwini, Zahara, Big Nuz and Flavour.
So the question is who will deliver the most memorable performance this weekend?
Will it be multiple award-winning music icon, 2Face Idibia? Or internationally recognized crowd pleaser and superstar, Dbanj? Or will the sensational rap king, Snoop Lion blow our minds just like the old times?
Join the conversation on Twitter using the #AfricaAllStars to choose your hottest act for the MTV Africa All Stars Concert.


text:
Admissons
Areas Labs / Groups Sponsored Projects
Our research areas include not only the classical topics in Chemical Engineering but also, diverse multidisciplinary areas where most recent and challenging problems are being addressed. Many unsolved problems in various disciplines require substantial knowledge of chemical engineering. Combined with our rigourous course work students are motivated to learn many new topics and thereby enhanced their problem solving skills from a scientific and engineering perspective.
Our research areas include:
Catalysis and Reaction Kinetics
Colloids and Interfacial Science
Thermodynamics, Statistical Mechanics and Molecular Simulations
Engineering of biological processes from the molecular to the organismal scale is central to addressing key problems in medicine and healthcare as well as energy and environmental sustainability. Our department employs a unique blend of theory, simulations, and experimental techniques for biomolecular engineering. Fully atomistic and coarse grained molecular simulations are being developed to derive fundamental insights into protein interactions underlying disease states, which help identify novel drug and vaccine targets. Sophisticated single molecule spectroscopic experiments have been set up to probe rare molecular interactions within living cells, allowing first-hand observations of events that cause development and disease. Viral infections that are important globally and nationally, such as HIV, hepatitis C, and dengue, are an important focus of our efforts. Modelling and simulations of viral dynamics and evolution coupled with single molecule experiments and data from patients, obtained in collaboration with clinicians, are being employed to unravel the origins of the failure of current treatments and to design more potent and economical therapeutic protocols. Reaction network theory and experiments on quorum-sensing are being used to understand cellular signalling events and emergent systems-level properties that viruses and bacteria manipulate to overcome our immune response, presenting new avenues for vaccine design. Metabolic engineering of bacteria coupled with optimization and control techniques for bioreactors is being exploited to produce biofuels and degrade environmentally harmful effluents and waste. Our efforts thus synergize a broad spectrum of engineering and design techniques to achieve precise manipulation of biological phenomena for improved healthcare and sustainable development.
Catalysis and Reaction Engineering
Developing new catalysts, methods, and processes that deliver efficient and economical ways to carry out chemical transformations encompasses this field. Using knowledge from catalytic chemistry, reaction mechanisms, reaction kinetics, and transport processes, researchers in the department are trying to improve on reactions that span from polymer degradation to biomass conversion in reactors. Significant progress has been made in understanding of polymer polymerization and degradation under various conditions using experimental and kinetic modelling. Other interesting avenues of pursuit are in the development of catalysts for organics degradation and enzymatic catalysis in supercritical carbon dioxide. Similarly, designing and engineering improved steps for nanoparticle synthesis are allowing us to develop new reactors/contactors to control nanoparticle mean size and polydispersity. Efforts are also ongoing to unravel systems level properties of complex cell signalling and transcription networks applying ideas from reaction network theory, with the goal of identifying novel drug targets and outcomes of intervention. Another key theme has been to understand the mineral-microbe interactions that can be utilized for bioprocessing of various industrial materials. Using detailed mathematical models for coupling multiphase transport phenomena and biochemical reaction kinetics in bioreactors, problems in bioleaching of minerals and ores, biological adsorption of toxic metals and biomethanation of biomass are being addressed.
Colloids and Interface Science
A reduction in the length scale of reactors and attempts to create microstructured systems with novel and desired properties have brought in the interplay of colloidal and interfacial interactions to prominence over a broad range of length scales. Our department has earlier contributed richly to the understanding of bubble and drop formation at orifices, foam bed contactors/ reactors, and agitated dispersions. Researchers are currently engaged in investigating colloidal interfacial behaviour at nano and sub-nano length scales. Synthesis of nanoparticles, nanowires, and nanorods, and formation of arrays and superlattices of nanoparticles for a variety of applications are controlled by manipulation of colloidal interactions and nucleation of a new phase. The formation of monolayers and bilayers and modulation of their properties for lubrication and oral care applications through sub-nanoscale chemical substitutions is another focus area in the department. Current research efforts in the department to store electrical energy efficiently in classical and novel batteries and super-capacitors draw heavily from new materials and interaction entities such as ions, charged surfaces, charged cavities, and charged micro-porous solids. These new storage systems are required to harness power from solar and other renewable resources.
Complex Fluids and Transport Processes
From food grains and processed foods, through industrial products such as paints and mineral slurries, to hygeine and cosmetic products such as toothpaste and lotions, complex fluids are an intimate part of our lives. They range from multiphase mixtures (e.g., ice-cream, a dispersion of fat globules, ice crystals and air bubbles in an aqueous liquid) to simply a collection of discrete particles (e.g. dry food grains). They are interesting subjects for study because their response to applied forces is more complex than that of normal fluids such as water and air. Though diverse in their constitution, there are similarities in important aspects of their behaviour, and also in the tools used for their study. Faculty in our department engaged in studying complex fluids employ a variety of tools: experimentation at macroscopic and microscopic scales, continuum mechanical modelling and computation, and particle-dynamics simulations. We have groups engaged in the study of granular flows, fluidized beds, solid-liquid and liquid-liquid dispersions, and liquid-crystalline mesophases, to name a few. Our tools of experimentation include rheometry, high-speed imaging, confocal microscopy, and the use of soft microchannels for synthesis and mixing of fluids. Our computational tools span length and time scales from study of phenomena at the molecular scale, through mesoscale dynamics and population balances, to continuum mechanical simulations. Through our studies, we hope to achieve two objectives. On one hand, we want to develop materials and design processes required for today's technology and on another, we hope to understand the fundamental physical and chemical processes that underly the dynamics of complex fluids, which in turn will help in the design of newer and novel products and processes of the future.
Buoyed by the ever-advancing ability to characterize, control and fabricate materials at the nanoscale, the interdisciplinary field of nanotechnology is becoming pervasive in every aspect of our lives. The potential application areas of nanotechnology range from semiconductor electronics, smart materials, energy solutions to biological diagnostics. Nanotechnology research in our department similarly ranges in its diversity and extends from simulations to understand phenomenon at the nanoscale to the engineering processes for generating nanomaterials and nanoarchitecture. Researchers are applying molecular dynamics and Monte Carlo simulations to understand structure and dynamics of fluids confined to the nanoscale that are important for developing novel gas storage applications and enhancing our molecular view of wear at the nanoscale. Similarly, population balances approaches are being employed to investigate the role of various mechanisms, such as nucleation, growth, coagulation, capping, and ripening of nanoparticles in influencing particle size distribution to develop better and efficient nanoparticle synthesis methods. Aggregation and 3D nanoparticle array formation is being modeled with thermodynamic and statistical mechanics approaches. Novel technologies are being pioneered for high throughput synthesis of metal nanoparticles and semiconductor nanowires in large scales. Extending these for generation of functional nanoscale architectures with guided self-assembly to form 2D and 3D superlattices is a key theme of the current work in the department. Researchers in our department are also interested in biological processes at the molecular level to understand underlying mechanisms. Design and characterization of polymers at the nanoscale has led to the development of new materials with unique structure, properties, and functions.
Energy Science and Engineering
The standard of living across the nations is strongly correlated with per capita energy production. Given the limited and finite nature of fossil fuels and the problems associated with the traditional renewable resource such as hydel power, it is imperative to develop technologies to harness and store energy from renewable sources such as solar energy, wind energy, tidal energy, etc. Renewable energy also has an additional advantage of being by and large environment friendly. In this department, pioneering research is being carried out towards the development of new materials and processes for energy capture and storage. Fundamental work on methane and natural gas storage using novel adsorbents such as metal organic frameworks (MOFs) and covalent organic frameworks (COFs) is currently pursueds using computational tools such as ab-initio electronic structure calculations and classical Monte Carlo simulations. Continuum and molecular modelling studies pursued in the department are helping us in improving the design and performance of rechargeable batteries and super-capacitors. Fundamental work on nanoparticle self- ssembly carried out in the department is helping towards development of novel devices that greatly enhance the collection efficiency of solar power.
Research work in our department addresses problems of land, water, and air pollution. Consider the problem of plastic waste that is plaguing many of our cities and towns. We are trying to degrade the polymers in solution, using a variety of techniques. Even though the projects have not covered the last mile between lab and the land, we hope to do so within the next few years. The use of polymers as scaffolds marks our maiden attempt to venture into the field of biomedical engineering. Several promising photocatalysts have been developed that appear to be good at degrading pollutants in waste water from industries. Similarly, supercritical solvents have been developed for enzymatic reactions to produce compounds that are used in the pharmaceutical and food industries. Efforts has also been focused to develop activated carbon fabric and modified granular activated carbon for the removal of gases such as CO2, NOx, CO and also Cr and As. Work is in progress to reduce or eliminate foul smell from the sites (landfills) that have been identified by the Corporation of Bangalore. Methods have been developed to determine sub- icrogram levels of Mo and Fe in industrial effluents. Our major research interests concern engineering and designing of processes and tools for treatment of water from various sources to make them compatible for human consumption or environmental release. One main theme has been defluoridation of drinking water where we have shown how column design and choice of adsorbents are critical to the output water quality. Similarly, we have demonstrated the use a solar still for the treatment of drinking water, rainwater harvesting and efficient disposal of spent analytical reagent can be achieved at the laboratory scale. An attempt was made to remove the excess fluoride from the reject water of a reverse osmosis unit located in a village using adsorption. However, further work is needed before an effective method can be found. .
Understanding phenomenan at the molecular scale allows one to tailor products using a bottom-up approach. We study a wide variety of phenomenon using classical molecular dynamics and Monte Carlo simulations and statistical thermodyamics, which require a knowledge of the forces between the various molecules. This approach provides a molecular understanding of adsorption and separations processes, catalysis, energy storage for transportation, novel drug synthesis protocols, nanoparticle engineering, biomembrane function and transport in complex fluids. Using a variety of molecular simulation techniques, we study transport and phase equilibria of fluids confined to the nanoscale, fluids adsorbed in microporous materials such as zeolites and metal organic frameworks, gas hydrates, structure, dynamics and flows of complex oil-water-surfactant systems and protein biomembrane interactions. With enhanced computing power, molecular simulations are increasingly providing a powerful in silico method to predict properties of a wide variety of engineering systems without resorting to detailed experimentation. Multiscale modelling strategies which bridge molecular level information with continuum transport models that are of direct engineering relevance are also being pursued.
Admissons Research


Federal holidays, same as all government contractors.
Akima uses the same schedule as the federal government. Unless the federal government gives an additional day off like they have done in the past.
What can you tell job seekers about Akima's Paid Holidays?"
Glassdoor is your resource for information about the Paid Holidays benefits at Akima. Learn about Akima Paid Holidays, including a description from the employer, and comments and ratings provided anonymously by current and former Akima employees.


text:
last night on late night Jan. 8, 2021
Bill Hader Says Stefon Probably Caught COVID 'a Couple of Times' by Now
By Megh Wright@megh_wright
Our colleagues at New York Magazine have published extensive reporting on how the NYC nightlife scene has raged on despite a dangerous pandemic, but unfortunately the coverage included a glaring omission: No reporters have found and interviewed the city's preeminent nightclub expert, former Saturday Night Live star and Seth Meyers's spouse, Stefon. Thankfully, Meyers righted that wrong during last night's Late Night when he asked Bill Hader what his beloved Weekend Update character has been up to since March 2020.
"It strikes me that a lot of what he does would probably be shut down right now," Meyers said. "I don't know he would notice!" Hader responded. "I think he would kind of go for a while and not really notice … I think he was probably, you know, patient zero on some level. He's probably had it a couple of times, and now he's fine." When Meyers pointed out that it's very likely Stefon has partied at clubs that don't follow COVID guidelines, Hader said, "They were all pretty underground — if they, in fact, exist, you know?" This led to Hader cracking open a whole new conspiracy theory that Stefon wasn't actually describing real clubs but was in fact "bad at his job" and "lying," and Meyers knew he was lying and "was very patient" about it.
Later in the chat, Meyers and Hader discussed the pause on season three of his HBO comedy Barry, which, while sad, also led to some good news for the show. "Right when the lockdown happened in March, we were a week away from shooting," Hader said. "Season three is completely written and ready to go, and during this time we actually went and wrote season four. So we have both of those kind of done, so we're just waiting until we can start shooting again." So there's a silver lining for you: It might take Barry a while to return to TV, but when it finally does, the team behind the show already has the next season locked and loaded.
'Bill Hader Dancing to' Is the Meme We Need Right Now
stefon
last night on late night
Bill Hader Says Stefon Probably Caught COVID by Now


I am a 30-something professional with a passion for traveling the world. That's me…over there to the left.
My spark for traveling the world was ignited when I was in the military and stationed overseas. I absolutely loved living in foreign countries and I tried my best to take advantage of every opportunity I had to travel somewhere new. I am no longer in the military, but that fire is still burning strong. It is my own personal mission to see and experience as many different countries and cultures as I possibly can. I have been to 38 countries (and counting…) and I am always planning my next destination!
I love to travel with my wonderful husband, family, and friends. And as a new parent, I'm committed to keeping my passion for travel a reality. I hope I can inspire you to instill wanderlust in your families too.
My travel destinations have been widely varied, ranging from relaxing beach locales to exciting outdoor adventures. Sometimes I get caught up in the touristy attractions and other times I find myself off the beaten path. On one vacation I am taking a refreshing dip in the Red Sea and on the next I am starting the 4 day hike to Machu Picchu via the Inca Trail. If I haven't been there yet, it is probably somewhere I would like go go!
Feel free to follow me as I attempt to shade in as much of this map with green as I possibly can! Have a good suggestion? Feel free to share it.
I promise we will make it out to Colorado one of these days!
Wow, thanks for the nomination Alli! I will definitely check this out.
What a lovely Blog! Thanks for liking mine too. We are both lucky with our super husbands.
Suggestions for travel deals – buy an around the word air ticket.We did. That's what we are traveling on now.
I would LOVE to do that! But how much time off is required in order to make it an enjoyable trip?
Hi Sarah, thanks so much! You can make your own travel map at http://www.travbuddy.com/. Happy Travels!
Nice blog and funny name! Thanks for liking my blog!
Hi Esme, thanks so much!
Hi Lindsay! Thanks for following my blog! How was your half-marathon? I will be running my first half-marathon in DC on March 16th. Eeeekkkk!!!
It was wonderful! I absolutley loved it. Congrats in advance on your accomplishment!!!
Thanks for stopping by my blog and liking my post on Adventures. Happy Traveling! I look forward to reading about your future adventures.
Love your map above. It's awesome. This past weekend, I sat on a Southwest flight, and their snack napkins had a map of the United States (at least the contiguous ones). So I promptly took out my pink highlighter and filled in the states I had visited. Thanks for stopping by my blog to read about my addition of yet another state this past weekend.
I definitely need to see more of the states! I am lacking in that catergory.
So good to see someone "young" taking an interest in travel. Don't wait til you're too old to get out there and see the world!
Thanks a million for the nomination Sarah. Sorry for the delay, but I will check this out ASAP!
Thanks for following my blog Cesar! I hope you are doing well. Will you be stopping by the Court anytime in the near future?
You should definitely pick up blogging again. I really wish I had started doing this a lot sooner as a way to document my travel experiences.
yeah travelling! Thanks for dropping by Honey.
Nice blog – I share your love for travel. Love the map widget… may have to steal the idea!
Steal away! Thanks for stopping by.
Dayna, thanks for stopping by.
travel to Asia someday! perhaps Indonesia, where I came from, and I can recommend you a good places to visit!
Thanks for stopping by Harry! I actually lived in Korea for 3 years (a long time ago), but I have not had a chance to blog about it yet. I would love to go back to Asia and visit more countries. It is definitely on my list!!
wow! I envy you more!
hoping to see more of your writing!
Thanks for stopping by my blog, I'll be popping back here from time to time as well.
Thanks and same to you! I have also hiked the Inca Trail. I just haven't had a chance to blog about it. I hope to do that soon.
I hope you are traveling somewhere fun! Thanks for stopping by.
My name is Asta and I work in a travel agency in Norway. I was wondering if you have an e-mail address where I could contact you?
You have put together an interesting self-psychoanalysis. Happy travels!
Thanks! It's all part of my quest to be more self-aware.
Hey Dayna! really nice blog and a WOW to your travel experiences!


text:
	- Места для высадки растений создаются заранее, чтобы не синхронизировать координаты при стриме
	- Растения могут быть размещены только в измерении Global
	- Дальность отрисовки устанавливается в CFG.graphics.herbDrawDistance и не превышает 300м
	- Растения всегда синхронизированы с сервером

	Параметры каждого растения:
	- ID позиции	(20b)	// 1,048,576 мест для роста
	- ID класса		(8b)	// 256 разновидностей растений (0 - без растения)
	- Статус роста	(4b)	// 16 статусов роста
	bitLShift( placeID, 12 ) + bitLShift( classID, 4 ) + growPhase

	Статусы роста:
	0 - нет ничего
	1-15 - в зависимости от типа растения

	Пшеница:
	1 - расток (sprout)
	2 - сажанец (verdant)
	3 - молодое растение (young)
	4 - зрелое растение (ripe)

	Для декоративных (не синхронизированных автоматически) растений используется Ornamental
--]]
--------------------------------------------------------------------------------
--<[ Модуль Herb ]>-------------------------------------------------------------
--------------------------------------------------------------------------------
Herb = {
	aliasToID = {};			-- alias класса => ID класса (создается при инициализации)

	herbs = {
		class = {};			-- ID места => ID класса растения (или 0 (!!!), если ничего не посажено)
		growPhase = {};		-- ID места => статус роста (номер growPhases)
		nextPhase = {};		-- ID места => tickCount, после которого фаза роста растения увеличится на 1, или nil

		chunk = {};			-- ID места => ID чанка (обратное herbsByChunks), static
		touched = {};		-- ID места => true / false (true, если растение вырасло/было сорвано/посажено/что-то еще)
	};

	herbsByChunks = {};		-- ID чанка => { placeID, placeID... }

	herbPlacesCount = nil;	-- Количество мест, в которых могут расти растения
	_maxGrowIterationTime = 5;	-- Время (мс), которое корутина может беспрерывно потратить раз в 50мс на обработку роста растений
	_maxClientUpdateIterationTime = 5;	-- Время (мс), которое корутина может беспрерывно потратить раз в 50мс на обработку роста растений

	init = function()
		Herb.herbPlacesCount = #ARR.herbPlaces.x

		addEventHandler( "Main.onServerLoad", root, Herb.onServerLoad )
		addEventHandler( "onResourceStop", resourceRoot, Herb.save )

		Debug.info( "Loaded " .. Herb.herbPlacesCount .. " herb places" )
	end;

	onServerLoad = function()
		-- Создаем массив herbClassAlias => herbClassID для удобства (чтобы не указывать типы растений в ID)
		for classID, classData in pairs( ARR.herbClasses ) do
			Herb.aliasToID[ classData.alias ] = classID
		end

		-- Инициализируем herbsByChunks
		Herb.herbsByChunks = Chunk.prepareArray()

		-- Инициируем массив растений
		for herbID = 1, Herb.herbPlacesCount do
			Herb.herbs.growPhase[ herbID ] = 0
			Herb.herbs.class[ herbID ] = 0

			local chunkID = Chunk.getID( ARR.herbPlaces.x[ herbID ], ARR.herbPlaces.y[ herbID ] )
			if ( chunkID == nil ) then
				Debug.error( "Herb place " .. herbID .. " is out of chunk stream box" )
			else
				Herb.herbs.chunk[ herbID ] = chunkID
				table.insert( Herb.herbsByChunks[ chunkID ], herbID )
			end
		end

		-- Загружаем данные о посаженных растениях
		if ( fileExists( "server/data/herb/herbs.dat" ) ) then
			-- Из файла
			local data = fileGetContents( "server/data/herb/herbs.dat" )
			local items = explode( ",", data )

			local herbID, herbClass, growPhase

			for _, herbData in pairs( items ) do
				herbID = bitAnd( bitRShift( herbData, 12 ), 0xFFFFF )
				herbClass = bitAnd( bitRShift( herbData, 4 ), 0xFF )
				growPhase = bitAnd( herbData, 0xF )

				Herb.set( herbID, herbClass, growPhase )
			end
		else
			-- Генерируем
			for herbID = 1, Herb.herbPlacesCount do
				Herb.set( herbID, 1, 1 )
			end
		end

		-- Обрабатываем рост растений
		local growHandlerCoroutine = coroutine.create( Herb._growHandlerCoroutine )
		setTimer( function()
			coroutine.resume( growHandlerCoroutine, getTickCount() )
		end, 50, 0 )

		-- При стриме чанков игроками, отправляем сразу весь чанк
		addEventHandler( "Chunk.onStreamIn", resourceRoot, Herb.onPlayerStreamInChunk )

		-- Обрабатываем стриминг игроков
		local clientUpdaterCoroutine = coroutine.create( Herb._clientUpdaterCoroutine )
		setTimer( function()
			coroutine.resume( clientUpdaterCoroutine, getTickCount() )
		end, 50, 0 )

		-- Периодически сохраняем растения
		setTimer( Herb.save, 5 * 60 * 1000, 0 )

		-- Автоматически высаживаем растения (на время теста)
		setTimer( function()
			for herbID, herbClassID in pairs( Herb.herbs.class ) do
				if ( herbClassID == 0 ) then
					Herb.set( herbID, 1, 1 )
				end
			end
		end, 1000 * 60 * 5, 0 )

		Debug.info( "Herb loaded" )
	end;

	-- Сохраняет данные о растениях в файл, чтобы позже можно было загрузить их заново
	-- = void
	save = function()
		local packed = {}
		for herbID, herbClassID in pairs( Herb.herbs.class ) do
			packed[ #packed + 1 ] = bitLShift( herbID, 12 ) + bitLShift( herbClassID, 4 ) + Herb.herbs.growPhase[ herbID ]
		end

		local s = table.concat( packed, "," )
		if ( s:len() > 0 ) then
			local f = fileCreate( "server/data/herb/herbs.dat" )
			fileWrite( f, s )
			fileClose( f )
		else
			Debug.error( "Can't save herb database" )
		end
	end;

	-- Возвращает true, если такое место для растения существует
	-- > herbID number
	-- = bool exists
	exists = function( herbID )
		return Herb.herbs.class[ herbID ] ~= nil
	end;

	-- Возвращает информацию о растении
	-- > herbID number
	-- = number herbClassID, number growPhase, number nextPhaseTickCount, number chunkID
	getInfo = function( herbID )
		if not validVar( herbID, "herbID", "number" ) then return nil end

		if ( Herb.herbs.class[ herbID ] ~= nil ) then
			return Herb.herbs.class[ herbID ], Herb.herbs.growPhase[ herbID ], Herb.herbs.nextPhase[ herbID ], Herb.herbs.chunk[ herbID ]
		else
			-- Растение не существует
			return nil
		end
	end;

	-- Возвращает позицию растения
	-- > herbID number
	-- = number x, number y, number z
	getPos = function( herbID )
		return ARR.herbPlaces.x[ herbID ], ARR.herbPlaces.y[ herbID ], ARR.herbPlaces.z[ herbID ]
	end;

	-- Установить растение
	-- Устанавливает следующий tickCount новой фазы роста (если текущая не последняя) и отмечает растение измененным (добавляет в очередь на синхронизацию)
	-- > herbID number - номер места роста растения
	-- > classID number / nil (или 0) - класс растения или nil (0), если нужно убрать растение
	-- > growPhase number - номер фазы роста растения (1-15). Если растения до этого не было, будет установлена первая фаза. Если фаза больше, чем максимальная фаза класса, будет установлена максимальная (т.е. фаза 15 всегда создаст полностью зрелое растение)
	-- > growPhaseTicks number / nil - если указано, будет считаться, что растение уже провело growPhaseTicks мс. в этой фазе роста
	-- = void
	set = function( herbID, classID, growPhase, growPhaseTicks )
		if ( Herb.herbs.class[ herbID ] == nil ) then
			Debug.error( "Herb place " .. tostring( herbID ) .. " not exists" )

			return nil
		end

		if ( classID == nil or classID == 0 ) then
			-- Убираем растение
			Herb.herbs.class[ herbID ] = 0
			Herb.herbs.growPhase[ herbID ] = 0
			Herb.herbs.nextPhase[ herbID ] = nil
		else
			-- Устанавливаем растение
			if ( ARR.herbClasses[ classID ] == nil ) then
				Debug.error( "Herb class " .. tostring( classID ) .. " not exists" )

				return nil
			end

			if ( growPhase < 1 or growPhase > 15 ) then
				Debug.error( "Herb grow phase " .. tostring( growPhase ) .. " is out of bounds" )

				return nil
			end

			if ( growPhaseTicks == nil or growPhaseTicks < 0 ) then
				growPhaseTicks = 0
			end

			if ( growPhase > #ARR.herbClasses[ classID ].growPhases ) then
				growPhase = #ARR.herbClasses[ classID ].growPhases
			end

			Herb.herbs.class[ herbID ] = classID
			Herb.herbs.growPhase[ herbID ] = growPhase

			if ( ARR.herbClasses[ classID ].growPhases[ growPhase ].growTime == nil ) then
				Herb.herbs.nextPhase[ herbID ] = nil
			else
				Herb.herbs.nextPhase[ herbID ] = getTickCount() + ( ARR.herbClasses[ classID ].growPhases[ growPhase ].growTime() - growPhaseTicks )
			end
		end

		Herb.herbs.touched[ herbID ] = true
	end;

	-- Отправить игроку информацию о целом чанке
	-- > playerElement player
	-- > chunkID number - номер чанка, который нужно отправить игроку
	-- = void
	updateClientChunk = function( playerElement, chunkID )
		if ( #Herb.herbsByChunks[ chunkID ] ~= nil ) then
			-- В этом чанке есть растения
			Herb.updateClientHerbs( playerElement, Herb.herbsByChunks[ chunkID ] )
		end
	end;

	-- Отправить игроку информацию об указанных местах роста
	-- > playerElement player
	-- > herbPlacesArray table - массив номеров мест роста { placeID, placeID, ... }
	-- = void
	updateClientHerbs = function( playerElement, herbPlacesArray )
		local packedPlaces = {}
		for _, herbID in pairs( herbPlacesArray ) do
			packedPlaces[ #packedPlaces + 1 ] = bitLShift( herbID, 12 ) + bitLShift( Herb.herbs.class[ herbID ], 4 ) + Herb.herbs.growPhase[ herbID ]
		end

		triggerClientEvent( playerElement, "Herb.onHerbsUpdate", resourceRoot, packedPlaces )
	end;

	-- Отвечает за обработку роста растений
	-- iterTick - tickCount начала итерации
	_growHandlerCoroutine = function( iterTick )
		while ( true ) do

			for herbID = 1, Herb.herbPlacesCount do
				if ( Herb.herbs.nextPhase[ herbID ] ~= nil and Herb.herbs.nextPhase[ herbID ] < iterTick ) then
					-- Выросло
					Herb.set( herbID, Herb.herbs.class[ herbID ], Herb.herbs.growPhase[ herbID ] + 1, iterTick - Herb.herbs.nextPhase[ herbID ] )
					--Debug.info( iterTick )
				end

				if ( herbID % 200 == 0 ) then
					if ( getTickCount() - iterTick > Herb._maxGrowIterationTime ) then
						iterTick = coroutine.yield()
					end
				end
			end

			iterTick = coroutine.yield()
		end
	end;

	-- Отвечает за синхронизацию измененных растений с клиентами
	-- Сначала при изменении растение отмечается как touched
	-- Затем корутина проходит по всем растениям, собирает по чанкам растения,
	-- которые были изменены, и отправляет игрокам, у которых эти чанки загружены
	_clientUpdaterCoroutine = function( iterTick )
		while ( true ) do
			local touchedHerbs = {}

			-- Собираем все растения, которые были имзенены
			for herbID = 1, Herb.herbPlacesCount do
				if ( Herb.herbs.touched[ herbID ] == true ) then
					touchedHerbs[ #touchedHerbs + 1 ] = herbID
					Herb.herbs.touched[ herbID ] = false
				end
			end

			iterTick = coroutine.yield()

			if ( #touchedHerbs ~= 0 ) then
				-- Хоть одно растение изменилось
				--Debug.info( #touchedHerbs )

				-- Разбиваем их по чанкам и сразу пакуем для отправки
				local touchedByChunks = {}
				for _, herbID in pairs( touchedHerbs ) do
					if ( touchedByChunks[ Herb.herbs.chunk[ herbID ] ] == nil ) then
						touchedByChunks[ Herb.herbs.chunk[ herbID ] ] = {}
					end

					table.insert( touchedByChunks[ Herb.herbs.chunk[ herbID ] ], bitLShift( herbID, 12 ) + bitLShift( Herb.herbs.class[ herbID ], 4 ) + Herb.herbs.growPhase[ herbID ] )
				end

				iterTick = coroutine.yield()

				-- Отправляем игрокам, которые застримили чанки
				for _, playerElement in pairs( Main.loadedPlayers ) do
					if ( Chunk.streamedInChunks[ playerElement ] ~= nil ) then
						-- У игрока загружены чанки
						local dataForPlayer = {}

						for stremaedChunkID in pairs( Chunk.streamedInChunks[ playerElement ] ) do
							if ( touchedByChunks[ stremaedChunkID ] ~= nil ) then
								-- Игрок стримит чанк, в котором изменены растения
								for _, herbData in pairs( touchedByChunks[ stremaedChunkID ] ) do
									dataForPlayer[ #dataForPlayer + 1 ] = herbData
								end
							end
						end

						if ( #dataForPlayer ~= 0 ) then
							-- Есть что отправлять игроку
							triggerClientEvent( playerElement, "Herb.onHerbsUpdate", resourceRoot, dataForPlayer )
						end

						if ( getTickCount() - iterTick > Herb._maxClientUpdateIterationTime ) then
							iterTick = coroutine.yield()
						end
					end
				end

				iterTick = coroutine.yield()
			end
		end
	end;

	----------------------------------------------------------------------------
	--<[ Обработчики событий ]>-------------------------------------------------
	----------------------------------------------------------------------------

	-- Игрок застримил какой-то чанк
	onPlayerStreamInChunk = function( playerElement, chunkID )
		--Debug.info( "Player streamed in chunk " .. chunkID .. " " .. dumpvar( Chunk.chunks[ chunkID ] ) )
		if ( getElementType( playerElement ) == "player" ) then
			if ( #Herb.herbsByChunks[ chunkID ] ~= 0 ) then
				-- В этом чанке есть растения
				Herb.updateClientChunk( playerElement, chunkID )
			end
		end
	end;
};
addEventHandler( "onResourceStart", resourceRoot, Herb.init )

redpajama_set_name: RedPajamaGithub


The hexadecimal #1ae61a color RGB value is (26, 230, 26). The complement color is #e61ae6. The CMYK color model (used in color printing) for #1ae61a is 89% cyan, 0% magenta, 89% yellow and 10% black. The decimal value of this color is 1762842. Closest web safe color is: #33ff33.
Below, the color conversion values related to the color #1ae61a are specified in detail.
Below you can see compatible color combinations for #1ae61a.
Below you can see lighter and darker shades of #1ae61a.
Below you can see alternatives to #1ae61a.
Below you can see compatible color blindless simulator for #1ae61a.